diff options
-rw-r--r-- | libs/ardour/ardour/disk_io.h | 5 | ||||
-rw-r--r-- | libs/ardour/ardour/disk_reader.h | 1 | ||||
-rw-r--r-- | libs/ardour/ardour/session.h | 2 | ||||
-rw-r--r-- | libs/ardour/ardour/session_event.h | 1 | ||||
-rw-r--r-- | libs/ardour/ardour/track.h | 4 | ||||
-rw-r--r-- | libs/ardour/disk_io.cc | 40 | ||||
-rw-r--r-- | libs/ardour/disk_reader.cc | 54 | ||||
-rw-r--r-- | libs/ardour/disk_writer.cc | 2 | ||||
-rw-r--r-- | libs/ardour/enums.cc | 1 | ||||
-rw-r--r-- | libs/ardour/session_process.cc | 4 | ||||
-rw-r--r-- | libs/ardour/session_transport.cc | 26 | ||||
-rw-r--r-- | libs/ardour/track.cc | 10 |
12 files changed, 45 insertions, 105 deletions
diff --git a/libs/ardour/ardour/disk_io.h b/libs/ardour/ardour/disk_io.h index 47b02582a1..e09f25d767 100644 --- a/libs/ardour/ardour/disk_io.h +++ b/libs/ardour/ardour/disk_io.h @@ -77,12 +77,11 @@ class LIBARDOUR_API DiskIOProcessor : public Processor bool hidden() const { return _flags & Hidden; } bool recordable() const { return _flags & Recordable; } bool non_layered() const { return _flags & NonLayered; } - bool reversed() const { return _actual_speed < 0.0f; } virtual void non_realtime_locate (framepos_t); - void non_realtime_set_speed (); - bool realtime_set_speed (double sp, bool global); + void non_realtime_speed_change (); + bool realtime_speed_change (); virtual void punch_in() {} virtual void punch_out() {} diff --git a/libs/ardour/ardour/disk_reader.h b/libs/ardour/ardour/disk_reader.h index c3cbe33f15..b0a6f6a158 100644 --- a/libs/ardour/ardour/disk_reader.h +++ b/libs/ardour/ardour/disk_reader.h @@ -118,7 +118,6 @@ class LIBARDOUR_API DiskReader : public DiskIOProcessor bool overwrite_queued; IOChange input_change_pending; framecnt_t wrap_buffer_size; - framecnt_t speed_buffer_size; MonitorChoice _monitoring_choice; int _do_refill_with_alloc (bool partial_fill); diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 7d408234b2..1175ec189c 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -432,7 +432,6 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop void request_overwrite_buffer (boost::shared_ptr<Route>); void adjust_playback_buffering(); void adjust_capture_buffering(); - void request_track_speed (Track *, double speed); void request_input_change_handling (); bool locate_pending() const { return static_cast<bool>(post_transport_work()&PostTransportLocate); } @@ -1699,7 +1698,6 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop void locate (framepos_t, bool with_roll, bool with_flush, bool with_loop=false, bool force=false, bool with_mmc=true); void start_locate (framepos_t, bool with_roll, bool with_flush, bool for_loop_enabled=false, bool force=false); void force_locate (framepos_t frame, bool with_roll = false); - void set_track_speed (Track *, double speed); void set_transport_speed (double speed, framepos_t destination_frame, bool abort = false, bool clear_state = false, bool as_default = false); void stop_transport (bool abort = false, bool clear_state = false); void start_transport (); diff --git a/libs/ardour/ardour/session_event.h b/libs/ardour/ardour/session_event.h index 740fcae1a2..2780924c27 100644 --- a/libs/ardour/ardour/session_event.h +++ b/libs/ardour/ardour/session_event.h @@ -40,7 +40,6 @@ class LIBARDOUR_API SessionEvent { public: enum Type { SetTransportSpeed, - SetTrackSpeed, Locate, LocateRoll, LocateRollLocate, diff --git a/libs/ardour/ardour/track.h b/libs/ardour/ardour/track.h index 103def7041..99f4ae2f49 100644 --- a/libs/ardour/ardour/track.h +++ b/libs/ardour/ardour/track.h @@ -158,12 +158,12 @@ class LIBARDOUR_API Track : public Route, public Recordable int internal_playback_seek (framecnt_t); void non_realtime_locate (framepos_t); void realtime_handle_transport_stopped (); - void non_realtime_set_speed (); + void non_realtime_speed_change (); int overwrite_existing_buffers (); framecnt_t get_captured_frames (uint32_t n = 0) const; int set_loop (ARDOUR::Location *); void transport_looped (framepos_t); - bool realtime_set_speed (double, bool); + bool realtime_speed_change (); void transport_stopped_wallclock (struct tm &, time_t, bool); bool pending_overwrite () const; void prepare_to_stop (framepos_t, framepos_t); diff --git a/libs/ardour/disk_io.cc b/libs/ardour/disk_io.cc index 5b81e2a161..587ba19ed0 100644 --- a/libs/ardour/disk_io.cc +++ b/libs/ardour/disk_io.cc @@ -49,8 +49,6 @@ DiskIOProcessor::DiskIOProcessor (Session& s, string const & str, Flag f) : Processor (s, str) , _flags (f) , i_am_the_modifier (false) - , _actual_speed (0.0) - , _target_speed (0.0) , _buffer_reallocation_required (false) , _seek_required (false) , _slaved (false) @@ -204,7 +202,7 @@ DiskIOProcessor::non_realtime_locate (framepos_t location) } void -DiskIOProcessor::non_realtime_set_speed () +DiskIOProcessor::non_realtime_speed_change () { if (_buffer_reallocation_required) { _buffer_reallocation_required = false; @@ -217,31 +215,18 @@ DiskIOProcessor::non_realtime_set_speed () } bool -DiskIOProcessor::realtime_set_speed (double new_speed, bool global) +DiskIOProcessor::realtime_speed_change () { - bool changed = false; + const framecnt_t required_wrap_size = (framecnt_t) ceil (_session.get_block_size() * fabs (_session.transport_speed())) + 2; + bool _buffer_reallocation_required; - DEBUG_TRACE (DEBUG::Transport, string_compose ("%1 will run at %2\n", name(), new_speed)); - - if (_target_speed != new_speed) { - _target_speed = new_speed; - changed = true; - - framecnt_t required_wrap_size = (framecnt_t) ceil (_session.get_block_size() * fabs (new_speed)) + 2; - - if (required_wrap_size > wrap_buffer_size) { - _buffer_reallocation_required = true; - } - } - - if (changed) { - if (!global) { - _seek_required = true; - } - SpeedChanged (); /* EMIT SIGNAL */ + if (required_wrap_size > wrap_buffer_size) { + _buffer_reallocation_required = true; + } else { + _buffer_reallocation_required = false; } - return _buffer_reallocation_required || _seek_required; + return _buffer_reallocation_required; } int @@ -255,13 +240,6 @@ DiskIOProcessor::set_state (const XMLNode& node, int version) _flags = Flag (string_2_enum (prop->value(), _flags)); } - if ((prop = node.property ("speed")) != 0) { - double sp = atof (prop->value().c_str()); - - if (realtime_set_speed (sp, false)) { - non_realtime_set_speed (); - } - } return 0; } diff --git a/libs/ardour/disk_reader.cc b/libs/ardour/disk_reader.cc index fbc48c01c9..2f4b9a903d 100644 --- a/libs/ardour/disk_reader.cc +++ b/libs/ardour/disk_reader.cc @@ -149,7 +149,7 @@ DiskReader::set_state (const XMLNode& node, int version) void DiskReader::realtime_handle_transport_stopped () { - realtime_set_speed (0.0f, true); + realtime_speed_change (); } void @@ -239,11 +239,21 @@ DiskReader::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, uint32_t n; boost::shared_ptr<ChannelList> c = channels.reader(); ChannelList::iterator chan; - framecnt_t playback_distance = 0; const bool need_disk_signal = result_required || _monitoring_choice == MonitorDisk || _monitoring_choice == MonitorCue; + frameoffset_t playback_distance = nframes; _need_butler = false; - playback_distance = calculate_playback_distance (nframes); + + + if (speed != 1.0f && speed != -1.0f) { + interpolation.set_speed (speed); + midi_interpolation.set_speed (speed); + playback_distance = midi_interpolation.distance (nframes); + } + + if (speed < 0.0) { + playback_distance = -playback_distance; + } if (!need_disk_signal) { @@ -277,7 +287,7 @@ DiskReader::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, if (playback_distance <= (framecnt_t) chaninfo->rw_vector.len[0]) { - if (fabsf (_actual_speed) != 1.0f) { + if (fabsf (speed) != 1.0f) { (void) interpolation.interpolate ( n, nframes, chaninfo->rw_vector.buf[0], @@ -295,7 +305,7 @@ DiskReader::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, /* We have enough samples, but not in one lump. */ - if (fabsf (_actual_speed) != 1.0f) { + if (fabsf (speed) != 1.0f) { interpolation.interpolate (n, chaninfo->rw_vector.len[0], chaninfo->rw_vector.buf[0], outgoing); @@ -343,7 +353,7 @@ DiskReader::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, get_playback (mbuf, playback_distance); /* vari-speed */ - if (_actual_speed != 0.0 && fabsf (_actual_speed) != 1.0f) { + if (speed != 0.0 && fabsf (speed) != 1.0f) { MidiBuffer& mbuf (bufs.get_midi (0)); for (MidiBuffer::iterator i = mbuf.begin(); i != mbuf.end(); ++i) { MidiBuffer::TimeType *tme = i.timeptr(); @@ -352,7 +362,7 @@ DiskReader::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, } } - if (_actual_speed < 0.0) { + if (speed < 0.0) { playback_sample -= playback_distance; } else { playback_sample += playback_distance; @@ -436,26 +446,6 @@ DiskReader::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, bufs.set_count (cnt); } -frameoffset_t -DiskReader::calculate_playback_distance (pframes_t nframes) -{ - frameoffset_t playback_distance = nframes; - - if (_target_speed != 1.0f && _target_speed != -1.0f) { - interpolation.set_speed (_target_speed); - midi_interpolation.set_speed (_target_speed); - playback_distance = midi_interpolation.distance (nframes); - } - - _actual_speed = _target_speed; - - if (_actual_speed < 0.0) { - return -playback_distance; - } else { - return playback_distance; - } -} - void DiskReader::set_pending_overwrite (bool yn) { @@ -486,7 +476,7 @@ DiskReader::overwrite_existing_buffers () /* AUDIO */ - bool reversed = (_target_speed * _session.transport_speed()) < 0.0f; + const bool reversed = _session.transport_speed() < 0.0f; /* assume all are the same size */ framecnt_t size = c->front()->buf->bufsize(); @@ -829,7 +819,7 @@ DiskReader::refill_audio (Sample* mixdown_buffer, float* gain_buffer, framecnt_t int32_t ret = 0; framecnt_t to_read; RingBufferNPT<Sample>::rw_vector vector; - bool const reversed = (_target_speed * _session.transport_speed()) < 0.0f; + bool const reversed = _session.transport_speed() < 0.0f; framecnt_t total_space; framecnt_t zero_fill; uint32_t chan_n; @@ -877,8 +867,8 @@ DiskReader::refill_audio (Sample* mixdown_buffer, float* gain_buffer, framecnt_t the playback buffer is empty. */ - DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: space to refill %2 vs. chunk %3 (speed = %4)\n", name(), total_space, _chunk_frames, _actual_speed)); - if ((total_space < _chunk_frames) && fabs (_actual_speed) < 2.0f) { + DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: space to refill %2 vs. chunk %3 (speed = %4)\n", name(), total_space, _chunk_frames, _session.transport_speed())); + if ((total_space < _chunk_frames) && fabs (_session.transport_speed()) < 2.0f) { return 0; } @@ -1391,7 +1381,7 @@ DiskReader::refill_midi () } size_t write_space = _midi_buf->write_space(); - bool reversed = (_target_speed * _session.transport_speed()) < 0.0f; + const bool reversed = _session.transport_speed() < 0.0f; DEBUG_TRACE (DEBUG::DiskIO, string_compose ("MIDI refill, write space = %1 file frame = %2\n", write_space, file_frame)); diff --git a/libs/ardour/disk_writer.cc b/libs/ardour/disk_writer.cc index 09b10696c0..5cddb51499 100644 --- a/libs/ardour/disk_writer.cc +++ b/libs/ardour/disk_writer.cc @@ -1706,5 +1706,5 @@ DiskWriter::adjust_buffering () void DiskWriter::realtime_handle_transport_stopped () { - realtime_set_speed (0.0f, true); + realtime_speed_change (); } diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index 8fa43508a9..fbf0dd42d2 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -392,7 +392,6 @@ setup_enum_writer () REGISTER (_Session_RecordState); REGISTER_CLASS_ENUM (SessionEvent, SetTransportSpeed); - REGISTER_CLASS_ENUM (SessionEvent, SetTrackSpeed); REGISTER_CLASS_ENUM (SessionEvent, Locate); REGISTER_CLASS_ENUM (SessionEvent, LocateRoll); REGISTER_CLASS_ENUM (SessionEvent, LocateRollLocate); diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc index a24123d959..9254a8c1ec 100644 --- a/libs/ardour/session_process.cc +++ b/libs/ardour/session_process.cc @@ -1231,10 +1231,6 @@ Session::process_event (SessionEvent* ev) overwrite_some_buffers (static_cast<Track*>(ev->ptr)); break; - case SessionEvent::SetTrackSpeed: - set_track_speed (static_cast<Track*> (ev->ptr), ev->speed); - break; - case SessionEvent::SetSyncSource: DEBUG_TRACE (DEBUG::Slave, "seen request for new slave\n"); use_sync_source (ev->slave); diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc index 3d3cea645c..f8f241d11a 100644 --- a/libs/ardour/session_transport.cc +++ b/libs/ardour/session_transport.cc @@ -133,14 +133,6 @@ Session::request_transport_speed_nonzero (double speed, bool as_default) } void -Session::request_track_speed (Track* tr, double speed) -{ - SessionEvent* ev = new SessionEvent (SessionEvent::SetTrackSpeed, SessionEvent::Add, SessionEvent::Immediate, 0, speed); - ev->set_ptr (tr); - queue_event (ev); -} - -void Session::request_stop (bool abort, bool clear_state) { SessionEvent* ev = new SessionEvent (SessionEvent::SetTransportSpeed, SessionEvent::Add, SessionEvent::Immediate, audible_frame(), 0.0, abort, clear_state); @@ -542,7 +534,7 @@ Session::non_realtime_set_speed () for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) { boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i); if (tr) { - tr->non_realtime_set_speed (); + tr->non_realtime_speed_change (); } } } @@ -1530,7 +1522,7 @@ Session::set_transport_speed (double speed, framepos_t destination_frame, bool a boost::shared_ptr<RouteList> rl = routes.reader(); for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) { boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i); - if (tr && tr->realtime_set_speed (_transport_speed, true)) { + if (tr && tr->realtime_speed_change()) { todo = PostTransportWork (todo | PostTransportSpeed); } } @@ -1694,7 +1686,7 @@ Session::start_transport () for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) { boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i); if (tr) { - tr->realtime_set_speed (_transport_speed, true); + tr->realtime_speed_change (); } } @@ -1861,7 +1853,7 @@ Session::use_sync_source (Slave* new_slave) for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) { boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i); if (tr && !tr->hidden()) { - if (tr->realtime_set_speed (_transport_speed, true)) { + if (tr->realtime_speed_change()) { non_rt_required = true; } tr->set_slaved (_slave != 0); @@ -1954,16 +1946,6 @@ Session::switch_to_sync_source (SyncSource src) } void -Session::set_track_speed (Track* track, double speed) -{ - if (track->realtime_set_speed (speed, false)) { - add_post_transport_work (PostTransportSpeed); - _butler->schedule_transport_work (); - set_dirty (); - } -} - -void Session::unset_play_range () { _play_range = false; diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc index d37fbb64c8..4b9eb740b6 100644 --- a/libs/ardour/track.cc +++ b/libs/ardour/track.cc @@ -672,9 +672,9 @@ Track::non_realtime_locate (framepos_t p) } void -Track::non_realtime_set_speed () +Track::non_realtime_speed_change () { - _disk_reader->non_realtime_set_speed (); + _disk_reader->non_realtime_speed_change (); } int @@ -705,12 +705,12 @@ Track::transport_looped (framepos_t p) } bool -Track::realtime_set_speed (double s, bool g) +Track::realtime_speed_change () { - if (_disk_reader->realtime_set_speed (s, g)) { + if (_disk_reader->realtime_speed_change ()) { return -1; } - return _disk_writer->realtime_set_speed (s, g); + return _disk_writer->realtime_speed_change (); } void |