diff options
author | Max Kellermann <max@musicpd.org> | 2016-12-14 08:15:33 +0100 |
---|---|---|
committer | Max Kellermann <max@musicpd.org> | 2016-12-14 08:35:07 +0100 |
commit | 6425b4f9f56f5b98124cf7b006ede4ec8d86a567 (patch) | |
tree | 624ae4111362d511ca8410eaa5703fdb7558403d | |
parent | fb907f5f7613e83c0db2061cc73c9b2918704872 (diff) |
output/MultipleOutputs: parallelize AudioOutput destruction
Reduce latency by stopping all AudioOutputs asynchronously.
-rw-r--r-- | src/output/Internal.hxx | 3 | ||||
-rw-r--r-- | src/output/MultipleOutputs.cxx | 5 | ||||
-rw-r--r-- | src/output/OutputControl.cxx | 13 |
3 files changed, 17 insertions, 4 deletions
diff --git a/src/output/Internal.hxx b/src/output/Internal.hxx index a6f0d9d2e..6f45a44e7 100644 --- a/src/output/Internal.hxx +++ b/src/output/Internal.hxx @@ -283,7 +283,8 @@ public: void StartThread(); void StopThread(); - void Finish(); + void BeginDestroy(); + void FinishDestroy(); bool IsOpen() const { return open; diff --git a/src/output/MultipleOutputs.cxx b/src/output/MultipleOutputs.cxx index d5b6340d0..6f846faaa 100644 --- a/src/output/MultipleOutputs.cxx +++ b/src/output/MultipleOutputs.cxx @@ -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 * diff --git a/src/output/OutputControl.cxx b/src/output/OutputControl.cxx index e7221a171..01bca7ae8 100644 --- a/src/output/OutputControl.cxx +++ b/src/output/OutputControl.cxx @@ -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); } |