X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Froute.cc;h=a036c8feb078a7191d2aaf750fa9b1b789ab5799;hb=bc88203ef5f343f87016a28104f6977675f2c050;hp=92a6544151b1816f12e20d1b1a8a7d7ed7a2fcc9;hpb=3f75d7884877fddbf73e1623e3a1bc3fe7ba5643;p=ardour.git diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 92a6544151..a036c8feb0 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -51,6 +51,7 @@ #include "ardour/midi_port.h" #include "ardour/monitor_processor.h" #include "ardour/pannable.h" +#include "ardour/panner.h" #include "ardour/panner_shell.h" #include "ardour/plugin_insert.h" #include "ardour/port.h" @@ -179,8 +180,7 @@ Route::init () Metering::Meter.connect_same_thread (*this, (boost::bind (&Route::meter, this))); { - /* run a configure so that the invisible processors get set up */ - Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ()); configure_processors (0); } @@ -419,7 +419,8 @@ Route::process_output_buffers (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick, bool gain_automation_ok) { - bufs.set_is_silent (false); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK); + assert(lm.locked()); /* figure out if we're going to use gain automation */ if (gain_automation_ok) { @@ -946,6 +947,7 @@ Route::add_processor (boost::shared_ptr processor, boost::shared_ptr< } { + Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ()); Glib::Threads::RWLock::WriterLock lm (_processor_lock); ProcessorState pstate (this); @@ -987,8 +989,6 @@ Route::add_processor (boost::shared_ptr processor, boost::shared_ptr< // configure redirect ports properly, etc. { - Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); - if (configure_processors_unlocked (err)) { pstate.restore (); configure_processors_unlocked (0); // it worked before we tried to add it ... @@ -1069,7 +1069,8 @@ Route::add_processor_from_xml_2X (const XMLNode& node, int version) } else if (node.name() == "Send") { - processor.reset (new Send (_session, _pannable, _mute_master)); + boost::shared_ptr sendpan (new Pannable (_session)); + processor.reset (new Send (_session, sendpan, _mute_master)); } else { @@ -1116,6 +1117,7 @@ Route::add_processors (const ProcessorList& others, boost::shared_ptr } { + Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ()); Glib::Threads::RWLock::WriterLock lm (_processor_lock); ProcessorState pstate (this); @@ -1138,8 +1140,8 @@ Route::add_processors (const ProcessorList& others, boost::shared_ptr (*i)->activate (); } + /* Think: does this really need to be called for every processor in the loop? */ { - Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); if (configure_processors_unlocked (err)) { pstate.restore (); configure_processors_unlocked (0); // it worked before we tried to add it ... @@ -1315,6 +1317,7 @@ Route::clear_processors (Placement p) } { + Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ()); Glib::Threads::RWLock::WriterLock lm (_processor_lock); ProcessorList new_list; ProcessorStreams err; @@ -1359,11 +1362,7 @@ Route::clear_processors (Placement p) } _processors = new_list; - - { - Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); - configure_processors_unlocked (&err); // this can't fail - } + configure_processors_unlocked (&err); // this can't fail } processor_max_streams.reset(); @@ -1399,6 +1398,10 @@ Route::remove_processor (boost::shared_ptr processor, ProcessorStream processor_max_streams.reset(); { + Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK); + if (need_process_lock) { + lx.acquire(); + } Glib::Threads::RWLock::WriterLock lm (_processor_lock); ProcessorState pstate (this); @@ -1439,22 +1442,11 @@ Route::remove_processor (boost::shared_ptr processor, ProcessorStream return 1; } - if (need_process_lock) { - Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); - - if (configure_processors_unlocked (err)) { - pstate.restore (); - /* we know this will work, because it worked before :) */ - configure_processors_unlocked (0); - return -1; - } - } else { - if (configure_processors_unlocked (err)) { - pstate.restore (); - /* we know this will work, because it worked before :) */ - configure_processors_unlocked (0); - return -1; - } + if (configure_processors_unlocked (err)) { + pstate.restore (); + /* we know this will work, because it worked before :) */ + configure_processors_unlocked (0); + return -1; } _have_internal_generator = false; @@ -1469,6 +1461,9 @@ Route::remove_processor (boost::shared_ptr processor, ProcessorStream } } } + if (need_process_lock) { + lx.release(); + } } reset_instrument_info (); @@ -1491,6 +1486,7 @@ Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* processor_max_streams.reset(); { + Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ()); Glib::Threads::RWLock::WriterLock lm (_processor_lock); ProcessorState pstate (this); @@ -1537,16 +1533,13 @@ Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* _output->set_user_latency (0); - { - Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); - - if (configure_processors_unlocked (err)) { - pstate.restore (); - /* we know this will work, because it worked before :) */ - configure_processors_unlocked (0); - return -1; - } + if (configure_processors_unlocked (err)) { + pstate.restore (); + /* we know this will work, because it worked before :) */ + configure_processors_unlocked (0); + return -1; } + //lx.unlock(); _have_internal_generator = false; @@ -1575,6 +1568,58 @@ Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* return 0; } +void +Route::set_custom_panner_uri (std::string const panner_uri) +{ + if (_in_configure_processors) { + DEBUG_TRACE (DEBUG::Panning, string_compose (_("Route::set_custom_panner_uri '%1' -- called while in_configure_processors\n"), name())); + return; + } + + if (!_main_outs->panner_shell()->set_user_selected_panner_uri(panner_uri)) { + DEBUG_TRACE (DEBUG::Panning, string_compose (_("Route::set_custom_panner_uri '%1 '%2' -- no change needed\n"), name(), panner_uri)); + /* no change needed */ + return; + } + + DEBUG_TRACE (DEBUG::Panning, string_compose (_("Route::set_custom_panner_uri '%1 '%2' -- reconfigure I/O\n"), name(), panner_uri)); + + /* reconfigure I/O -- re-initialize panner modules */ + { + Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ()); + Glib::Threads::RWLock::WriterLock lm (_processor_lock); + + for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) { + boost::shared_ptr dl; + boost::shared_ptr panner; + if ((dl = boost::dynamic_pointer_cast (*p)) == 0) { + continue; + } + if (!dl->panner_shell()) { + continue; + } + if (!(panner = dl->panner_shell()->panner())) { + continue; + } + /* _main_outs has already been set before the loop. + * Ignore the return status here. It need reconfiguration */ + if (dl->panner_shell() != _main_outs->panner_shell()) { + if (!dl->panner_shell()->set_user_selected_panner_uri(panner_uri)) { + continue; + } + } + + ChanCount in = panner->in(); + ChanCount out = panner->out(); + dl->panner_shell()->configure_io(in, out); + dl->panner_shell()->pannable()->set_panner(dl->panner_shell()->panner()); + } + } + + processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */ + _session.set_dirty (); +} + void Route::reset_instrument_info () { @@ -1589,7 +1634,6 @@ int Route::configure_processors (ProcessorStreams* err) { assert (!AudioEngine::instance()->process_lock().trylock()); - if (!_in_configure_processors) { Glib::Threads::RWLock::WriterLock lm (_processor_lock); return configure_processors_unlocked (err); @@ -1760,6 +1804,7 @@ Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err */ { + Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ()); Glib::Threads::RWLock::WriterLock lm (_processor_lock); ProcessorState pstate (this); @@ -1821,13 +1866,9 @@ Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err /* If the meter is in a custom position, find it and make a rough note of its position */ maybe_note_meter_position (); - { - Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); - - if (configure_processors_unlocked (err)) { - pstate.restore (); - return -1; - } + if (configure_processors_unlocked (err)) { + pstate.restore (); + return -1; } } @@ -2507,7 +2548,8 @@ Route::set_processor_state (const XMLNode& node) if (prop->value() == "intsend") { - processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::shared_ptr(), Delivery::Role (0))); + boost::shared_ptr sendpan (new Pannable (_session)); + processor.reset (new InternalSend (_session, sendpan, _mute_master, boost::shared_ptr(), Delivery::Role (0))); } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" || prop->value() == "lv2" || @@ -2523,7 +2565,8 @@ Route::set_processor_state (const XMLNode& node) } else if (prop->value() == "send") { - processor.reset (new Send (_session, _pannable, _mute_master)); + boost::shared_ptr sendpan (new Pannable (_session)); + processor.reset (new Send (_session, sendpan, _mute_master)); } else { error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg; @@ -2554,11 +2597,11 @@ Route::set_processor_state (const XMLNode& node) } { + Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ()); Glib::Threads::RWLock::WriterLock lm (_processor_lock); _processors = new_order; if (must_configure) { - Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); configure_processors_unlocked (0); } @@ -2672,6 +2715,7 @@ Route::enable_monitor_send () /* master never sends to monitor section via the normal mechanism */ assert (!is_master ()); + assert (!is_monitor ()); /* make sure we have one */ if (!_monitor_send) { @@ -2712,7 +2756,8 @@ Route::add_aux_send (boost::shared_ptr route, boost::shared_ptrprocess_lock ()); - listener.reset (new InternalSend (_session, _pannable, _mute_master, route, Delivery::Aux)); + boost::shared_ptr sendpan (new Pannable (_session)); + listener.reset (new InternalSend (_session, sendpan, _mute_master, route, Delivery::Aux)); } add_processor (listener, before); @@ -3139,17 +3184,14 @@ void Route::listen_position_changed () { { + Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ()); Glib::Threads::RWLock::WriterLock lm (_processor_lock); ProcessorState pstate (this); - { - Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); - - if (configure_processors_unlocked (0)) { - pstate.restore (); - configure_processors_unlocked (0); // it worked before we tried to add it ... - return; - } + if (configure_processors_unlocked (0)) { + pstate.restore (); + configure_processors_unlocked (0); // it worked before we tried to add it ... + return; } } @@ -3165,10 +3207,7 @@ Route::add_export_point() _capturing_processor.reset (new CapturingProcessor (_session)); _capturing_processor->activate (); - { - Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); - configure_processors (0); - } + configure_processors (0); } @@ -4119,7 +4158,7 @@ Route::has_external_redirects () const boost::shared_ptr Route::the_instrument () const { - Glib::Threads::RWLock::WriterLock lm (_processor_lock); + Glib::Threads::RWLock::ReaderLock lm (_processor_lock); return the_instrument_unlocked (); } @@ -4147,6 +4186,7 @@ Route::non_realtime_locate (framepos_t pos) } { + //Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ()); Glib::Threads::RWLock::WriterLock lm (_processor_lock); for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {