output/snapcast: implement Pause()

This uncomments the code which had been present already in the first
Snapcast commit (copied from the "httpd" output plugin), but I
commented it because I did not know whether I needed to send silence
samples to all Snapcast clients.

As a side effect, this fixes playback when no Snapcast client is
connected; this was broken because Pause() always returned a positive
value when there were no clients.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/1310
This commit is contained in:
Max Kellermann 2021-10-31 16:19:52 +01:00
parent 03f99dd26e
commit 9a21bdfd6a
2 changed files with 10 additions and 4 deletions

View File

@ -51,6 +51,12 @@ class SnapcastOutput final : AudioOutput, ServerSocket {
*/ */
bool open; bool open;
/**
* Is the output current paused? This is set by Pause() and
* is cleared by the next Play() call. It is used in Delay().
*/
bool pause;
InjectEvent inject_event; InjectEvent inject_event;
#ifdef HAVE_ZEROCONF #ifdef HAVE_ZEROCONF

View File

@ -161,6 +161,7 @@ SnapcastOutput::Open(AudioFormat &audio_format)
timer = new Timer(audio_format); timer = new Timer(audio_format);
open = true; open = true;
pause = false;
} }
void void
@ -213,7 +214,7 @@ SnapcastOutput::RemoveClient(SnapcastClient &client) noexcept
std::chrono::steady_clock::duration std::chrono::steady_clock::duration
SnapcastOutput::Delay() const noexcept SnapcastOutput::Delay() const noexcept
{ {
if (!LockHasClients() /*&& pause*/) { if (!LockHasClients() && pause) {
/* if there's no client and this output is paused, /* if there's no client and this output is paused,
then Pause() will not do anything, it will not fill then Pause() will not do anything, it will not fill
the buffer and it will not update the timer; the buffer and it will not update the timer;
@ -307,7 +308,7 @@ SnapcastOutput::SendTag(const Tag &tag)
size_t size_t
SnapcastOutput::Play(const void *chunk, size_t size) SnapcastOutput::Play(const void *chunk, size_t size)
{ {
//pause = false; pause = false;
const auto now = std::chrono::steady_clock::now(); const auto now = std::chrono::steady_clock::now();
@ -355,8 +356,7 @@ SnapcastOutput::Play(const void *chunk, size_t size)
bool bool
SnapcastOutput::Pause() SnapcastOutput::Pause()
{ {
// TODO: implement pause = true;
//pause = true;
return true; return true;
} }