aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/output/plugins/PipeOutputPlugin.cxx53
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 &param, 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 = {