diff options
Diffstat (limited to 'libs/ardour/ardour')
-rw-r--r-- | libs/ardour/ardour/session.h | 184 | ||||
-rw-r--r-- | libs/ardour/ardour/slave.h | 50 |
2 files changed, 121 insertions, 113 deletions
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 3a980982c3..6ac36f98b6 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -132,8 +132,8 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable Recording = 2 }; - struct Event { - enum Type { + struct Event { + enum Type { SetTransportSpeed, SetDiskstreamSpeed, Locate, @@ -148,78 +148,82 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable SetSlaveSource, Audition, InputConfigurationChange, - SetAudioRange, - SetPlayRange, - + SetPlayAudioRange, + /* only one of each of these events can be queued at any one time */ - + StopOnce, AutoLoop }; - - enum Action { - Add, - Remove, - Replace, - Clear - }; - - Type type; - Action action; - nframes_t action_frame; - nframes_t target_frame; - double speed; - - union { - void* ptr; - bool yes_or_no; - nframes_t target2_frame; - SlaveSource slave; - Route* route; - }; - - std::list<AudioRange> audio_range; - std::list<MusicRange> music_range; - - boost::shared_ptr<Region> region; - - Event(Type t, Action a, nframes_t when, nframes_t where, double spd, bool yn = false) + + enum Action { + Add, + Remove, + Replace, + Clear + }; + + Type type; + Action action; + nframes64_t action_frame; + nframes64_t target_frame; + double speed; + + union { + void* ptr; + bool yes_or_no; + nframes64_t target2_frame; + SlaveSource slave; + Route* route; + }; + + union { + bool second_yes_or_no; + }; + + std::list<AudioRange> audio_range; + std::list<MusicRange> music_range; + + boost::shared_ptr<Region> region; + + Event(Type t, Action a, nframes_t when, nframes_t where, double spd, bool yn = false, bool yn2 = false) : type (t) , action (a) , action_frame (when) , target_frame (where) , speed (spd) , yes_or_no (yn) + , second_yes_or_no (yn2) {} - void set_ptr (void* p) { - ptr = p; - } - - bool before (const Event& other) const { - return action_frame < other.action_frame; - } - - bool after (const Event& other) const { - return action_frame > other.action_frame; - } - - static bool compare (const Event *e1, const Event *e2) { - return e1->before (*e2); - } - - void *operator new (size_t) { - return pool.alloc (); - } - - void operator delete (void *ptr, size_t /*size*/) { - pool.release (ptr); - } - - static const nframes_t Immediate = 0; - - private: - static MultiAllocSingleReleasePool pool; + void set_ptr (void* p) { + ptr = p; + } + + bool before (const Event& other) const { + return action_frame < other.action_frame; + } + + bool after (const Event& other) const { + return action_frame > other.action_frame; + } + + static bool compare (const Event *e1, const Event *e2) { + return e1->before (*e2); + } + + void *operator new (size_t) { + return pool.alloc (); + } + + void operator delete (void *ptr, size_t /*size*/) { + pool.release (ptr); + } + + static const nframes_t Immediate = 0; + + private: + static MultiAllocSingleReleasePool pool; }; /* creating from an XML file */ @@ -375,9 +379,9 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable /* Transport mechanism signals */ sigc::signal<void> TransportStateChange; /* generic */ - sigc::signal<void,nframes_t> PositionChanged; /* sent after any non-sequential motion */ + sigc::signal<void,nframes64_t> PositionChanged; /* sent after any non-sequential motion */ sigc::signal<void> DurationChanged; - sigc::signal<void,nframes_t> Xrun; + sigc::signal<void,nframes64_t> Xrun; sigc::signal<void> TransportLooped; /** emitted when a locate has occurred */ @@ -388,7 +392,7 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable void request_roll_at_and_return (nframes_t start, nframes_t return_to); void request_bounded_roll (nframes_t start, nframes_t end); - void request_stop (bool abort = false); + void request_stop (bool abort = false, bool clear_state = false); void request_locate (nframes_t frame, bool with_roll = false); void request_play_loop (bool yn, bool leave_rolling = false); @@ -406,7 +410,7 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable void request_diskstream_speed (Diskstream&, double speed); void request_input_change_handling (); - bool locate_pending() const { return static_cast<bool>(post_transport_work&PostTransportLocate); } + bool locate_pending() const { return static_cast<bool>(post_transport_work()&PostTransportLocate); } bool transport_locked () const; int wipe (); @@ -533,8 +537,8 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable /* Time */ - nframes_t transport_frame () const {return _transport_frame; } - nframes_t audible_frame () const; + nframes64_t transport_frame () const {return _transport_frame; } + nframes64_t audible_frame () const; nframes64_t requested_return_frame() const { return _requested_return_frame; } enum PullupFormat { @@ -914,10 +918,7 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable /* ranges */ - void set_audio_range (std::list<AudioRange>&); - void set_music_range (std::list<MusicRange>&); - - void request_play_range (bool yn, bool leave_rolling = false); + void request_play_range (std::list<AudioRange>*, bool leave_rolling = false); bool get_play_range () const { return _play_range; } /* buffers for gain and pan */ @@ -997,7 +998,7 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable nframes_t _nominal_frame_rate; //ignores audioengine setting, "native" SR int transport_sub_state; mutable gint _record_status; - volatile nframes_t _transport_frame; + volatile nframes64_t _transport_frame; Location* end_location; Location* start_location; Slave* _slave; @@ -1010,7 +1011,7 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable CubicInterpolation interpolation; bool auto_play_legal; - nframes_t _last_slave_transport_frame; + nframes64_t _last_slave_transport_frame; nframes_t maximum_output_latency; volatile nframes64_t _requested_return_frame; BufferSet* _scratch_buffers; @@ -1026,6 +1027,7 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable bool _non_soloed_outs_muted; uint32_t _listen_cnt; bool _writable; + bool _was_seamless; void set_worst_io_latencies (); void set_worst_io_latencies_x (IOChange, void *) { @@ -1180,7 +1182,8 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable PostTransportScrub = 0x8000, PostTransportReverse = 0x10000, PostTransportInputChange = 0x20000, - PostTransportCurveRealloc = 0x40000 + PostTransportCurveRealloc = 0x40000, + PostTransportClearSubstate = 0x80000 }; static const PostTransportWork ProcessCannotProceedMask = @@ -1192,9 +1195,13 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable PostTransportScrub| PostTransportAudition| PostTransportLocate| - PostTransportStop); + PostTransportStop| + PostTransportClearSubstate); - PostTransportWork post_transport_work; + gint _post_transport_work; /* accessed only atomic ops */ + PostTransportWork post_transport_work() const { return (PostTransportWork) g_atomic_int_get (&_post_transport_work); } + void set_post_transport_work (PostTransportWork ptw) { g_atomic_int_set (&_post_transport_work, (gint) ptw); } + void add_post_transport_work (PostTransportWork ptw); uint32_t cumulative_rf_motion; uint32_t rf_scale; @@ -1337,8 +1344,8 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable int no_roll (nframes_t nframes); int fail_roll (nframes_t nframes); - bool non_realtime_work_pending() const { return static_cast<bool>(post_transport_work); } - bool process_can_proceed() const { return !(post_transport_work & ProcessCannotProceedMask); } + bool non_realtime_work_pending() const { return static_cast<bool>(post_transport_work()); } + bool process_can_proceed() const { return !(post_transport_work() & ProcessCannotProceedMask); } struct MIDIRequest { enum Type { @@ -1361,18 +1368,19 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable void change_midi_ports (); int use_config_midi_ports (); - void set_play_loop (bool yn, bool leave_rolling); + void set_play_loop (bool yn); + void unset_play_loop (); void overwrite_some_buffers (Diskstream*); void flush_all_inserts (); int micro_locate (nframes_t distance); - void locate (nframes_t, bool with_roll, bool with_flush, bool with_loop=false); - void start_locate (nframes_t, bool with_roll, bool with_flush, bool with_loop=false); - void force_locate (nframes_t frame, bool with_roll = false); + void locate (nframes64_t, bool with_roll, bool with_flush, bool with_loop=false, bool force=false); + void start_locate (nframes64_t, bool with_roll, bool with_flush, bool with_loop=false, bool force=false); + void force_locate (nframes64_t frame, bool with_roll = false); void set_diskstream_speed (Diskstream*, double speed); - void set_transport_speed (double speed, bool abort = false); - void stop_transport (bool abort = false); + void set_transport_speed (double speed, bool abort = false, bool clear_state = false); + void stop_transport (bool abort = false, bool clear_state = false); void start_transport (); - void realtime_stop (bool abort); + void realtime_stop (bool abort, bool clear_state); void non_realtime_start_scrub (); void non_realtime_set_speed (); void non_realtime_locate (); @@ -1619,8 +1627,8 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable std::list<AudioRange> current_audio_range; bool _play_range; - void set_play_range (bool yn, bool leave_rolling); - void setup_auto_play (); + void set_play_range (std::list<AudioRange>&, bool leave_rolling); + void unset_play_range (); /* main outs */ uint32_t main_outs; diff --git a/libs/ardour/ardour/slave.h b/libs/ardour/ardour/slave.h index 0f005d6f1b..9036c97a27 100644 --- a/libs/ardour/ardour/slave.h +++ b/libs/ardour/ardour/slave.h @@ -107,7 +107,7 @@ class Slave { * @param position - The transport position requested * @return - The return value is currently ignored (see Session::follow_slave) */ - virtual bool speed_and_position (double& speed, nframes_t& position) = 0; + virtual bool speed_and_position (double& speed, nframes64_t& position) = 0; /** * reports to ARDOUR whether the Slave is currently synced to its external @@ -161,13 +161,13 @@ class Slave { class ISlaveSessionProxy { public: virtual TempoMap& tempo_map() const { return *((TempoMap *) 0); } - virtual nframes_t frame_rate() const { return 0; } - virtual nframes_t audible_frame () const { return 0; } - virtual nframes_t transport_frame () const { return 0; } - virtual nframes_t frames_since_cycle_start () const { return 0; } - virtual nframes_t frame_time () const { return 0; } + virtual nframes_t frame_rate() const { return 0; } + virtual nframes64_t audible_frame () const { return 0; } + virtual nframes64_t transport_frame () const { return 0; } + virtual nframes_t frames_since_cycle_start () const { return 0; } + virtual nframes64_t frame_time () const { return 0; } - virtual void request_locate (nframes_t /*frame*/, bool with_roll = false) { + virtual void request_locate (nframes64_t /*frame*/, bool with_roll = false) { (void) with_roll; } virtual void request_transport_speed (double /*speed*/) {} @@ -181,14 +181,14 @@ class SlaveSessionProxy : public ISlaveSessionProxy { public: SlaveSessionProxy(Session &s) : session(s) {} - TempoMap& tempo_map() const; - nframes_t frame_rate() const; - nframes_t audible_frame () const; - nframes_t transport_frame () const; - nframes_t frames_since_cycle_start () const; - nframes_t frame_time () const; + TempoMap& tempo_map() const; + nframes_t frame_rate() const; + nframes64_t audible_frame () const; + nframes64_t transport_frame () const; + nframes_t frames_since_cycle_start () const; + nframes64_t frame_time () const; - void request_locate (nframes_t frame, bool with_roll = false); + void request_locate (nframes64_t frame, bool with_roll = false); void request_transport_speed (double speed); }; @@ -211,7 +211,7 @@ class MTC_Slave : public Slave, public sigc::trackable { ~MTC_Slave (); void rebind (MIDI::Port&); - bool speed_and_position (double&, nframes_t&); + bool speed_and_position (double&, nframes64_t&); bool locked() const; bool ok() const; @@ -256,7 +256,7 @@ class MIDIClock_Slave : public Slave, public sigc::trackable { ~MIDIClock_Slave (); void rebind (MIDI::Port&); - bool speed_and_position (double&, nframes_t&); + bool speed_and_position (double&, nframes64_t&); bool locked() const; bool ok() const; @@ -311,17 +311,17 @@ class MIDIClock_Slave : public Slave, public sigc::trackable { double b, c, omega; void reset (); - void start (MIDI::Parser& parser, nframes_t timestamp); - void contineu (MIDI::Parser& parser, nframes_t timestamp); - void stop (MIDI::Parser& parser, nframes_t timestamp); + void start (MIDI::Parser& parser, nframes64_t timestamp); + void contineu (MIDI::Parser& parser, nframes64_t timestamp); + void stop (MIDI::Parser& parser, nframes64_t timestamp); void position (MIDI::Parser& parser, MIDI::byte* message, size_t size); // we can't use continue because it is a C++ keyword - void calculate_one_ppqn_in_frames_at(nframes_t time); - nframes_t calculate_song_position(uint16_t song_position_in_sixteenth_notes); + void calculate_one_ppqn_in_frames_at(nframes64_t time); + nframes64_t calculate_song_position(uint16_t song_position_in_sixteenth_notes); void calculate_filter_coefficients(); - void update_midi_clock (MIDI::Parser& parser, nframes_t timestamp); + void update_midi_clock (MIDI::Parser& parser, nframes64_t timestamp); void read_current (SafeTime *) const; - bool stop_if_no_more_clock_events(nframes_t& pos, nframes_t now); + bool stop_if_no_more_clock_events(nframes64_t& pos, nframes64_t now); /// whether transport should be rolling bool _started; @@ -337,7 +337,7 @@ class ADAT_Slave : public Slave ADAT_Slave () {} ~ADAT_Slave () {} - bool speed_and_position (double& speed, nframes_t& pos) { + bool speed_and_position (double& speed, nframes64_t& pos) { speed = 0; pos = 0; return false; @@ -355,7 +355,7 @@ class JACK_Slave : public Slave JACK_Slave (jack_client_t*); ~JACK_Slave (); - bool speed_and_position (double& speed, nframes_t& pos); + bool speed_and_position (double& speed, nframes64_t& pos); bool starting() const { return _starting; } bool locked() const; |