output/MultipleOutputs: reduce lock/unlock calls in EnableDisable()
Use ScopeLock to manage the lock; don't unlock after obtaining the "really_enabled" flag; keep the same lock during EnableWait() / DisableWait().
This commit is contained in:
parent
a9d7293818
commit
ced3f320eb
@ -323,13 +323,17 @@ public:
|
||||
|
||||
/**
|
||||
* Enables the device.
|
||||
*
|
||||
* Caller must lock the mutex.
|
||||
*/
|
||||
void LockEnableWait();
|
||||
void EnableWait();
|
||||
|
||||
/**
|
||||
* Disables the device.
|
||||
*
|
||||
* Caller must lock the mutex.
|
||||
*/
|
||||
void LockDisableWait();
|
||||
void DisableWait();
|
||||
|
||||
void LockPauseAsync();
|
||||
|
||||
|
@ -44,7 +44,11 @@ MultipleOutputs::MultipleOutputs(MixerListener &_mixer_listener)
|
||||
MultipleOutputs::~MultipleOutputs()
|
||||
{
|
||||
for (auto i : outputs) {
|
||||
i->LockDisableWait();
|
||||
{
|
||||
const ScopeLock lock(i->mutex);
|
||||
i->DisableWait();
|
||||
}
|
||||
|
||||
i->Finish();
|
||||
}
|
||||
}
|
||||
@ -107,17 +111,13 @@ void
|
||||
MultipleOutputs::EnableDisable()
|
||||
{
|
||||
for (auto ao : outputs) {
|
||||
bool enabled;
|
||||
const ScopeLock lock(ao->mutex);
|
||||
|
||||
ao->mutex.lock();
|
||||
enabled = ao->really_enabled;
|
||||
ao->mutex.unlock();
|
||||
|
||||
if (ao->enabled != enabled) {
|
||||
if (ao->enabled != ao->really_enabled) {
|
||||
if (ao->enabled)
|
||||
ao->LockEnableWait();
|
||||
ao->EnableWait();
|
||||
else
|
||||
ao->LockDisableWait();
|
||||
ao->DisableWait();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -70,7 +70,7 @@ AudioOutput::LockCommandWait(Command cmd)
|
||||
}
|
||||
|
||||
void
|
||||
AudioOutput::LockEnableWait()
|
||||
AudioOutput::EnableWait()
|
||||
{
|
||||
if (!thread.IsDefined()) {
|
||||
if (plugin.enable == nullptr) {
|
||||
@ -84,11 +84,11 @@ AudioOutput::LockEnableWait()
|
||||
StartThread();
|
||||
}
|
||||
|
||||
LockCommandWait(Command::ENABLE);
|
||||
CommandWait(Command::ENABLE);
|
||||
}
|
||||
|
||||
void
|
||||
AudioOutput::LockDisableWait()
|
||||
AudioOutput::DisableWait()
|
||||
{
|
||||
if (!thread.IsDefined()) {
|
||||
if (plugin.disable == nullptr)
|
||||
@ -101,7 +101,7 @@ AudioOutput::LockDisableWait()
|
||||
return;
|
||||
}
|
||||
|
||||
LockCommandWait(Command::DISABLE);
|
||||
CommandWait(Command::DISABLE);
|
||||
}
|
||||
|
||||
inline bool
|
||||
|
Loading…
Reference in New Issue
Block a user