Commit 48092136 authored by Viliam Mateicka's avatar Viliam Mateicka

flac_encoder: add support for libFLAC < 1.1.3

parent c77fa296
...@@ -44,6 +44,7 @@ struct flac_encoder { ...@@ -44,6 +44,7 @@ struct flac_encoder {
extern const struct encoder_plugin flac_encoder_plugin; extern const struct encoder_plugin flac_encoder_plugin;
static inline GQuark static inline GQuark
flac_encoder_quark(void) flac_encoder_quark(void)
{ {
...@@ -92,6 +93,8 @@ static bool ...@@ -92,6 +93,8 @@ static bool
flac_encoder_setup(struct flac_encoder *encoder, unsigned bits_per_sample, flac_encoder_setup(struct flac_encoder *encoder, unsigned bits_per_sample,
GError **error) GError **error)
{ {
#if !defined(FLAC_API_VERSION_CURRENT) || FLAC_API_VERSION_CURRENT <= 7
#else
if ( !FLAC__stream_encoder_set_compression_level(encoder->fse, if ( !FLAC__stream_encoder_set_compression_level(encoder->fse,
encoder->compression)) { encoder->compression)) {
g_set_error(error, flac_encoder_quark(), 0, g_set_error(error, flac_encoder_quark(), 0,
...@@ -99,6 +102,7 @@ flac_encoder_setup(struct flac_encoder *encoder, unsigned bits_per_sample, ...@@ -99,6 +102,7 @@ flac_encoder_setup(struct flac_encoder *encoder, unsigned bits_per_sample,
encoder->compression); encoder->compression);
return false; return false;
} }
#endif
if ( !FLAC__stream_encoder_set_channels(encoder->fse, if ( !FLAC__stream_encoder_set_channels(encoder->fse,
encoder->audio_format.channels)) { encoder->audio_format.channels)) {
g_set_error(error, flac_encoder_quark(), 0, g_set_error(error, flac_encoder_quark(), 0,
...@@ -139,13 +143,23 @@ flac_write_callback(G_GNUC_UNUSED const FLAC__StreamEncoder *fse, ...@@ -139,13 +143,23 @@ flac_write_callback(G_GNUC_UNUSED const FLAC__StreamEncoder *fse,
return FLAC__STREAM_ENCODER_WRITE_STATUS_OK; return FLAC__STREAM_ENCODER_WRITE_STATUS_OK;
} }
static void
flac_encoder_close(struct encoder *_encoder)
{
struct flac_encoder *encoder = (struct flac_encoder *)_encoder;
FLAC__stream_encoder_delete(encoder->fse);
pcm_buffer_deinit(&encoder->buffer);
pcm_buffer_deinit(&encoder->expand_buffer);
}
static bool static bool
flac_encoder_open(struct encoder *_encoder, struct audio_format *audio_format, flac_encoder_open(struct encoder *_encoder, struct audio_format *audio_format,
GError **error) GError **error)
{ {
struct flac_encoder *encoder = (struct flac_encoder *)_encoder; struct flac_encoder *encoder = (struct flac_encoder *)_encoder;
unsigned bits_per_sample; unsigned bits_per_sample;
FLAC__StreamEncoderInitStatus init_status;
encoder->audio_format = *audio_format; encoder->audio_format = *audio_format;
...@@ -187,6 +201,27 @@ flac_encoder_open(struct encoder *_encoder, struct audio_format *audio_format, ...@@ -187,6 +201,27 @@ flac_encoder_open(struct encoder *_encoder, struct audio_format *audio_format,
/* this immediatelly outputs data throught callback */ /* this immediatelly outputs data throught callback */
#if !defined(FLAC_API_VERSION_CURRENT) || FLAC_API_VERSION_CURRENT <= 7
{
FLAC__StreamEncoderState init_status;
FLAC__stream_encoder_set_write_callback(encoder->fse,
flac_write_callback);
init_status = FLAC__stream_encoder_init(encoder->fse);
if (init_status != FLAC__STREAM_ENCODER_OK) {
g_set_error(error, flac_encoder_quark(), 0,
"failed to initialize encoder: %s\n",
FLAC__StreamEncoderStateString[init_status]);
flac_encoder_close(_encoder);
return false;
}
}
#else
{
FLAC__StreamEncoderInitStatus init_status;
init_status = FLAC__stream_encoder_init_stream(encoder->fse, init_status = FLAC__stream_encoder_init_stream(encoder->fse,
flac_write_callback, flac_write_callback,
NULL, NULL, NULL, encoder); NULL, NULL, NULL, encoder);
...@@ -195,30 +230,23 @@ flac_encoder_open(struct encoder *_encoder, struct audio_format *audio_format, ...@@ -195,30 +230,23 @@ flac_encoder_open(struct encoder *_encoder, struct audio_format *audio_format,
g_set_error(error, flac_encoder_quark(), 0, g_set_error(error, flac_encoder_quark(), 0,
"failed to initialize encoder: %s\n", "failed to initialize encoder: %s\n",
FLAC__StreamEncoderInitStatusString[init_status]); FLAC__StreamEncoderInitStatusString[init_status]);
FLAC__stream_encoder_delete(encoder->fse); flac_encoder_close(_encoder);
return false; return false;
} }
}
#endif
return true; return true;
} }
static void
flac_encoder_close(struct encoder *_encoder)
{
struct flac_encoder *encoder = (struct flac_encoder *)_encoder;
FLAC__stream_encoder_delete(encoder->fse);
pcm_buffer_deinit(&encoder->buffer);
pcm_buffer_deinit(&encoder->expand_buffer);
}
static bool static bool
flac_encoder_flush(struct encoder *_encoder, G_GNUC_UNUSED GError **error) flac_encoder_flush(struct encoder *_encoder, G_GNUC_UNUSED GError **error)
{ {
struct flac_encoder *encoder = (struct flac_encoder *)_encoder; struct flac_encoder *encoder = (struct flac_encoder *)_encoder;
return FLAC__stream_encoder_finish(encoder->fse); (void) FLAC__stream_encoder_finish(encoder->fse);
return true;
} }
static inline void static inline void
...@@ -314,3 +342,4 @@ const struct encoder_plugin flac_encoder_plugin = { ...@@ -314,3 +342,4 @@ const struct encoder_plugin flac_encoder_plugin = {
.write = flac_encoder_write, .write = flac_encoder_write,
.read = flac_encoder_read, .read = flac_encoder_read,
}; };
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment