diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/output/plugins/PipeOutputPlugin.cxx | 53 |
1 files changed, 35 insertions, 18 deletions
diff --git a/src/output/plugins/PipeOutputPlugin.cxx b/src/output/plugins/PipeOutputPlugin.cxx index 7a1f32258..8a674d7aa 100644 --- a/src/output/plugins/PipeOutputPlugin.cxx +++ b/src/output/plugins/PipeOutputPlugin.cxx @@ -42,6 +42,14 @@ struct PipeOutput { } bool Configure(const config_param ¶m, Error &error); + bool Open(AudioFormat &audio_format, Error &error); + + void Close() { + pclose(fh); + } + + size_t Play(const void *chunk, size_t size, Error &error); + }; static constexpr Domain pipe_output_domain("pipe_output"); @@ -85,43 +93,52 @@ pipe_output_finish(AudioOutput *ao) delete pd; } -static bool -pipe_output_open(AudioOutput *ao, - gcc_unused AudioFormat &audio_format, - Error &error) +inline bool +PipeOutput::Open(gcc_unused AudioFormat &audio_format, Error &error) { - PipeOutput *pd = (PipeOutput *)ao; - - pd->fh = popen(pd->cmd.c_str(), "w"); - if (pd->fh == nullptr) { + fh = popen(cmd.c_str(), "w"); + if (fh == nullptr) { error.FormatErrno("Error opening pipe \"%s\"", - pd->cmd.c_str()); + cmd.c_str()); return false; } return true; } +static bool +pipe_output_open(AudioOutput *ao, AudioFormat &audio_format, Error &error) +{ + PipeOutput &po = *(PipeOutput *)ao; + + return po.Open(audio_format, error); +} + static void pipe_output_close(AudioOutput *ao) { - PipeOutput *pd = (PipeOutput *)ao; + PipeOutput &po = *(PipeOutput *)ao; - pclose(pd->fh); + po.Close(); +} + +inline size_t +PipeOutput::Play(const void *chunk, size_t size, Error &error) +{ + size_t nbytes = fwrite(chunk, 1, size, fh); + if (nbytes == 0) + error.SetErrno("Write error on pipe"); + + return nbytes; } static size_t pipe_output_play(AudioOutput *ao, const void *chunk, size_t size, Error &error) { - PipeOutput *pd = (PipeOutput *)ao; - size_t ret; - - ret = fwrite(chunk, 1, size, pd->fh); - if (ret == 0) - error.SetErrno("Write error on pipe"); + PipeOutput &po = *(PipeOutput *)ao; - return ret; + return po.Play(chunk, size, error); } const struct AudioOutputPlugin pipe_output_plugin = { |