#include "ardour/process_thread.h"
#include "ardour/session.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
AudioEngine* AudioEngine::_instance = 0;
+static gint audioengine_thread_cnt = 1;
+
#ifdef SILENCE_AFTER
#define SILENCE_AFTER_SECONDS 600
#endif
for (BackendMap::const_iterator i = _backends.begin(); i != _backends.end(); ++i) {
i->second->deinstantiate();
}
+ delete _main_thread;
}
AudioEngine*
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) {
#else
if (_session->silent()) {
- PortManager::silence (nframes);
+ PortManager::silence (nframes, _session);
}
#endif
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;
}