summaryrefslogtreecommitdiff
path: root/libs/ardour/ardour
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ardour/ardour')
-rw-r--r--libs/ardour/ardour/session.h184
-rw-r--r--libs/ardour/ardour/slave.h50
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;