aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/output/plugins/RecorderOutputPlugin.cxx65
1 files changed, 40 insertions, 25 deletions
diff --git a/src/output/plugins/RecorderOutputPlugin.cxx b/src/output/plugins/RecorderOutputPlugin.cxx
index 87e23f55a..e0ef569d0 100644
--- a/src/output/plugins/RecorderOutputPlugin.cxx
+++ b/src/output/plugins/RecorderOutputPlugin.cxx
@@ -66,6 +66,9 @@ struct RecorderOutput {
bool Configure(const config_param &param, Error &error);
+ bool Open(AudioFormat &audio_format, Error &error);
+ void Close();
+
bool WriteToFile(const void *data, size_t length, Error &error);
/**
@@ -176,56 +179,68 @@ RecorderOutput::EncoderToFile(Error &error)
}
}
-static bool
-recorder_output_open(AudioOutput *ao,
- AudioFormat &audio_format,
- Error &error)
+inline bool
+RecorderOutput::Open(AudioFormat &audio_format, Error &error)
{
- RecorderOutput *recorder = (RecorderOutput *)ao;
-
/* create the output file */
- recorder->fd = open_cloexec(recorder->path,
- O_CREAT|O_WRONLY|O_TRUNC|O_BINARY,
- 0666);
- if (recorder->fd < 0) {
- error.FormatErrno("Failed to create '%s'", recorder->path);
+ fd = open_cloexec(path,
+ O_CREAT|O_WRONLY|O_TRUNC|O_BINARY,
+ 0666);
+ if (fd < 0) {
+ error.FormatErrno("Failed to create '%s'", path);
return false;
}
/* open the encoder */
- if (!encoder_open(recorder->encoder, audio_format, error)) {
- close(recorder->fd);
- unlink(recorder->path);
+ if (!encoder_open(encoder, audio_format, error)) {
+ close(fd);
+ unlink(path);
return false;
}
- if (!recorder->EncoderToFile(error)) {
- encoder_close(recorder->encoder);
- close(recorder->fd);
- unlink(recorder->path);
+ if (!EncoderToFile(error)) {
+ encoder_close(encoder);
+ close(fd);
+ unlink(path);
return false;
}
return true;
}
-static void
-recorder_output_close(AudioOutput *ao)
+static bool
+recorder_output_open(AudioOutput *ao,
+ AudioFormat &audio_format,
+ Error &error)
{
- RecorderOutput *recorder = (RecorderOutput *)ao;
+ RecorderOutput &recorder = *(RecorderOutput *)ao;
+ return recorder.Open(audio_format, error);
+}
+
+inline void
+RecorderOutput::Close()
+{
/* flush the encoder and write the rest to the file */
- if (encoder_end(recorder->encoder, IgnoreError()))
- recorder->EncoderToFile(IgnoreError());
+ if (encoder_end(encoder, IgnoreError()))
+ EncoderToFile(IgnoreError());
/* now really close everything */
- encoder_close(recorder->encoder);
+ encoder_close(encoder);
+
+ close(fd);
+}
+
+static void
+recorder_output_close(AudioOutput *ao)
+{
+ RecorderOutput &recorder = *(RecorderOutput *)ao;
- close(recorder->fd);
+ recorder.Close();
}
static size_t