183 |
{ |
{ |
184 |
std::vector<AudioChannel*>::iterator iter = Channels.begin(); |
std::vector<AudioChannel*>::iterator iter = Channels.begin(); |
185 |
while (iter != Channels.end()) { |
while (iter != Channels.end()) { |
|
Channels.erase(iter); |
|
186 |
delete *iter; |
delete *iter; |
187 |
iter++; |
iter++; |
188 |
} |
} |
189 |
|
Channels.clear(); |
190 |
} |
} |
191 |
|
|
192 |
// delete all device parameters |
// delete all device parameters |
201 |
} |
} |
202 |
|
|
203 |
void AudioOutputDevice::Connect(Engine* pEngine) { |
void AudioOutputDevice::Connect(Engine* pEngine) { |
204 |
if (Engines.find(pEngine) == Engines.end()) { |
std::set<Engine*>& engines = Engines.GetConfigForUpdate(); |
205 |
Engines.insert(pEngine); |
if (engines.find(pEngine) == engines.end()) { |
206 |
|
engines.insert(pEngine); |
207 |
|
Engines.SwitchConfig().insert(pEngine); |
208 |
// make sure the engine knows about the connection |
// make sure the engine knows about the connection |
209 |
//pEngine->Connect(this); |
//pEngine->Connect(this); |
210 |
} |
} |
211 |
} |
} |
212 |
|
|
213 |
void AudioOutputDevice::Disconnect(Engine* pEngine) { |
void AudioOutputDevice::Disconnect(Engine* pEngine) { |
214 |
if (Engines.find(pEngine) != Engines.end()) { // if clause to prevent disconnect loop |
std::set<Engine*>& engines = Engines.GetConfigForUpdate(); |
215 |
Engines.erase(pEngine); |
if (engines.find(pEngine) != engines.end()) { // if clause to prevent disconnect loop |
216 |
|
engines.erase(pEngine); |
217 |
|
Engines.SwitchConfig().erase(pEngine); |
218 |
// make sure the engine knows about the disconnection |
// make sure the engine knows about the disconnection |
219 |
//pEngine->DisconnectAudioOutputDevice(); |
//pEngine->DisconnectAudioOutputDevice(); |
220 |
} |
} |
250 |
int result = 0; |
int result = 0; |
251 |
|
|
252 |
// let all connected engines render audio for the current audio fragment cycle |
// let all connected engines render audio for the current audio fragment cycle |
253 |
|
const std::set<Engine*>& engines = Engines.Lock(); |
254 |
#if CONFIG_RT_EXCEPTIONS |
#if CONFIG_RT_EXCEPTIONS |
255 |
try |
try |
256 |
#endif // CONFIG_RT_EXCEPTIONS |
#endif // CONFIG_RT_EXCEPTIONS |
257 |
{ |
{ |
258 |
std::set<Engine*>::iterator iterEngine = Engines.begin(); |
std::set<Engine*>::iterator iterEngine = engines.begin(); |
259 |
std::set<Engine*>::iterator end = Engines.end(); |
std::set<Engine*>::iterator end = engines.end(); |
260 |
for (; iterEngine != end; iterEngine++) { |
for (; iterEngine != end; iterEngine++) { |
261 |
int res = (*iterEngine)->RenderAudio(Samples); |
int res = (*iterEngine)->RenderAudio(Samples); |
262 |
if (res != 0) result = res; |
if (res != 0) result = res; |
269 |
} |
} |
270 |
#endif // CONFIG_RT_EXCEPTIONS |
#endif // CONFIG_RT_EXCEPTIONS |
271 |
|
|
272 |
|
Engines.Unlock(); |
273 |
return result; |
return result; |
274 |
} |
} |
275 |
|
|