X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fdisk_io.cc;h=64c645bdc35110e3a5eb01322cd0f9831f1ae7c8;hb=dc4f730ac95837590e8305f69778d1049e4a545e;hp=e15620b1d26e6b5bb72ae8d991bee966c3430533;hpb=361cab503b6f51be4612037610924d302b1f6a22;p=ardour.git diff --git a/libs/ardour/disk_io.cc b/libs/ardour/disk_io.cc index e15620b1d2..64c645bdc3 100644 --- a/libs/ardour/disk_io.cc +++ b/libs/ardour/disk_io.cc @@ -49,10 +49,6 @@ DiskIOProcessor::DiskIOProcessor (Session& s, string const & str, Flag f) : Processor (s, str) , _flags (f) , i_am_the_modifier (false) - , _visible_speed (0.0) - , _actual_speed (0.0) - , _speed (0.0) - , _target_speed (0.0) , _buffer_reallocation_required (false) , _seek_required (false) , _slaved (false) @@ -140,10 +136,8 @@ DiskIOProcessor::can_support_io_configuration (const ChanCount& in, ChanCount& o return false; } - if (in != out) { - /* currently no way to deliver different channels that we receive */ - return false; - } + /* currently no way to deliver different channels that we receive */ + out = in; return true; } @@ -157,22 +151,24 @@ DiskIOProcessor::configure_io (ChanCount in, ChanCount out) boost::shared_ptr c = writer.get_copy(); uint32_t n_audio = in.n_audio(); + bool changed = false; if (n_audio > c->size()) { add_channel_to (c, n_audio - c->size()); + changed = true; } else if (n_audio < c->size()) { remove_channel_from (c, c->size() - n_audio); + changed = true; } if (in.n_midi() > 0 && !_midi_buf) { const size_t size = _session.butler()->midi_diskstream_buffer_size(); _midi_buf = new MidiRingBuffer(size); midi_interpolation.add_channel_to (0,0); + changed = true; } - if (speed() != 1.0f || speed() != -1.0f) { - seek ((framepos_t) (_session.transport_frame() * (double) speed())); - } else { + if (changed) { seek (_session.transport_frame()); } @@ -206,64 +202,35 @@ DiskIOProcessor::non_realtime_locate (framepos_t location) { /* now refill channel buffers */ - if (speed() != 1.0f || speed() != -1.0f) { - seek ((framepos_t) (location * (double) speed()), true); - } else { - seek (location, true); - } + seek (location, true); } void -DiskIOProcessor::non_realtime_set_speed () +DiskIOProcessor::non_realtime_speed_change () { if (_buffer_reallocation_required) { _buffer_reallocation_required = false; } if (_seek_required) { - if (speed() != 1.0f || speed() != -1.0f) { - seek ((framepos_t) (_session.transport_frame() * (double) speed()), true); - } - else { - seek (_session.transport_frame(), true); - } - + seek (_session.transport_frame(), true); _seek_required = false; } } bool -DiskIOProcessor::realtime_set_speed (double sp, bool global) +DiskIOProcessor::realtime_speed_change () { - bool changed = false; - double new_speed = sp * _session.transport_speed(); - - if (_visible_speed != sp) { - _visible_speed = sp; - changed = true; - } - - if (new_speed != _actual_speed) { + const framecnt_t required_wrap_size = (framecnt_t) ceil (_session.get_block_size() * fabs (_session.transport_speed())) + 2; + bool _buffer_reallocation_required; - 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; - } - - _actual_speed = new_speed; - _target_speed = fabs(_actual_speed); - } - - 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 @@ -277,13 +244,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; } @@ -293,6 +253,10 @@ DiskIOProcessor::add_channel_to (boost::shared_ptr c, uint32_t how_ while (how_many--) { c->push_back (new ChannelInfo (_session.butler()->audio_diskstream_playback_buffer_size())); interpolation.add_channel_to (_session.butler()->audio_diskstream_playback_buffer_size(), speed_buffer_size); + DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: new channel, write space = %2 read = %3\n", + name(), + c->back()->buf->write_space(), + c->back()->buf->read_space())); } return 0; @@ -372,6 +336,7 @@ DiskIOProcessor::use_playlist (DataType dt, boost::shared_ptr playlist DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: set to use playlist %2 (%3)\n", name(), playlist->name(), dt.to_string())); if (playlist == _playlists[dt]) { + DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: already using that playlist\n", name())); return 0; } @@ -389,7 +354,7 @@ DiskIOProcessor::use_playlist (DataType dt, boost::shared_ptr playlist playlist->DropReferences.connect_same_thread (playlist_connections, boost::bind (&DiskIOProcessor::playlist_deleted, this, boost::weak_ptr(playlist))); playlist->RangesMoved.connect_same_thread (playlist_connections, boost::bind (&DiskIOProcessor::playlist_ranges_moved, this, _1, _2)); - DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1 now use playlist %1 (%2)\n", name(), playlist->name(), playlist->id())); + DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1 now using playlist %1 (%2)\n", name(), playlist->name(), playlist->id())); PlaylistChanged (dt); /* EMIT SIGNAL */ _session.set_dirty (); @@ -428,10 +393,20 @@ DiskIOProcessor::ChannelInfo::~ChannelInfo () capture_transition_buf = 0; } +void +DiskIOProcessor::drop_route () +{ + _route.reset (); +} + void DiskIOProcessor::set_route (boost::shared_ptr r) { _route = r; + + if (_route) { + _route->DropReferences.connect_same_thread (*this, boost::bind (&DiskIOProcessor::drop_route, this)); + } } /** Get the start, end, and length of a location "atomically".