X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Ftrack.cc;h=f56554791506908a663ca9992e0c57460fcf71e5;hb=9775c5c9f1b81340f3177ede038f02faed71c887;hp=5aad8b9bcf843a8d9905cca0210586c518a1e6cc;hpb=5fa9f8b399726e248412ebcfdeb8ed751f5a48d4;p=ardour.git diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc index 5aad8b9bcf..f565547915 100644 --- a/libs/ardour/track.cc +++ b/libs/ardour/track.cc @@ -91,17 +91,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 (); @@ -429,128 +429,6 @@ Track::set_name (const string& str) return ret; } -int -Track::no_roll_unlocked (pframes_t nframes, samplepos_t start_sample, samplepos_t end_sample, bool session_state_changing) -{ - /* 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, false); - } - - flush_processor_buffers_locked (nframes); - - return 0; -} - boost::shared_ptr Track::playlist () { @@ -1157,9 +1035,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 (); @@ -1261,7 +1139,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;