ardour
location.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2000 Paul Davis
3 
4  This program is free software; you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation; either version 2 of the License, or
7  (at your option) any later version.
8 
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License
15  along with this program; if not, write to the Free Software
16  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 
18 */
19 
20 #ifndef __ardour_location_h__
21 #define __ardour_location_h__
22 
23 #include <string>
24 #include <list>
25 #include <iostream>
26 #include <map>
27 
28 #include <sys/types.h>
29 
30 #include <glibmm/threads.h>
31 
32 #include "pbd/undo.h"
33 #include "pbd/stateful.h"
35 
36 #include "ardour/ardour.h"
37 #include "ardour/scene_change.h"
38 #include "ardour/session_handle.h"
39 
40 namespace ARDOUR {
41 
42 class SceneChange;
43 
45 {
46  public:
47  enum Flags {
48  IsMark = 0x1,
49  IsAutoPunch = 0x2,
50  IsAutoLoop = 0x4,
51  IsHidden = 0x8,
52  IsCDMarker = 0x10,
53  IsRangeMarker = 0x20,
54  IsSessionRange = 0x40,
55  IsSkip = 0x80,
56  IsSkipping = 0x100, /* skipping is active (or not) */
57  };
58 
59  Location (Session &);
60  Location (Session &, framepos_t, framepos_t, const std::string &, Flags bits = Flags(0));
61  Location (const Location& other);
62  Location (Session &, const XMLNode&);
63  Location* operator= (const Location& other);
64 
65  bool operator==(const Location& other);
66 
67  bool locked() const { return _locked; }
68  void lock ();
69  void unlock ();
70 
71  framepos_t start() const { return _start; }
72  framepos_t end() const { return _end; }
73  framecnt_t length() const { return _end - _start; }
74 
75  int set_start (framepos_t s, bool force = false, bool allow_bbt_recompute = true);
76  int set_end (framepos_t e, bool force = false, bool allow_bbt_recompute = true);
77  int set (framepos_t start, framepos_t end, bool allow_bbt_recompute = true);
78 
79  int move_to (framepos_t pos);
80 
81  const std::string& name() const { return _name; }
82  void set_name (const std::string &str);
83 
84  void set_auto_punch (bool yn, void *src);
85  void set_auto_loop (bool yn, void *src);
86  void set_hidden (bool yn, void *src);
87  void set_cd (bool yn, void *src);
88  void set_is_range_marker (bool yn, void* src);
89  void set_skip (bool yn);
90  void set_skipping (bool yn);
91 
92  bool is_auto_punch () const { return _flags & IsAutoPunch; }
93  bool is_auto_loop () const { return _flags & IsAutoLoop; }
94  bool is_mark () const { return _flags & IsMark; }
95  bool is_hidden () const { return _flags & IsHidden; }
96  bool is_cd_marker () const { return _flags & IsCDMarker; }
97  bool is_session_range () const { return _flags & IsSessionRange; }
98  bool is_range_marker() const { return _flags & IsRangeMarker; }
99  bool is_skip() const { return _flags & IsSkip; }
100  bool is_skipping() const { return (_flags & IsSkip) && (_flags & IsSkipping); }
101  bool matches (Flags f) const { return _flags & f; }
102 
103  Flags flags () const { return _flags; }
104 
105  boost::shared_ptr<SceneChange> scene_change() const { return _scene_change; }
106  void set_scene_change (boost::shared_ptr<SceneChange>);
107 
108  /* these are static signals for objects that want to listen to all
109  locations at once.
110  */
111 
112  static PBD::Signal1<void,Location*> name_changed;
113  static PBD::Signal1<void,Location*> end_changed;
114  static PBD::Signal1<void,Location*> start_changed;
115  static PBD::Signal1<void,Location*> flags_changed;
116  static PBD::Signal1<void,Location*> lock_changed;
117  static PBD::Signal1<void,Location*> position_lock_style_changed;
118 
119  /* this is sent only when both start and end change at the same time */
120  static PBD::Signal1<void,Location*> changed;
121 
122  /* these are member signals for objects that care only about
123  changes to this object
124  */
125 
126  PBD::Signal0<void> NameChanged;
127  PBD::Signal0<void> EndChanged;
128  PBD::Signal0<void> StartChanged;
129  PBD::Signal0<void> Changed;
130  PBD::Signal0<void> FlagsChanged;
131  PBD::Signal0<void> LockChanged;
132  PBD::Signal0<void> PositionLockStyleChanged;
133 
134  /* CD Track / CD-Text info */
135 
136  std::map<std::string, std::string> cd_info;
137  XMLNode& cd_info_node (const std::string &, const std::string &);
138 
139  XMLNode& get_state (void);
140  int set_state (const XMLNode&, int version);
141 
142  PositionLockStyle position_lock_style() const { return _position_lock_style; }
143  void set_position_lock_style (PositionLockStyle ps);
144  void recompute_frames_from_bbt ();
145 
146  static PBD::Signal0<void> scene_changed;
147 
148  private:
149  std::string _name;
151  Timecode::BBT_Time _bbt_start;
153  Timecode::BBT_Time _bbt_end;
155  bool _locked;
158 
159  void set_mark (bool yn);
160  bool set_flag_internal (bool yn, Flags flag);
161  void recompute_bbt_from_frames ();
162 };
163 
165 {
166  public:
167  typedef std::list<Location *> LocationList;
168 
169  Locations (Session &);
170  ~Locations ();
171 
172  const LocationList& list() { return locations; }
173 
174  void add (Location *, bool make_current = false);
175  void remove (Location *);
176  void clear ();
177  void clear_markers ();
178  void clear_ranges ();
179 
180  XMLNode& get_state (void);
181  int set_state (const XMLNode&, int version);
182  Location *get_location_by_id(PBD::ID);
183 
184  Location* auto_loop_location () const;
185  Location* auto_punch_location () const;
186  Location* session_range_location() const;
187 
188  int next_available_name(std::string& result,std::string base);
189  uint32_t num_range_markers() const;
190 
191  int set_current (Location *, bool want_lock = true);
192  Location *current () const { return current_location; }
193 
194  Location* mark_at (framepos_t, framecnt_t slop = 0) const;
195 
196  framepos_t first_mark_before (framepos_t, bool include_special_ranges = false);
197  framepos_t first_mark_after (framepos_t, bool include_special_ranges = false);
198 
199  void marks_either_side (framepos_t const, framepos_t &, framepos_t &) const;
200 
201  void find_all_between (framepos_t start, framepos_t, LocationList&, Location::Flags);
202 
203  PBD::Signal1<void,Location*> current_changed;
204 
205  /* Objects that care about individual addition and removal of Locations should connect to added/removed.
206  If an object additionally cares about potential mass clearance of Locations, they should connect to changed.
207  */
208 
209  PBD::Signal1<void,Location*> added;
210  PBD::Signal1<void,Location*> removed;
211  PBD::Signal0<void> changed; /* emitted when any action that could have added/removed more than 1 location actually removed 1 or more */
212 
213  template<class T> void apply (T& obj, void (T::*method)(const LocationList&)) const {
214  /* We don't want to hold the lock while the given method runs, so take a copy
215  of the list and pass that instead.
216  */
218  {
219  Glib::Threads::Mutex::Lock lm (lock);
220  copy = locations;
221  }
222  (obj.*method)(copy);
223  }
224 
225  private:
226 
227  LocationList locations;
229  mutable Glib::Threads::Mutex lock;
230 
231  int set_current_unlocked (Location *);
232  void location_changed (Location*);
233  void listen_to (Location*);
234 };
235 
236 } // namespace ARDOUR
237 
238 #endif /* __ardour_location_h__ */
static PBD::Signal1< void, Location * > start_changed
Definition: location.h:114
Location * current_location
Definition: location.h:228
static PBD::Signal0< void > scene_changed
Definition: location.h:146
PBD::Signal1< void, Location * > current_changed
Definition: location.h:203
static PBD::Signal1< void, Location * > end_changed
Definition: location.h:113
bool is_skip() const
Definition: location.h:99
std::list< Location * > LocationList
Definition: location.h:167
bool is_skipping() const
Definition: location.h:100
PBD::Signal1< void, Location * > added
Definition: location.h:209
boost::shared_ptr< SceneChange > _scene_change
Definition: location.h:157
bool matches(Flags f) const
Definition: location.h:101
PBD::Signal0< void > LockChanged
Definition: location.h:131
PositionLockStyle _position_lock_style
Definition: location.h:156
static PBD::Signal1< void, Location * > changed
Definition: location.h:120
tuple f
Definition: signals.py:35
Timecode::BBT_Time _bbt_end
Definition: location.h:153
framepos_t end() const
Definition: location.h:72
static PBD::Signal1< void, Location * > position_lock_style_changed
Definition: location.h:117
bool is_cd_marker() const
Definition: location.h:96
LIBARDOUR_API PBD::PropertyDescriptor< framepos_t > start
Definition: region.cc:63
bool is_hidden() const
Definition: location.h:95
bool is_session_range() const
Definition: location.h:97
Definition: id.h:32
boost::shared_ptr< SceneChange > scene_change() const
Definition: location.h:105
Location * current() const
Definition: location.h:192
PositionLockStyle position_lock_style() const
Definition: location.h:142
Timecode::BBT_Time _bbt_start
Definition: location.h:151
int64_t framecnt_t
Definition: types.h:76
PBD::Signal0< void > PositionLockStyleChanged
Definition: location.h:132
std::map< std::string, std::string > cd_info
Definition: location.h:136
bool is_auto_punch() const
Definition: location.h:92
PBD::Signal1< void, Location * > removed
Definition: location.h:210
PBD::Signal0< void > FlagsChanged
Definition: location.h:130
const LocationList & list()
Definition: location.h:172
Definition: amp.h:29
bool locked() const
Definition: location.h:67
framepos_t _start
Definition: location.h:150
Flags flags() const
Definition: location.h:103
int64_t framepos_t
Definition: types.h:66
PBD::Signal0< void > NameChanged
Definition: location.h:126
bool is_mark() const
Definition: location.h:94
#define LIBARDOUR_API
const std::string & name() const
Definition: location.h:81
Definition: xml++.h:95
static PBD::Signal1< void, Location * > flags_changed
Definition: location.h:115
std::string _name
Definition: location.h:149
bool operator==(const RouteProcessorSelection &a, const RouteProcessorSelection &b)
framecnt_t length() const
Definition: location.h:73
PBD::Signal0< void > EndChanged
Definition: location.h:127
framepos_t _end
Definition: location.h:152
static PBD::Signal1< void, Location * > lock_changed
Definition: location.h:116
PBD::Signal0< void > StartChanged
Definition: location.h:128
framepos_t start() const
Definition: location.h:71
PositionLockStyle
Definition: types.h:553
bool is_range_marker() const
Definition: location.h:98
static PBD::Signal1< void, Location * > name_changed
Definition: location.h:112
LocationList locations
Definition: location.h:227
bool is_auto_loop() const
Definition: location.h:93
Glib::Threads::Mutex lock
Definition: location.h:229
void apply(T &obj, void(T::*method)(const LocationList &)) const
Definition: location.h:213
PBD::Signal0< void > changed
Definition: location.h:211
PBD::Signal0< void > Changed
Definition: location.h:129