X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fsession.cc;h=14c5bde9969045bfbaa674b54eaa1b945d3b1a50;hb=337cee7a8344c76edc9068bf733ee8489b1c9bef;hp=99fad0d0130759d63b85f567510b5a4d2e0aec1f;hpb=34cd3457a2f04526f96342edf52d453973cf21b9;p=ardour.git diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 99fad0d013..14c5bde996 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -40,6 +40,7 @@ #include #include #include +#include #include #include @@ -278,7 +279,7 @@ Session::Session (AudioEngine &eng, new_session = !g_file_test (_path.c_str(), GFileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)); if (new_session) { - if (create (new_session, mix_template, _engine.frame_rate() * 60 * 5)) { + if (create (new_session, mix_template, compute_initial_length())) { cerr << "create failed\n"; throw failed_constructor (); } @@ -328,8 +329,16 @@ Session::Session (AudioEngine &eng, cerr << "Loading session " << fullpath << " using snapshot " << snapshot_name << " (2)" << endl; - n_physical_outputs = max (requested_physical_out, _engine.n_physical_outputs()); - n_physical_inputs = max (requested_physical_in, _engine.n_physical_inputs()); + n_physical_outputs = _engine.n_physical_outputs(); + n_physical_inputs = _engine.n_physical_inputs(); + + if (n_physical_inputs) { + n_physical_inputs = max (requested_physical_in, n_physical_inputs); + } + + if (n_physical_outputs) { + n_physical_outputs = max (requested_physical_out, n_physical_outputs); + } first_stage_init (fullpath, snapshot_name); @@ -397,7 +406,7 @@ Session::~Session () /* clear history so that no references to objects are held any more */ - history.clear (); + _history.clear (); /* clear state tree so that no references to objects are held any more */ @@ -827,6 +836,11 @@ Session::when_engine_running () } } + + /* its safe to do this now */ + + restore_history (snap_name()); + _state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty)); /* hook us up to the engine */ @@ -1325,7 +1339,7 @@ Session::set_frame_rate (nframes_t frames_per_second) Route::set_automation_interval ((jack_nframes_t) ceil ((double) frames_per_second * 0.25)); // XXX we need some equivalent to this, somehow - // DestructiveFileSource::setup_standard_crossfades (frames_per_second); + // SndFileSource::setup_standard_crossfades (frames_per_second); set_dirty(); @@ -1771,12 +1785,12 @@ Session::new_audio_route (int input_channels, int output_channels, uint32_t how_ << endmsg; } - for (uint32_t x = 0; x < bus->n_inputs(); ++x) { + for (uint32_t x = 0; n_physical_inputs && x < bus->n_inputs(); ++x) { port = ""; - + if (Config->get_input_auto_connect() & AutoConnectPhysical) { - port = physinputs[((n+x)%n_physical_inputs)]; + port = physinputs[((n+x)%n_physical_inputs)]; } if (port.length() && bus->connect_input (bus->input (x), port, this)) { @@ -1784,7 +1798,7 @@ Session::new_audio_route (int input_channels, int output_channels, uint32_t how_ } } - for (uint32_t x = 0; x < bus->n_outputs(); ++x) { + for (uint32_t x = 0; n_physical_outputs && x < bus->n_outputs(); ++x) { port = ""; @@ -1897,8 +1911,9 @@ Session::remove_route (shared_ptr route) { RCUWriter writer (routes); shared_ptr rs = writer.get_copy (); - rs->remove (route); + rs->remove (route); + /* deleting the master out seems like a dumb idea, but its more of a UI policy issue than our concern. @@ -2526,12 +2541,12 @@ Session::remove_region (boost::weak_ptr weak_region) set_dirty(); if (removed) { - AudioRegionRemoved(ar); /* EMIT SIGNAL */ + AudioRegionRemoved (ar); /* EMIT SIGNAL */ } } boost::shared_ptr -Session::find_whole_file_parent (boost::shared_ptr child) +Session::find_whole_file_parent (boost::shared_ptr child) { AudioRegionList::iterator i; boost::shared_ptr region; @@ -2562,32 +2577,38 @@ Session::find_equivalent_playlist_regions (boost::shared_ptr region, vec int Session::destroy_region (boost::shared_ptr region) { - boost::shared_ptr aregion; - - if ((aregion = boost::dynamic_pointer_cast (region)) == 0) { - return 0; - } - - if (aregion->playlist()) { - aregion->playlist()->destroy_region (region); - } - vector > srcs; - - for (uint32_t n = 0; n < aregion->n_channels(); ++n) { - srcs.push_back (aregion->source (n)); + + { + boost::shared_ptr aregion; + + if ((aregion = boost::dynamic_pointer_cast (region)) == 0) { + return 0; + } + + if (aregion->playlist()) { + aregion->playlist()->destroy_region (region); + } + + for (uint32_t n = 0; n < aregion->n_channels(); ++n) { + srcs.push_back (aregion->source (n)); + } } + region->drop_references (); + for (vector >::iterator i = srcs.begin(); i != srcs.end(); ++i) { - - if ((*i).use_count() == 1) { - boost::shared_ptr afs = boost::dynamic_pointer_cast(*i); + if (!(*i)->used()) { + boost::shared_ptr afs = boost::dynamic_pointer_cast(*i); + if (afs) { (afs)->mark_for_remove (); } (*i)->drop_references (); + + cerr << "source was not used by any playlist\n"; } } @@ -2979,6 +3000,20 @@ Session::add_playlist (Playlist* playlist) PlaylistAdded (playlist); /* EMIT SIGNAL */ } +void +Session::get_playlists (vector& s) +{ + { + Glib::Mutex::Lock lm (playlist_lock); + for (PlaylistList::iterator i = playlists.begin(); i != playlists.end(); ++i) { + s.push_back (*i); + } + for (PlaylistList::iterator i = unused_playlists.begin(); i != unused_playlists.end(); ++i) { + s.push_back (*i); + } + } +} + void Session::track_playlist (Playlist* pl, bool inuse) { @@ -3285,7 +3320,9 @@ Session::remove_redirect (Redirect* redirect) } else if ((plugin_insert = dynamic_cast (insert)) != 0) { _plugin_inserts.remove (plugin_insert); } else { - fatal << _("programming error: unknown type of Insert deleted!") << endmsg; + fatal << string_compose (_("programming error: %1"), + X_("unknown type of Insert deleted!")) + << endmsg; /*NOTREACHED*/ } } else if ((send = dynamic_cast (redirect)) != 0) { @@ -3311,6 +3348,13 @@ Session::available_capture_duration () case FormatInt24: sample_bytes_on_disk = 3; break; + + default: + /* impossible, but keep some gcc versions happy */ + fatal << string_compose (_("programming error: %1"), + X_("illegal native file data format")) + << endmsg; + /*NOTREACHED*/ } double scale = 4096.0 / sample_bytes_on_disk; @@ -3417,9 +3461,15 @@ Session::ensure_passthru_buffers (uint32_t howmany) string Session::next_send_name () { - char buf[32]; - snprintf (buf, sizeof (buf), "send %" PRIu32, ++send_cnt); - return buf; + uint32_t cnt = 0; + + shared_ptr r = routes.reader (); + + for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) { + cnt += (*i)->count_sends (); + } + + return string_compose (_("send %1"), ++cnt); } string @@ -3768,3 +3818,10 @@ Session::add_automation_list(AutomationList *al) { automation_lists[al->id()] = al; } + +nframes_t +Session::compute_initial_length () +{ + return _engine.frame_rate() * 60 * 5; +} +