diff options
Diffstat (limited to 'libs/ardour/session.cc')
-rw-r--r-- | libs/ardour/session.cc | 214 |
1 files changed, 107 insertions, 107 deletions
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 19bfa295bf..923fd6164f 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -162,7 +162,7 @@ Session::Session (AudioEngine &eng, , _suspend_timecode_transmission (0) { _locations = new Locations (*this); - + playlists.reset (new SessionPlaylists); _all_route_group->set_active (true, this); @@ -262,7 +262,7 @@ Session::destroy () routes.flush (); _bundles.flush (); - + AudioDiskstream::free_working_buffers(); /* tell everyone who is still standing that we're about to die */ @@ -308,7 +308,7 @@ Session::destroy () DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n"); for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) { - + delete *i; } @@ -373,13 +373,13 @@ Session::when_engine_running () } else { c = _click_io->set_state (*child->children().front(), Stateful::loading_state_version); } - + if (c == 0) { _clicking = Config->get_clicking (); - + } else { - + error << _("could not setup Click I/O") << endmsg; _clicking = false; } @@ -399,13 +399,13 @@ Session::when_engine_running () } } } - + if (_click_io->n_ports () > ChanCount::ZERO) { _clicking = Config->get_clicking (); } } } - + catch (failed_constructor& err) { error << _("cannot setup Click I/O") << endmsg; } @@ -497,13 +497,13 @@ Session::when_engine_running () for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) { string n = inputs[DataType::MIDI][np]; boost::erase_first (n, X_("alsa_pcm:")); - + boost::shared_ptr<Bundle> c (new Bundle (n, false)); c->add_channel ("", DataType::MIDI); c->set_port (0, inputs[DataType::MIDI][np]); add_bundle (c); } - + /* MIDI output bundles */ for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) { @@ -534,7 +534,7 @@ Session::when_engine_running () if (_is_new && !no_auto_connect()) { Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock()); - + /* don't connect the master bus outputs if there is a monitor bus */ if (_master_out && Config->get_auto_connect_standard_busses() && !_monitor_out) { @@ -613,7 +613,7 @@ Session::when_engine_running () uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO); if (mod != 0) { - + for (uint32_t n = 0; n < limit; ++n) { Port* p = _monitor_out->output()->ports().port(DataType::AUDIO, n); @@ -621,7 +621,7 @@ Session::when_engine_running () if (outputs[DataType::AUDIO].size() > (n % mod)) { connect_to = outputs[DataType::AUDIO][n % mod]; } - + if (!connect_to.empty()) { if (_monitor_out->output()->connect (p, connect_to, this)) { error << string_compose ( @@ -700,15 +700,15 @@ Session::hookup_io () if (_monitor_out) { boost::shared_ptr<RouteList> r = routes.reader (); for (RouteList::iterator x = r->begin(); x != r->end(); ++x) { - + if ((*x)->is_monitor()) { - + /* relax */ - + } else if ((*x)->is_master()) { - + /* relax */ - + } else { (*x)->listen_via_monitor (); @@ -744,7 +744,7 @@ Session::track_playlist_changed (boost::weak_ptr<Track> wp) if (!track) { return; } - + boost::shared_ptr<Playlist> playlist; if ((playlist = track->playlist()) != 0) { @@ -987,20 +987,20 @@ Session::enable_record () { while (1) { RecordState rs = (RecordState) g_atomic_int_get (&_record_status); - + if (rs == Recording) { break; } if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) { - + _last_record_location = _transport_frame; MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe)); - + if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) { set_track_monitor_input_status (true); } - + RecordStateChanged (); break; } @@ -1060,9 +1060,9 @@ Session::maybe_enable_record () means that we save pending state of which sources the next record will use, which gives us some chance of recovering from a crash during the record. */ - + save_state ("", true); - + if (_transport_speed) { if (!config.get_punch_in()) { enable_record (); @@ -1233,7 +1233,7 @@ struct RouteSorter { } } } - + bool operator() (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> r2) { if (r2->feeds (r1)) { /* r1 fed by r2; run r2 early */ @@ -1244,7 +1244,7 @@ struct RouteSorter { } else { if (r1->not_fed ()) { if (r2->not_fed ()) { - /* no ardour-based connections inbound to either route. */ + /* no ardour-based connections inbound to either route. */ return sort_by_rec_enabled (r1, r2); } else { /* r2 has connections, r1 does not; run r1 early */ @@ -1276,7 +1276,7 @@ trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase) /* make a copy of the existing list of routes that feed r1 */ Route::FedBy existing (r1->fed_by()); - + /* for each route that feeds r1, recurse, marking it as feeding rbase as well. */ @@ -1286,7 +1286,7 @@ trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase) /* (*i) went away, ignore it */ continue; } - + /* r2 is a route that feeds r1 which somehow feeds base. mark base as being fed by r2 */ @@ -1337,7 +1337,7 @@ Session::resort_routes () boost::shared_ptr<RouteList> rl = routes.reader (); for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) { DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name())); - + const Route::FedBy& fb ((*i)->fed_by()); for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) { @@ -1391,7 +1391,7 @@ Session::resort_routes_using (boost::shared_ptr<RouteList> r) #ifndef NDEBUG DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n"); for (RouteList::iterator i = r->begin(); i != r->end(); ++i) { - DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n", + DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n", (*i)->name(), (*i)->order_key ("signal"))); } #endif @@ -1418,7 +1418,7 @@ Session::find_route_name (string const & base, uint32_t& id, char* name, size_t snprintf (name, name_len, "%s", base.c_str()); return true; } - + do { snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id); @@ -1467,7 +1467,7 @@ Session::new_midi_track (TrackMode mode, RouteGroup* route_group, uint32_t how_m control_id = ntracks() + nbusses(); bool const use_number = (how_many != 1); - + while (how_many) { if (!find_route_name (name_template.empty() ? _("Midi") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) { error << "cannot find name for new midi track" << endmsg; @@ -1475,7 +1475,7 @@ Session::new_midi_track (TrackMode mode, RouteGroup* route_group, uint32_t how_m } boost::shared_ptr<MidiTrack> track; - + try { track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode)); @@ -1551,16 +1551,16 @@ Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::wea return; } - /* new audio ports: make sure the audio goes somewhere useful, + /* new audio ports: make sure the audio goes somewhere useful, unless the user has no-auto-connect selected. - + The existing ChanCounts don't matter for this call as they are only to do with matching input and output indices, and we are only changing outputs here. */ ChanCount dummy; - + auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before); } } @@ -1570,7 +1570,7 @@ Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::wea * @param output_start As \a input_start, but for outputs. */ void -Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs, +Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs, bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start) { if (!IO::connecting_legal) { @@ -1624,7 +1624,7 @@ Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) { string port; - + if (Config->get_input_auto_connect() & AutoConnectPhysical) { DEBUG_TRACE (DEBUG::Graph, string_compose("Get index %1 + %2 % %3 = %4\n", @@ -1694,7 +1694,7 @@ Session::new_audio_track ( control_id = ntracks() + nbusses() + 1; bool const use_number = (how_many != 1); - + while (how_many) { if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) { error << "cannot find name for new audio track" << endmsg; @@ -1702,7 +1702,7 @@ Session::new_audio_track ( } boost::shared_ptr<AudioTrack> track; - + try { track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode)); @@ -1725,7 +1725,7 @@ Session::new_audio_track ( << endmsg; goto failed; } - + if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) { error << string_compose ( _("cannot configure %1 in/%2 out configuration for new audio track"), @@ -1838,8 +1838,8 @@ Session::new_audio_route (int input_channels, int output_channels, RouteGroup* r << endmsg; goto failure; } - - + + if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) { error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"), input_channels, output_channels) @@ -1935,9 +1935,9 @@ Session::new_route_from_template (uint32_t how_many, const std::string& template picks up the configuration of the route. During session loading this normally happens in a different way. */ - + Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); - + IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged)); change.after = route->input()->n_ports(); route->input()->changed (change, this); @@ -1977,7 +1977,7 @@ Session::add_routes (RouteList& new_routes, bool auto_connect, bool save) { ChanCount existing_inputs; ChanCount existing_outputs; - + count_existing_track_channels (existing_inputs, existing_outputs); { @@ -2030,7 +2030,7 @@ Session::add_routes (RouteList& new_routes, bool auto_connect, bool save) mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt))); } } - + if (auto_connect) { auto_connect_route (r, existing_inputs, existing_outputs, true); } @@ -2194,7 +2194,7 @@ Session::remove_route (boost::shared_ptr<Route> route) (*i)->remove_processor (s); } } - } + } boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route); if (mt && mt->step_editing()) { @@ -2257,7 +2257,7 @@ Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr) for (RouteList::iterator i = r->begin(); i != r->end(); ++i) { if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) { continue; - } + } (*i)->set_listen (false, this); } } @@ -2281,7 +2281,7 @@ Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr) error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg; return; } - + bool send_changed = false; if (route->solo_isolated()) { @@ -2300,7 +2300,7 @@ Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr) IsolatedChanged (); /* EMIT SIGNAL */ } } - + void Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr) { @@ -2321,7 +2321,7 @@ Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_p error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg; return; } - + boost::shared_ptr<RouteList> r = routes.reader (); int32_t delta; @@ -2330,28 +2330,28 @@ Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_p } else { delta = -1; } - + if (delta == 1 && Config->get_exclusive_solo()) { /* new solo: disable all other solos */ for (RouteList::iterator i = r->begin(); i != r->end(); ++i) { if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) { continue; - } + } (*i)->set_solo (false, this); } } solo_update_disabled = true; - + RouteList uninvolved; - + for (RouteList::iterator i = r->begin(); i != r->end(); ++i) { bool via_sends_only; bool in_signal_flow; if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) { continue; - } + } in_signal_flow = false; @@ -2362,8 +2362,8 @@ Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_p } in_signal_flow = true; } - } - + } + if (route->feeds (*i, &via_sends_only)) { (*i)->mod_solo_by_others_upstream (delta); in_signal_flow = true; @@ -2433,7 +2433,7 @@ Session::update_route_solo_state (boost::shared_ptr<RouteList> r) } } -boost::shared_ptr<RouteList> +boost::shared_ptr<RouteList> Session::get_routes_with_internal_returns() const { boost::shared_ptr<RouteList> r = routes.reader (); @@ -2451,17 +2451,17 @@ bool Session::io_name_is_legal (const std::string& name) { boost::shared_ptr<RouteList> r = routes.reader (); - + for (RouteList::iterator i = r->begin(); i != r->end(); ++i) { if ((*i)->name() == name) { return false; } - + if ((*i)->has_io_processor_named (name)) { return false; } } - + return true; } @@ -2559,15 +2559,15 @@ Session::maybe_update_session_range (framepos_t a, framepos_t b) } if (_session_range_location == 0) { - + add_session_range_location (a, b); - + } else { - + if (a < _session_range_location->start()) { _session_range_location->set_start (a); } - + if (b > _session_range_location->end()) { _session_range_location->set_end (b); } @@ -2643,7 +2643,7 @@ Session::destroy_sources (list<boost::shared_ptr<Source> > srcs) } for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) { - + { Glib::Mutex::Lock ls (source_lock); /* remove from the main source list */ @@ -2670,7 +2670,7 @@ Session::remove_last_capture () if (!tr) { continue; } - + list<boost::shared_ptr<Source> >& l = tr->last_capture_sources(); if (!l.empty()) { @@ -2709,7 +2709,7 @@ Session::add_source (boost::shared_ptr<Source> source) set_dirty(); boost::shared_ptr<AudioFileSource> afs; - + if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) { if (Config->get_auto_analyse_audio()) { Analyser::queue_source_for_analysis (source, false); @@ -2726,7 +2726,7 @@ Session::remove_source (boost::weak_ptr<Source> src) if (_state_of_the_state & Deletion) { return; } - + SourceMap::iterator i; boost::shared_ptr<Source> source = src.lock(); @@ -3002,7 +3002,7 @@ Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t cha string spath = sdir.sound_path().to_string(); /* note that we search *without* the extension so that - we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf" + we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf" in the event that this new name is required for a file format change. */ @@ -3025,7 +3025,7 @@ Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t cha throw failed_constructor(); } } - + return Glib::path_get_basename (buf); } @@ -3093,7 +3093,7 @@ Session::new_midi_source_name (const string& base) boost::shared_ptr<MidiSource> Session::create_midi_source_for_session (Track* track, string const & n) { - /* try to use the existing write source for the track, to keep numbering sane + /* try to use the existing write source for the track, to keep numbering sane */ if (track) { @@ -3102,7 +3102,7 @@ Session::create_midi_source_for_session (Track* track, string const & n) */ list<boost::shared_ptr<Source> > l = track->steal_write_sources (); - + if (!l.empty()) { assert (boost::dynamic_pointer_cast<MidiSource> (l.front())); return boost::dynamic_pointer_cast<MidiSource> (l.front()); @@ -3200,7 +3200,7 @@ Session::cancel_audition () bool Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) { - if (a->is_monitor()) { + if (a->is_monitor()) { return true; } if (b->is_monitor()) { @@ -3283,7 +3283,7 @@ Session::available_capture_duration () if (_total_free_4k_blocks * scale > (double) max_framecnt) { return max_framecnt; } - + return (framecnt_t) floor (_total_free_4k_blocks * scale); } @@ -3346,7 +3346,7 @@ Session::tempo_map_changed (const PropertyChange&) playlists->update_after_tempo_map_change (); _locations->apply (*this, &Session::update_locations_after_tempo_map_change); - + set_dirty (); } @@ -3686,7 +3686,7 @@ Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end, } /* tell redirects that care that we are about to use a much larger blocksize */ - + need_block_size_reset = true; track.set_block_size (chunk_size); @@ -3750,13 +3750,13 @@ Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end, /* construct a region to represent the bounced material */ PropertyList plist; - + plist.add (Properties::start, 0); plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position())); plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true)); - + result = RegionFactory::create (srcs, plist); - + } out: @@ -3784,7 +3784,7 @@ Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end, if (need_block_size_reset) { track.set_block_size (get_block_size()); } - + unblock_processing (); return result; @@ -3900,7 +3900,7 @@ Session::update_have_rec_enabled_track () if (tr && tr->record_enabled ()) { break; } - + ++i; } @@ -3946,7 +3946,7 @@ vector<SyncSource> Session::get_available_sync_options () const { vector<SyncSource> ret; - + ret.push_back (JACK); ret.push_back (MTC); ret.push_back (MIDIClock); @@ -3965,12 +3965,12 @@ Session::get_routes_with_regions_at (framepos_t const p) const if (!tr) { continue; } - + boost::shared_ptr<Playlist> pl = tr->playlist (); if (!pl) { continue; } - + if (pl->has_region_at (p)) { rl->push_back (*i); } @@ -4050,7 +4050,7 @@ Session::step_edit_status_change (bool yn) } } - + void Session::start_time_changed (framepos_t old) { @@ -4062,7 +4062,7 @@ Session::start_time_changed (framepos_t old) if (s == 0) { return; } - + Location* l = _locations->auto_loop_location (); if (l->start() == old) { @@ -4081,7 +4081,7 @@ Session::end_time_changed (framepos_t old) if (s == 0) { return; } - + Location* l = _locations->auto_loop_location (); if (l->end() == old) { @@ -4108,7 +4108,7 @@ Session::source_search_path (DataType type) const SessionDirectory sdir (i->path); if (!search_path.empty()) { search_path += ':'; - } + } switch (type) { case DataType::AUDIO: search_path += sdir.sound_path().to_string(); @@ -4119,7 +4119,7 @@ Session::source_search_path (DataType type) const } } } - + /* now add user-specified locations */ @@ -4137,9 +4137,9 @@ Session::source_search_path (DataType type) const for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) { search_path += ':'; search_path += *i; - + } - + return search_path; } @@ -4175,7 +4175,7 @@ Session::ensure_search_path_includes (const string& path, DataType type) } search_path += path; - + switch (type) { case DataType::AUDIO: config.set_audio_search_path (search_path); @@ -4187,7 +4187,7 @@ Session::ensure_search_path_includes (const string& path, DataType type) } boost::shared_ptr<Speakers> -Session::get_speakers() +Session::get_speakers() { return _speakers; } @@ -4243,15 +4243,15 @@ Session::update_latency (bool playback) */ DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency)); - + for (RouteList::iterator i = r->begin(); i != r->end(); ++i) { (*i)->set_public_port_latencies (max_latency, playback); } - + if (playback) { post_playback_latency (); - + } else { post_capture_latency (); @@ -4265,12 +4265,12 @@ Session::post_playback_latency () { set_worst_playback_latency (); - boost::shared_ptr<RouteList> r = routes.reader (); + boost::shared_ptr<RouteList> r = routes.reader (); for (RouteList::iterator i = r->begin(); i != r->end(); ++i) { if (!(*i)->is_hidden() && ((*i)->active())) { _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ()); } - + for (RouteList::iterator i = r->begin(); i != r->end(); ++i) { (*i)->set_latency_compensation (_worst_track_latency); } @@ -4281,10 +4281,10 @@ void Session::post_capture_latency () { set_worst_capture_latency (); - + /* reflect any changes in capture latencies into capture offsets */ - + 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); @@ -4359,14 +4359,14 @@ Session::update_latency_compensation (bool force_whole_graph) _worst_track_latency = 0; boost::shared_ptr<RouteList> r = routes.reader (); - + for (RouteList::iterator i = r->begin(); i != r->end(); ++i) { if (!(*i)->is_hidden() && ((*i)->active())) { framecnt_t tl; if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) { some_track_latency_changed = true; } - _worst_track_latency = max (tl, _worst_track_latency); + _worst_track_latency = max (tl, _worst_track_latency); } } @@ -4380,7 +4380,7 @@ Session::update_latency_compensation (bool force_whole_graph) */ _engine.update_total_latencies (); return; // everything else will be done in the latency callback - } + } DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n") } |