diff options
author | Max Kellermann <max@duempel.org> | 2012-04-05 00:03:38 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2012-04-05 00:21:53 +0200 |
commit | 5acee73fc85e44179120a5818247fc0760038cff (patch) | |
tree | 143a8f28c8537041f08ecd64a9d3bfba35a412f4 /src/encoder_plugin.h | |
parent | 466c337bcb71fb6bca0384300586e7213685d53d (diff) | |
download | mpd-5acee73fc85e44179120a5818247fc0760038cff.tar.gz mpd-5acee73fc85e44179120a5818247fc0760038cff.tar.xz mpd-5acee73fc85e44179120a5818247fc0760038cff.zip |
encoder/vorbis: generate end-of-stream packet when playback ends
Add the encoder_plugin method end(). This is important for the
recorder plugin.
Diffstat (limited to '')
-rw-r--r-- | src/encoder_plugin.h | 39 |
1 files changed, 37 insertions, 2 deletions
diff --git a/src/encoder_plugin.h b/src/encoder_plugin.h index af3f76a40..70eee51a2 100644 --- a/src/encoder_plugin.h +++ b/src/encoder_plugin.h @@ -35,7 +35,7 @@ struct encoder { const struct encoder_plugin *plugin; #ifndef NDEBUG - bool open, pre_tag, tag; + bool open, pre_tag, tag, end; #endif }; @@ -53,6 +53,8 @@ struct encoder_plugin { void (*close)(struct encoder *encoder); + bool (*end)(struct encoder *encoder, GError **error); + bool (*flush)(struct encoder *encoder, GError **error); bool (*pre_tag)(struct encoder *encoder, GError **error); @@ -132,7 +134,7 @@ encoder_open(struct encoder *encoder, struct audio_format *audio_format, bool success = encoder->plugin->open(encoder, audio_format, error); #ifndef NDEBUG encoder->open = success; - encoder->pre_tag = encoder->tag = false; + encoder->pre_tag = encoder->tag = encoder->end = false; #endif return success; } @@ -157,6 +159,35 @@ encoder_close(struct encoder *encoder) } /** + * Ends the stream: flushes the encoder object, generate an + * end-of-stream marker (if applicable), make everything which might + * currently be buffered available by encoder_read(). + * + * After this function has been called, the encoder may not be usable + * for more data, and only encoder_read() and encoder_close() can be + * called. + * + * @param encoder the encoder + * @param error location to store the error occuring, or NULL to ignore errors. + * @return true on success + */ +static inline bool +encoder_end(struct encoder *encoder, GError **error) +{ + assert(encoder->open); + assert(!encoder->end); + +#ifndef NDEBUG + encoder->end = true; +#endif + + /* this method is optional */ + return encoder->plugin->end != NULL + ? encoder->plugin->end(encoder, error) + : true; +} + +/** * Flushes an encoder object, make everything which might currently be * buffered available by encoder_read(). * @@ -170,6 +201,7 @@ encoder_flush(struct encoder *encoder, GError **error) assert(encoder->open); assert(!encoder->pre_tag); assert(!encoder->tag); + assert(!encoder->end); /* this method is optional */ return encoder->plugin->flush != NULL @@ -193,6 +225,7 @@ encoder_pre_tag(struct encoder *encoder, GError **error) assert(encoder->open); assert(!encoder->pre_tag); assert(!encoder->tag); + assert(!encoder->end); /* this method is optional */ bool success = encoder->plugin->pre_tag != NULL @@ -222,6 +255,7 @@ encoder_tag(struct encoder *encoder, const struct tag *tag, GError **error) assert(encoder->open); assert(!encoder->pre_tag); assert(encoder->tag); + assert(!encoder->end); #ifndef NDEBUG encoder->tag = false; @@ -249,6 +283,7 @@ encoder_write(struct encoder *encoder, const void *data, size_t length, assert(encoder->open); assert(!encoder->pre_tag); assert(!encoder->tag); + assert(!encoder->end); return encoder->plugin->write(encoder, data, length, error); } |