From b3eb8489f33e340ebc84b19e88721f95989e371d Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 8 Aug 2017 14:27:19 +0200 Subject: output/Filtered: add a few OutputPlugin method wrappers --- src/output/Filtered.cxx | 36 +++++++++++++++++++++++++++++++++--- src/output/Filtered.hxx | 12 ++++++++++++ src/output/Thread.cxx | 11 +++++------ 3 files changed, 50 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/output/Filtered.cxx b/src/output/Filtered.cxx index 2fa1321c2..0cae11c6b 100644 --- a/src/output/Filtered.cxx +++ b/src/output/Filtered.cxx @@ -101,9 +101,9 @@ void FilteredAudioOutput::CloseOutput(bool drain) noexcept { if (drain) - ao_plugin_drain(*this); + Drain(); else - ao_plugin_cancel(*this); + Cancel(); ao_plugin_close(*this); } @@ -131,12 +131,42 @@ FilteredAudioOutput::Close(bool drain) noexcept FormatDebug(output_domain, "closed %s", GetLogName()); } +std::chrono::steady_clock::duration +FilteredAudioOutput::Delay() noexcept +{ + return ao_plugin_delay(*this); +} + void -FilteredAudioOutput::BeginPause() noexcept +FilteredAudioOutput::SendTag(const Tag &tag) +{ + ao_plugin_send_tag(*this, tag); +} + +size_t +FilteredAudioOutput::Play(const void *data, size_t size) +{ + return ao_plugin_play(*this, data, size); +} + +void +FilteredAudioOutput::Drain() +{ + ao_plugin_drain(*this); +} + +void +FilteredAudioOutput::Cancel() noexcept { ao_plugin_cancel(*this); } +void +FilteredAudioOutput::BeginPause() noexcept +{ + Cancel(); +} + bool FilteredAudioOutput::IteratePause() noexcept { diff --git a/src/output/Filtered.hxx b/src/output/Filtered.hxx index 385c67d00..fc43c8101 100644 --- a/src/output/Filtered.hxx +++ b/src/output/Filtered.hxx @@ -24,6 +24,7 @@ #include "filter/Observer.hxx" #include +#include class PreparedFilter; class MusicPipe; @@ -34,6 +35,7 @@ struct MusicChunk; struct ConfigBlock; struct AudioOutputPlugin; struct ReplayGainConfig; +struct Tag; struct FilteredAudioOutput { /** @@ -186,6 +188,16 @@ public: */ void CloseSoftwareMixer() noexcept; + gcc_pure + std::chrono::steady_clock::duration Delay() noexcept; + + void SendTag(const Tag &tag); + + size_t Play(const void *data, size_t size); + + void Drain(); + void Cancel() noexcept; + void BeginPause() noexcept; bool IteratePause() noexcept; diff --git a/src/output/Thread.cxx b/src/output/Thread.cxx index ba8440151..5acf0da0b 100644 --- a/src/output/Thread.cxx +++ b/src/output/Thread.cxx @@ -21,7 +21,6 @@ #include "Control.hxx" #include "Filtered.hxx" #include "Client.hxx" -#include "OutputPlugin.hxx" #include "Domain.hxx" #include "notify.hxx" #include "mixer/MixerInternal.hxx" @@ -217,7 +216,7 @@ inline bool AudioOutputControl::WaitForDelay() noexcept { while (true) { - const auto delay = ao_plugin_delay(*output); + const auto delay = output->Delay(); if (delay <= std::chrono::steady_clock::duration::zero()) return true; @@ -251,7 +250,7 @@ AudioOutputControl::PlayChunk() noexcept if (tag != nullptr) { const ScopeUnlock unlock(mutex); try { - ao_plugin_send_tag(*output, *tag); + output->SendTag(*tag); } catch (const std::runtime_error &e) { FormatError(e, "Failed to send tag to %s", GetLogName()); @@ -273,7 +272,7 @@ AudioOutputControl::PlayChunk() noexcept try { const ScopeUnlock unlock(mutex); - nbytes = ao_plugin_play(*output, data.data, data.size); + nbytes = output->Play(data.data, data.size); assert(nbytes <= data.size); } catch (const std::runtime_error &e) { FormatError(e, "Failed to play on %s", GetLogName()); @@ -438,7 +437,7 @@ AudioOutputControl::Task() case Command::DRAIN: if (open) { const ScopeUnlock unlock(mutex); - ao_plugin_drain(*output); + output->Drain(); } CommandFinished(); @@ -449,7 +448,7 @@ AudioOutputControl::Task() if (open) { const ScopeUnlock unlock(mutex); - ao_plugin_cancel(*output); + output->Cancel(); } CommandFinished(); -- cgit v1.2.3