fix crash when copy'ing latent plugins
[ardour.git] / libs / ardour / audioengine.cc
index a87a5ee7d0192015a07e17c34a812d6acd255f20..30c2113c06ad39fe7e23d3f695e985c3586e7db1 100644 (file)
@@ -55,7 +55,7 @@
 #include "ardour/process_thread.h"
 #include "ardour/session.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -63,6 +63,8 @@ using namespace PBD;
 
 AudioEngine* AudioEngine::_instance = 0;
 
+static gint audioengine_thread_cnt = 1;
+
 #ifdef SILENCE_AFTER
 #define SILENCE_AFTER_SECONDS 600
 #endif
@@ -112,6 +114,7 @@ AudioEngine::~AudioEngine ()
        for (BackendMap::const_iterator i = _backends.begin(); i != _backends.end(); ++i) {
                i->second->deinstantiate();
        }
+       delete _main_thread;
 }
 
 AudioEngine*
@@ -215,6 +218,26 @@ AudioEngine::process_callback (pframes_t nframes)
                return 0;
        }
 
+       /* The coreaudio-backend calls thread_init_callback() if
+        * the hardware changes or pthread_self() changes.
+        *
+        * However there are cases when neither holds true, yet
+        * the thread-pool changes: e.g. connect a headphone to
+        * a shared mic/headphone jack.
+        * It's probably related to, or caused by clocksource changes.
+        *
+        * For reasons yet unknown Glib::Threads::Private() can
+        * use a different thread-private in the same pthread
+        * (coreaudio render callback).
+        *
+        * Coreaudio must set something which influences
+        * pthread_key_t uniqness or reset the key using
+        * pthread_getspecific().
+        */
+       if (! SessionEvent::has_per_thread_pool ()) {
+               thread_init_callback (NULL);
+       }
+
        bool return_after_remove_check = false;
 
        if (_measuring_latency == MeasureAudio && _mtdm) {
@@ -389,7 +412,7 @@ AudioEngine::process_callback (pframes_t nframes)
 
 #else
        if (_session->silent()) {
-               PortManager::silence (nframes);
+               PortManager::silence (nframes, _session);
        }
 #endif
 
@@ -1204,14 +1227,15 @@ AudioEngine::thread_init_callback (void* arg)
 
        pthread_set_name (X_("audioengine"));
 
-       SessionEvent::create_per_thread_pool (X_("AudioEngine"), 512);
-
-       PBD::notify_gui_about_thread_creation ("gui", pthread_self(), X_("AudioEngine"), 4096);
-       PBD::notify_gui_about_thread_creation ("midiui", pthread_self(), X_("AudioEngine"), 128);
+       const int thread_num = g_atomic_int_add (&audioengine_thread_cnt, 1);
+       const string thread_name = string_compose (X_("AudioEngine %1"), thread_num);
 
+       SessionEvent::create_per_thread_pool (thread_name, 512);
+       PBD::notify_event_loops_about_thread_creation (pthread_self(), thread_name, 4096);
        AsyncMIDIPort::set_process_thread (pthread_self());
 
        if (arg) {
+               delete AudioEngine::instance()->_main_thread;
                /* the special thread created/managed by the backend */
                AudioEngine::instance()->_main_thread = new ProcessThread;
        }