output/Filtered: add a few OutputPlugin method wrappers

This commit is contained in:
Max Kellermann 2017-08-08 14:27:19 +02:00
parent 5431fca99b
commit b3eb8489f3
3 changed files with 50 additions and 9 deletions

View File

@ -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,10 +131,40 @@ 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::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
{
ao_plugin_cancel(*this);
Cancel();
}
bool

View File

@ -24,6 +24,7 @@
#include "filter/Observer.hxx"
#include <string>
#include <chrono>
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;

View File

@ -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();