From f86d6b01624e3a990a5d9e6333148f373b046258 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 20 Dec 2016 23:19:12 +0100 Subject: [PATCH] output/Control: move pipe initialization to the OutputThread Un-protect the SharedPipeConsumer instance, and make it available in the OutputThread only. This gives more well-defined mutex protection. --- src/output/Internal.hxx | 5 +++++ src/output/OutputControl.cxx | 3 +-- src/output/OutputThread.cxx | 6 ++++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/output/Internal.hxx b/src/output/Internal.hxx index 39e3ae345..8c7902fe2 100644 --- a/src/output/Internal.hxx +++ b/src/output/Internal.hxx @@ -256,6 +256,11 @@ struct AudioOutput { * The #AudioFormat requested by #Command::OPEN. */ AudioFormat audio_format; + + /** + * The #MusicPipe passed to #Command::OPEN. + */ + const MusicPipe *pipe; } request; /** diff --git a/src/output/OutputControl.cxx b/src/output/OutputControl.cxx index e8a02dbda..f92d058ba 100644 --- a/src/output/OutputControl.cxx +++ b/src/output/OutputControl.cxx @@ -122,8 +122,7 @@ AudioOutput::Open(const AudioFormat audio_format, const MusicPipe &mp) } request.audio_format = audio_format; - - pipe.Init(mp); + request.pipe = ∓ if (!thread.IsDefined()) StartThread(); diff --git a/src/output/OutputThread.cxx b/src/output/OutputThread.cxx index a38ed19e2..c21ca933a 100644 --- a/src/output/OutputThread.cxx +++ b/src/output/OutputThread.cxx @@ -145,6 +145,7 @@ AudioOutput::Open() return; in_audio_format = request.audio_format; + pipe.Init(*request.pipe); bool success; @@ -284,8 +285,9 @@ AudioOutput::Reopen() { assert(open); - if (request.audio_format != in_audio_format && - !config_audio_format.IsFullyDefined()) { + if ((request.audio_format != in_audio_format && + !config_audio_format.IsFullyDefined()) || + request.pipe != &pipe.GetPipe()) { Close(true); Open(); } else {