Commit 9ab9b97f authored by Anthony DeRossi's avatar Anthony DeRossi

encoder/flac: only set a serial number for oggflac

This fixes a bug introduced in 87fa6bca where the FLAC encoder fails to initialize unless libFLAC is built with Ogg support. When libFLAC is built without Ogg support, FLAC__stream_encoder_set_ogg_serial_number unconditionally returns false.
parent 88d92ace
...@@ -38,6 +38,7 @@ class FlacEncoder final : public Encoder { ...@@ -38,6 +38,7 @@ class FlacEncoder final : public Encoder {
FLAC__StreamEncoder *const fse; FLAC__StreamEncoder *const fse;
const unsigned compression; const unsigned compression;
const bool oggflac;
PcmBuffer expand_buffer; PcmBuffer expand_buffer;
...@@ -122,7 +123,7 @@ flac_encoder_init(const ConfigBlock &block) ...@@ -122,7 +123,7 @@ flac_encoder_init(const ConfigBlock &block)
} }
static void static void
flac_encoder_setup(FLAC__StreamEncoder *fse, unsigned compression, flac_encoder_setup(FLAC__StreamEncoder *fse, unsigned compression, bool oggflac,
const AudioFormat &audio_format) const AudioFormat &audio_format)
{ {
unsigned bits_per_sample; unsigned bits_per_sample;
...@@ -157,7 +158,7 @@ flac_encoder_setup(FLAC__StreamEncoder *fse, unsigned compression, ...@@ -157,7 +158,7 @@ flac_encoder_setup(FLAC__StreamEncoder *fse, unsigned compression,
throw FormatRuntimeError("error setting flac sample rate to %d", throw FormatRuntimeError("error setting flac sample rate to %d",
audio_format.sample_rate); audio_format.sample_rate);
if (!FLAC__stream_encoder_set_ogg_serial_number(fse, if (oggflac && !FLAC__stream_encoder_set_ogg_serial_number(fse,
GenerateSerial())) GenerateSerial()))
throw FormatRuntimeError("error setting ogg serial number"); throw FormatRuntimeError("error setting ogg serial number");
} }
...@@ -166,11 +167,12 @@ FlacEncoder::FlacEncoder(AudioFormat _audio_format, FLAC__StreamEncoder *_fse, u ...@@ -166,11 +167,12 @@ FlacEncoder::FlacEncoder(AudioFormat _audio_format, FLAC__StreamEncoder *_fse, u
:Encoder(_oggchaining), :Encoder(_oggchaining),
audio_format(_audio_format), fse(_fse), audio_format(_audio_format), fse(_fse),
compression(_compression), compression(_compression),
oggflac(_oggflac),
output_buffer(8192) output_buffer(8192)
{ {
/* this immediately outputs data through callback */ /* this immediately outputs data through callback */
auto init_status = _oggflac ? auto init_status = oggflac ?
FLAC__stream_encoder_init_ogg_stream(fse, FLAC__stream_encoder_init_ogg_stream(fse,
nullptr, WriteCallback, nullptr, WriteCallback,
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
...@@ -209,7 +211,7 @@ PreparedFlacEncoder::Open(AudioFormat &audio_format) ...@@ -209,7 +211,7 @@ PreparedFlacEncoder::Open(AudioFormat &audio_format)
throw std::runtime_error("FLAC__stream_encoder_new() failed"); throw std::runtime_error("FLAC__stream_encoder_new() failed");
try { try {
flac_encoder_setup(fse, compression, audio_format); flac_encoder_setup(fse, compression, oggflac, audio_format);
} catch (...) { } catch (...) {
FLAC__stream_encoder_delete(fse); FLAC__stream_encoder_delete(fse);
throw; throw;
...@@ -222,7 +224,7 @@ void ...@@ -222,7 +224,7 @@ void
FlacEncoder::SendTag(const Tag &tag) FlacEncoder::SendTag(const Tag &tag)
{ {
/* re-initialize encoder since flac_encoder_finish resets everything */ /* re-initialize encoder since flac_encoder_finish resets everything */
flac_encoder_setup(fse, compression, audio_format); flac_encoder_setup(fse, compression, oggflac, audio_format);
FLAC__StreamMetadata *metadata = FLAC__metadata_object_new(FLAC__METADATA_TYPE_VORBIS_COMMENT); FLAC__StreamMetadata *metadata = FLAC__metadata_object_new(FLAC__METADATA_TYPE_VORBIS_COMMENT);
FLAC__StreamMetadata_VorbisComment_Entry entry; FLAC__StreamMetadata_VorbisComment_Entry entry;
......
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