output/MultipleOutputs: parallelize AudioOutput destruction

Reduce latency by stopping all AudioOutputs asynchronously.
This commit is contained in:
Max Kellermann 2016-12-14 08:15:33 +01:00
parent fb907f5f76
commit 6425b4f9f5
3 changed files with 17 additions and 4 deletions

View File

@ -283,7 +283,8 @@ public:
void StartThread();
void StopThread();
void Finish();
void BeginDestroy();
void FinishDestroy();
bool IsOpen() const {
return open;

View File

@ -43,8 +43,11 @@ MultipleOutputs::MultipleOutputs(MixerListener &_mixer_listener)
MultipleOutputs::~MultipleOutputs()
{
/* parallel destruction */
for (auto i : outputs)
i->Finish();
i->BeginDestroy();
for (auto i : outputs)
i->FinishDestroy();
}
static AudioOutput *

View File

@ -274,13 +274,22 @@ AudioOutput::StopThread()
}
void
AudioOutput::Finish()
AudioOutput::BeginDestroy()
{
if (mixer != nullptr)
mixer_auto_close(mixer);
if (thread.IsDefined()) {
const ScopeLock protect(mutex);
CommandAsync(Command::KILL);
}
}
void
AudioOutput::FinishDestroy()
{
if (thread.IsDefined())
StopThread();
thread.Join();
audio_output_free(this);
}