--- linuxsampler/trunk/src/drivers/audio/AudioOutputDevice.cpp 2006/02/10 19:23:59 839 +++ linuxsampler/trunk/src/drivers/audio/AudioOutputDevice.cpp 2006/02/26 13:00:08 840 @@ -201,16 +201,20 @@ } void AudioOutputDevice::Connect(Engine* pEngine) { - if (Engines.find(pEngine) == Engines.end()) { - Engines.insert(pEngine); + std::set& engines = Engines.GetConfigForUpdate(); + if (engines.find(pEngine) == engines.end()) { + engines.insert(pEngine); + Engines.SwitchConfig().insert(pEngine); // make sure the engine knows about the connection //pEngine->Connect(this); } } void AudioOutputDevice::Disconnect(Engine* pEngine) { - if (Engines.find(pEngine) != Engines.end()) { // if clause to prevent disconnect loop - Engines.erase(pEngine); + std::set& engines = Engines.GetConfigForUpdate(); + if (engines.find(pEngine) != engines.end()) { // if clause to prevent disconnect loop + engines.erase(pEngine); + Engines.SwitchConfig().erase(pEngine); // make sure the engine knows about the disconnection //pEngine->DisconnectAudioOutputDevice(); } @@ -246,12 +250,13 @@ int result = 0; // let all connected engines render audio for the current audio fragment cycle + const std::set& engines = Engines.Lock(); #if CONFIG_RT_EXCEPTIONS try #endif // CONFIG_RT_EXCEPTIONS { - std::set::iterator iterEngine = Engines.begin(); - std::set::iterator end = Engines.end(); + std::set::iterator iterEngine = engines.begin(); + std::set::iterator end = engines.end(); for (; iterEngine != end; iterEngine++) { int res = (*iterEngine)->RenderAudio(Samples); if (res != 0) result = res; @@ -264,6 +269,7 @@ } #endif // CONFIG_RT_EXCEPTIONS + Engines.Unlock(); return result; }