output/null: move functions into the struct

This commit is contained in:
Max Kellermann 2015-01-09 17:44:00 +01:00
parent ae4c189e19
commit 575a5bd0b8
1 changed files with 48 additions and 76 deletions

View File

@ -20,6 +20,7 @@
#include "config.h" #include "config.h"
#include "NullOutputPlugin.hxx" #include "NullOutputPlugin.hxx"
#include "../OutputAPI.hxx" #include "../OutputAPI.hxx"
#include "../Wrapper.hxx"
#include "../Timer.hxx" #include "../Timer.hxx"
struct NullOutput { struct NullOutput {
@ -35,10 +36,46 @@ struct NullOutput {
bool Initialize(const config_param &param, Error &error) { bool Initialize(const config_param &param, Error &error) {
return base.Configure(param, error); return base.Configure(param, error);
} }
static NullOutput *Create(const config_param &param, Error &error);
bool Open(AudioFormat &audio_format, gcc_unused Error &error) {
if (sync)
timer = new Timer(audio_format);
return true;
}
void Close() {
if (sync)
delete timer;
}
unsigned Delay() const {
return sync && timer->IsStarted()
? timer->GetDelay()
: 0;
}
size_t Play(gcc_unused const void *chunk, size_t size,
gcc_unused Error &error) {
if (sync) {
if (!timer->IsStarted())
timer->Start();
timer->Add(size);
}
return size;
}
void Cancel() {
if (sync)
timer->Reset();
}
}; };
static AudioOutput * inline NullOutput *
null_init(const config_param &param, Error &error) NullOutput::Create(const config_param &param, Error &error)
{ {
NullOutput *nd = new NullOutput(); NullOutput *nd = new NullOutput();
@ -49,90 +86,25 @@ null_init(const config_param &param, Error &error)
nd->sync = param.GetBlockValue("sync", true); nd->sync = param.GetBlockValue("sync", true);
return &nd->base; return nd;
} }
static void typedef AudioOutputWrapper<NullOutput> Wrapper;
null_finish(AudioOutput *ao)
{
NullOutput *nd = (NullOutput *)ao;
delete nd;
}
static bool
null_open(AudioOutput *ao, AudioFormat &audio_format,
gcc_unused Error &error)
{
NullOutput *nd = (NullOutput *)ao;
if (nd->sync)
nd->timer = new Timer(audio_format);
return true;
}
static void
null_close(AudioOutput *ao)
{
NullOutput *nd = (NullOutput *)ao;
if (nd->sync)
delete nd->timer;
}
static unsigned
null_delay(AudioOutput *ao)
{
NullOutput *nd = (NullOutput *)ao;
return nd->sync && nd->timer->IsStarted()
? nd->timer->GetDelay()
: 0;
}
static size_t
null_play(AudioOutput *ao, gcc_unused const void *chunk, size_t size,
gcc_unused Error &error)
{
NullOutput *nd = (NullOutput *)ao;
Timer *timer = nd->timer;
if (!nd->sync)
return size;
if (!timer->IsStarted())
timer->Start();
timer->Add(size);
return size;
}
static void
null_cancel(AudioOutput *ao)
{
NullOutput *nd = (NullOutput *)ao;
if (!nd->sync)
return;
nd->timer->Reset();
}
const struct AudioOutputPlugin null_output_plugin = { const struct AudioOutputPlugin null_output_plugin = {
"null", "null",
nullptr, nullptr,
null_init, &Wrapper::Init,
null_finish, &Wrapper::Finish,
nullptr, nullptr,
nullptr, nullptr,
null_open, &Wrapper::Open,
null_close, &Wrapper::Close,
null_delay, &Wrapper::Delay,
nullptr, nullptr,
null_play, &Wrapper::Play,
nullptr, nullptr,
null_cancel, &Wrapper::Cancel,
nullptr, nullptr,
nullptr, nullptr,
}; };