X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Ftrack.cc;h=4f22892b5ab2594549ed6eb1788ef0980589dc87;hb=097176696b055b91fcc4298965c9042a4cc71f47;hp=37c3a9996170559fe93c0d7c5978387bea873fc7;hpb=2fa1f1b0b30b810bbb12ee428bfd7b532cecb5aa;p=ardour.git diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc index 37c3a99961..4f22892b5a 100644 --- a/libs/ardour/track.cc +++ b/libs/ardour/track.cc @@ -20,6 +20,7 @@ #include "ardour/amp.h" #include "ardour/audioengine.h" #include "ardour/audiofilesource.h" +#include "ardour/audioplaylist.h" #include "ardour/audioregion.h" #include "ardour/debug.h" #include "ardour/delivery.h" @@ -28,6 +29,7 @@ #include "ardour/event_type_map.h" #include "ardour/io_processor.h" #include "ardour/meter.h" +#include "ardour/midi_playlist.h" #include "ardour/midi_region.h" #include "ardour/monitor_control.h" #include "ardour/playlist.h" @@ -59,8 +61,6 @@ Track::Track (Session& sess, string name, PresentationInfo::Flag flag, TrackMode , _alignment_choice (Automatic) { _freeze_record.state = NoFreeze; - _declickable = true; - } Track::~Track () @@ -89,17 +89,17 @@ Track::init () if (_mode == Destructive && !Profile->get_trx()) { dflags = DiskIOProcessor::Flag (dflags | DiskIOProcessor::Destructive); - } else if (_mode == NonLayered){ - dflags = DiskIOProcessor::Flag(dflags | DiskIOProcessor::NonLayered); } _disk_reader.reset (new DiskReader (_session, name(), dflags)); _disk_reader->set_block_size (_session.get_block_size ()); _disk_reader->set_route (boost::dynamic_pointer_cast (shared_from_this())); + _disk_reader->set_owner (this); _disk_writer.reset (new DiskWriter (_session, name(), dflags)); _disk_writer->set_block_size (_session.get_block_size ()); _disk_writer->set_route (boost::dynamic_pointer_cast (shared_from_this())); + _disk_writer->set_owner (this); set_align_choice_from_io (); @@ -137,15 +137,9 @@ Track::input_changed () } XMLNode& -Track::get_state () +Track::state (bool save_template) { - return state (true); -} - -XMLNode& -Track::state (bool full) -{ - XMLNode& root (Route::state (full)); + XMLNode& root (Route::state (save_template)); if (_playlists[DataType::AUDIO]) { root.set_property (X_("audio-playlist"), _playlists[DataType::AUDIO]->id().to_s()); @@ -172,22 +166,33 @@ Track::set_state (const XMLNode& node, int version) return -1; } - XMLNode* child; + if (version >= 3000 && version < 6000) { + if (XMLNode* ds_node = find_named_node (node, "Diskstream")) { + std::string name; + if (ds_node->get_property ("name", name)) { - if (version >= 3000 && version < 4000) { - if ((child = find_named_node (node, X_("Diskstream"))) != 0) { - /* XXX if we remember anything from stored DiskStream - state (older Ardour versions) that is needed by a - DiskReader or DiskWriter, we should cook up a new - XMLNode here, populate it with that information - (child nodes, properties, etc.) and then call - ::set_state() on the writer/reader. - - But at present (June 2017), there's no such state. - */ + ds_node->set_property ("active", true); + + _disk_writer->set_state (*ds_node, version); + _disk_reader->set_state (*ds_node, version); + + AlignChoice ac; + if (ds_node->get_property (X_("capture-alignment"), ac)) { + set_align_choice (ac, true); + } + + if (boost::shared_ptr pl = boost::dynamic_pointer_cast (_session.playlists->by_name (name))) { + use_playlist (DataType::AUDIO, pl); + } + + if (boost::shared_ptr pl = boost::dynamic_pointer_cast (_session.playlists->by_name (name))) { + use_playlist (DataType::MIDI, pl); + } + } } } + XMLNode* child; std::string playlist_id; if (node.get_property (X_("audio-playlist"), playlist_id)) { @@ -232,12 +237,6 @@ Track::set_state (const XMLNode& node, int version) return 0; } -XMLNode& -Track::get_template () -{ - return state (false); -} - Track::FreezeRecord::~FreezeRecord () { for (vector::iterator i = processor_info.begin(); i != processor_info.end(); ++i) { @@ -251,6 +250,12 @@ Track::freeze_state() const return _freeze_record.state; } +bool +Track::declick_in_progress () const +{ + return _disk_reader->declick_in_progress (); +} + bool Track::can_record() { @@ -416,134 +421,6 @@ Track::set_name (const string& str) return ret; } -int -Track::no_roll (pframes_t nframes, samplepos_t start_sample, samplepos_t end_sample, bool session_state_changing) -{ - Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK); - - if (!lm.locked()) { - return 0; - } - - /* no outputs? nothing to do ... what happens if we have sends etc. ? */ - - if (n_outputs().n_total() == 0 && !ARDOUR::Profile->get_mixbus()) { - //Note: Mixbus has its own output mechanism, so we should operate even if no explicit outputs are assigned - return 0; - } - - /* not active ... do the minimum possible by just outputting silence */ - - if (!_active) { - silence (nframes); - if (_meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _disk_writer->record_enabled())) { - _meter->reset(); - } - return 0; - } - - if (session_state_changing) { - if (_session.transport_speed() != 0.0f) { - /* we're rolling but some state is changing (e.g. our - disk reader contents) so we cannot use them. Be - silent till this is over. Don't declick. - - XXX note the absurdity of ::no_roll() being called when we ARE rolling! - */ - passthru_silence (start_sample, end_sample, nframes, 0); - return 0; - } - /* we're really not rolling, so we're either delivery silence or actually - monitoring, both of which are safe to do while session_state_changing is true. - */ - } - - bool be_silent; - MonitorState const s = monitoring_state (); - /* we are not rolling, so be silent even if we are monitoring disk, as there - will be no disk data coming in. - */ - switch (s) { - case MonitoringSilence: - be_silent = true; - break; - case MonitoringDisk: - be_silent = true; - break; - case MonitoringInput: - be_silent = false; - break; - default: - be_silent = false; - break; - } - - //if we have an internal generator, let it play regardless of monitoring state - if (_have_internal_generator) { - be_silent = false; - } - - /* if have_internal_generator, or .. */ - - if (be_silent) { - - if (_meter_point == MeterInput) { - /* still need input monitoring and metering */ - - bool const track_rec = _disk_writer->record_enabled (); - bool const auto_input = _session.config.get_auto_input (); - bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring; - bool const tape_machine_mode = Config->get_tape_machine_mode (); - bool no_meter = false; - - /* this needs a proper K-map - * and should be separated into a function similar to monitoring_state() - * that also handles roll() states in audio_track.cc, midi_track.cc and route.cc - * - * see http://www.oofus.co.uk/ardour/Ardour3MonitorModesV3.pdf - */ - if (!auto_input && !track_rec) { - no_meter=true; - } - else if (tape_machine_mode && !track_rec && auto_input) { - no_meter=true; - } - else if (!software_monitor && tape_machine_mode && !track_rec) { - no_meter=true; - } - else if (!software_monitor && !tape_machine_mode && !track_rec && !auto_input) { - no_meter=true; - } - - if (no_meter) { - BufferSet& bufs (_session.get_silent_buffers (n_process_buffers())); - _meter->run (bufs, start_sample, end_sample, 1.0, nframes, true); - _input->process_input (boost::shared_ptr(), start_sample, end_sample, _session.transport_speed(), nframes); - } else { - _input->process_input (_meter, start_sample, end_sample, _session.transport_speed(), nframes); - } - } - - passthru_silence (start_sample, end_sample, nframes, 0); - - } else { - - BufferSet& bufs = _session.get_route_buffers (n_process_buffers()); - - fill_buffers_with_input (bufs, _input, nframes); - - if (_meter_point == MeterInput) { - _meter->run (bufs, start_sample, end_sample, _session.transport_speed(), nframes, true); - } - - passthru (bufs, start_sample, end_sample, nframes, false, true); - } - - flush_processor_buffers_locked (nframes); - - return 0; -} - boost::shared_ptr Track::playlist () { @@ -578,18 +455,6 @@ Track::last_capture_sources () return _disk_writer->last_capture_sources (); } -void -Track::update_latency_information () -{ - Glib::Threads::RWLock::ReaderLock lr (_processor_lock); - samplecnt_t chain_latency = _input->latency (); - - for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) { - (*p)->set_input_latency (chain_latency); - chain_latency += (*p)->signal_latency (); - } -} - std::string Track::steal_write_source_name() { @@ -657,20 +522,6 @@ void Track::non_realtime_locate (samplepos_t p) { Route::non_realtime_locate (p); - - if (!is_private_route()) { - /* don't waste i/o cycles and butler calls - for private tracks (e.g.auditioner) - */ - _disk_reader->non_realtime_locate (p); - _disk_writer->non_realtime_locate (p); - } -} - -void -Track::non_realtime_speed_change () -{ - _disk_reader->non_realtime_speed_change (); } int @@ -685,44 +536,12 @@ Track::get_captured_samples (uint32_t n) const return _disk_writer->get_captured_samples (n); } -int -Track::set_loop (Location* l) -{ - if (_disk_reader->set_loop (l)) { - return -1; - } - return _disk_writer->set_loop (l); -} - void Track::transport_looped (samplepos_t p) { return _disk_writer->transport_looped (p); } -bool -Track::realtime_speed_change () -{ - if (_disk_reader->realtime_speed_change ()) { - return -1; - } - return _disk_writer->realtime_speed_change (); -} - -void -Track::realtime_handle_transport_stopped () -{ - Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK); - - if (!lm.locked ()) { - return; - } - - for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) { - (*i)->realtime_handle_transport_stopped (); - } -} - void Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g) { @@ -966,29 +785,6 @@ Track::adjust_capture_buffering () } } - -void -Track::maybe_declick (BufferSet& bufs, samplecnt_t nframes, int declick) -{ - /* never declick if there is an internal generator - we just want it to - keep generating sound without interruption. - - ditto if we are monitoring inputs. - */ - - if (_have_internal_generator || (_monitoring_control->monitoring_choice() == MonitorInput)) { - return; - } - - if (!declick) { - declick = _pending_declick; - } - - if (declick != 0) { - Amp::declick (bufs, nframes, declick); - } -} - void Track::monitoring_changed (bool, Controllable::GroupControlDisposition) { @@ -1162,9 +958,9 @@ Track::use_captured_midi_sources (SourceList& srcs, CaptureInfos const & capture continue; /* XXX is this OK? */ } - // cerr << "add new region, buffer position = " << buffer_position << " @ " << (*ci)->start << endl; + cerr << "add new region, len = " << (*ci)->samples << " @ " << (*ci)->start << endl; - pl->add_region (midi_region, (*ci)->start + preroll_off, _disk_writer->non_layered()); + pl->add_region (midi_region, (*ci)->start + preroll_off, 1, _session.config.get_layered_record_mode ()); } pl->thaw (); @@ -1266,7 +1062,7 @@ Track::use_captured_audio_sources (SourceList& srcs, CaptureInfos const & captur continue; /* XXX is this OK? */ } - pl->add_region (region, (*ci)->start + preroll_off, 1, _disk_writer->non_layered()); + pl->add_region (region, (*ci)->start + preroll_off, 1, _session.config.get_layered_record_mode()); pl->set_layer (region, DBL_MAX); buffer_position += (*ci)->samples;