From cc7fbb61e13ead2b4637f28aaa0c61441aed84a2 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 23 Sep 2008 23:59:54 +0200 Subject: flac: assume the buffer is empty in flacWrite() II The previous patch on this topic was incomplete: it still added data->chunk_length when calling flac_convert(). Remove this, too. --- src/inputPlugins/flac_plugin.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/inputPlugins/flac_plugin.c b/src/inputPlugins/flac_plugin.c index 89e988a03..f66ca4845 100644 --- a/src/inputPlugins/flac_plugin.c +++ b/src/inputPlugins/flac_plugin.c @@ -271,11 +271,11 @@ static FLAC__StreamDecoderWriteStatus flacWrite(const flac_decoder *dec, num_samples = max_samples; if (num_channels == 2 && bytes_per_sample == 2) - flac_convert_stereo16(data->chunk + data->chunk_length, + flac_convert_stereo16(data->chunk, buf, c_samp, c_samp + num_samples); else - flac_convert(data->chunk + data->chunk_length, + flac_convert(data->chunk, num_channels, bytes_per_sample, buf, c_samp, c_samp + num_samples); data->chunk_length = num_samples * bytes_per_channel; @@ -437,10 +437,6 @@ static int flac_decode_internal(InputStream * inStream, int is_ogg) flacPrintErroredState(flac_get_state(flacDec)); flac_finish(flacDec); } - /* send last little bit */ - if (data.chunk_length > 0 && !dc_intr()) - flacSendChunk(&data); - fail: if (data.replayGainInfo) freeReplayGainInfo(data.replayGainInfo); -- cgit v1.2.3 From a1c420d3f82da922821de8fd85bbea5eae54c3c3 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 23 Sep 2008 23:59:54 +0200 Subject: flac: moved code from flacWrite() to _flac_common.c There is still a lot of duplicated code in flac_plugin.c and oggflac_plugin.c. Move code from flac_plugin.c to _flac_common.c, and use the new function flac_common_write() also in oggflac_plugin.c, porting lots of optimizations over to it. --- src/inputPlugins/_flac_common.c | 85 +++++++++++++++++++++++++++++++++++++++ src/inputPlugins/_flac_common.h | 12 ++---- src/inputPlugins/flac_plugin.c | 69 +------------------------------ src/inputPlugins/oggflac_plugin.c | 44 +------------------- 4 files changed, 90 insertions(+), 120 deletions(-) (limited to 'src') diff --git a/src/inputPlugins/_flac_common.c b/src/inputPlugins/_flac_common.c index 9950f75db..ddf25a0b9 100644 --- a/src/inputPlugins/_flac_common.c +++ b/src/inputPlugins/_flac_common.c @@ -194,4 +194,89 @@ void flac_error_common_cb(const char *plugin, } } +/* keep this inlined, this is just macro but prettier :) */ +static inline enum dc_action flacSendChunk(FlacData * data) +{ + enum dc_action ret = ob_send(data->chunk, data->chunk_length, + data->time, data->bitRate, + data->replayGainInfo); + data->chunk_length = 0; + return ret; +} + +static void flac_convert_stereo16(unsigned char *dest, + const FLAC__int32 * const buf[], + unsigned int position, unsigned int end) +{ + for (; position < end; ++position) { + *(uint16_t*)dest = buf[0][position]; + dest += 2; + *(uint16_t*)dest = buf[1][position]; + dest += 2; + } +} + +static void flac_convert(unsigned char *dest, + unsigned int num_channels, + unsigned int bytes_per_sample, + const FLAC__int32 * const buf[], + unsigned int position, unsigned int end) +{ + unsigned int c_chan, i; + FLAC__uint16 u16; + unsigned char *uc; + + for (; position < end; ++position) { + for (c_chan = 0; c_chan < num_channels; c_chan++) { + u16 = buf[c_chan][position]; + uc = (unsigned char *)&u16; + for (i = 0; i < bytes_per_sample; i++) { + *dest++ = *uc++; + } + } + } +} + +FLAC__StreamDecoderWriteStatus +flac_common_write(FlacData *data, const FLAC__Frame * frame, + const FLAC__int32 *const buf[]) +{ + unsigned int c_samp; + const unsigned int num_channels = frame->header.channels; + const unsigned int bytes_per_sample = (dc.audio_format.bits / 8); + const unsigned int bytes_per_channel = + bytes_per_sample * frame->header.channels; + const unsigned int max_samples = FLAC_CHUNK_SIZE / bytes_per_channel; + unsigned int num_samples; + + assert(dc.audio_format.bits > 0); + + for (c_samp = 0; c_samp < frame->header.blocksize; + c_samp += num_samples) { + num_samples = frame->header.blocksize - c_samp; + if (num_samples > max_samples) + num_samples = max_samples; + + if (num_channels == 2 && bytes_per_sample == 2) + flac_convert_stereo16(data->chunk, + buf, c_samp, + c_samp + num_samples); + else + flac_convert(data->chunk, + num_channels, bytes_per_sample, buf, + c_samp, c_samp + num_samples); + data->chunk_length = num_samples * bytes_per_channel; + + switch (flacSendChunk(data)) { + case DC_ACTION_STOP: + return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; + case DC_ACTION_SEEK: + return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; + default: break; /* compilers are complainers */ + } + } + + return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; +} + #endif /* HAVE_FLAC || HAVE_OGGFLAC */ diff --git a/src/inputPlugins/_flac_common.h b/src/inputPlugins/_flac_common.h index a1b0cac8f..8031f8e69 100644 --- a/src/inputPlugins/_flac_common.h +++ b/src/inputPlugins/_flac_common.h @@ -160,15 +160,9 @@ void flac_error_common_cb(const char *plugin, struct mpd_tag *copyVorbisCommentBlockToMpdTag(const FLAC__StreamMetadata * block, struct mpd_tag *tag); -/* keep this inlined, this is just macro but prettier :) */ -static inline enum dc_action flacSendChunk(FlacData * data) -{ - enum dc_action ret = ob_send(data->chunk, data->chunk_length, - data->time, data->bitRate, - data->replayGainInfo); - data->chunk_length = 0; - return ret; -} +FLAC__StreamDecoderWriteStatus +flac_common_write(FlacData *data, const FLAC__Frame * frame, + const FLAC__int32 *const buf[]); #endif /* HAVE_FLAC || HAVE_OGGFLAC */ diff --git a/src/inputPlugins/flac_plugin.c b/src/inputPlugins/flac_plugin.c index f66ca4845..2bf5a29bf 100644 --- a/src/inputPlugins/flac_plugin.c +++ b/src/inputPlugins/flac_plugin.c @@ -199,39 +199,6 @@ static void flacMetadata(mpd_unused const flac_decoder * dec, flac_metadata_common_cb(block, (FlacData *) vdata); } -static void flac_convert_stereo16(unsigned char *dest, - const FLAC__int32 * const buf[], - unsigned int position, unsigned int end) -{ - for (; position < end; ++position) { - *(uint16_t*)dest = buf[0][position]; - dest += 2; - *(uint16_t*)dest = buf[1][position]; - dest += 2; - } -} - -static void flac_convert(unsigned char *dest, - unsigned int num_channels, - unsigned int bytes_per_sample, - const FLAC__int32 * const buf[], - unsigned int position, unsigned int end) -{ - unsigned int c_chan, i; - FLAC__uint16 u16; - unsigned char *uc; - - for (; position < end; ++position) { - for (c_chan = 0; c_chan < num_channels; c_chan++) { - u16 = buf[c_chan][position]; - uc = (unsigned char *)&u16; - for (i = 0; i < bytes_per_sample; i++) { - *dest++ = *uc++; - } - } - } -} - static FLAC__StreamDecoderWriteStatus flacWrite(const flac_decoder *dec, const FLAC__Frame * frame, const FLAC__int32 * const buf[], @@ -239,18 +206,9 @@ static FLAC__StreamDecoderWriteStatus flacWrite(const flac_decoder *dec, { FlacData *data = (FlacData *) vdata; FLAC__uint32 samples = frame->header.blocksize; - unsigned int c_samp; - const unsigned int num_channels = frame->header.channels; - const unsigned int bytes_per_sample = (dc.audio_format.bits / 8); - const unsigned int bytes_per_channel = - bytes_per_sample * frame->header.channels; - const unsigned int max_samples = FLAC_CHUNK_SIZE / bytes_per_channel; - unsigned int num_samples; float timeChange; FLAC__uint64 newPosition = 0; - assert(dc.audio_format.bits > 0); - timeChange = ((float)samples) / frame->header.sample_rate; data->time += timeChange; @@ -264,32 +222,7 @@ static FLAC__StreamDecoderWriteStatus flacWrite(const flac_decoder *dec, } data->position = newPosition; - for (c_samp = 0; c_samp < frame->header.blocksize; - c_samp += num_samples) { - num_samples = frame->header.blocksize - c_samp; - if (num_samples > max_samples) - num_samples = max_samples; - - if (num_channels == 2 && bytes_per_sample == 2) - flac_convert_stereo16(data->chunk, - buf, c_samp, - c_samp + num_samples); - else - flac_convert(data->chunk, - num_channels, bytes_per_sample, buf, - c_samp, c_samp + num_samples); - data->chunk_length = num_samples * bytes_per_channel; - - switch (flacSendChunk(data)) { - case DC_ACTION_STOP: - return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; - case DC_ACTION_SEEK: - return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; - default: break; /* compilers are complainers */ - } - } - - return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; + return flac_common_write(data, frame, buf); } static struct mpd_tag *flacMetadataDup(char *file, int *vorbisCommentFound) diff --git a/src/inputPlugins/oggflac_plugin.c b/src/inputPlugins/oggflac_plugin.c index 841030481..49da3dd39 100644 --- a/src/inputPlugins/oggflac_plugin.c +++ b/src/inputPlugins/oggflac_plugin.c @@ -162,51 +162,12 @@ static FLAC__StreamDecoderWriteStatus oggflacWrite(mpd_unused const { FlacData *data = (FlacData *) vdata; FLAC__uint32 samples = frame->header.blocksize; - FLAC__uint16 u16; - unsigned char *uc; - unsigned int c_samp, c_chan; - int i; float timeChange; timeChange = ((float)samples) / frame->header.sample_rate; data->time += timeChange; - /* ogg123 uses a complicated method of calculating bitrate - * with averaging which I'm not too fond of. - * (waste of memory/CPU cycles, especially given this is _lossless_) - * a get_decode_position() is not available in OggFLAC, either - * - * this does not give an accurate bitrate: - * (bytes_last_read was set in the read callback) - data->bitRate = ((8.0 * data->bytes_last_read * - frame->header.sample_rate) - /((float)samples * 1000)) + 0.5; - */ - - for (c_samp = 0; c_samp < frame->header.blocksize; c_samp++) { - for (c_chan = 0; c_chan < frame->header.channels; - c_chan++) { - u16 = buf[c_chan][c_samp]; - uc = (unsigned char *)&u16; - for (i = 0; i < (dc.audio_format.bits / 8); i++) { - if (data->chunk_length >= FLAC_CHUNK_SIZE) { - /* FIXME: line wrapping */ - switch (flacSendChunk(data)) { - case DC_ACTION_STOP: - return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; - case DC_ACTION_SEEK: - return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; - default: - /* compilers are complainers */ - break; - } - } - data->chunk[data->chunk_length++] = *(uc++); - } - } - } - - return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; + return flac_common_write(data, frame, buf); } /* used by TagDup */ @@ -380,9 +341,6 @@ static int oggflac_decode(InputStream * inStream) (OggFLAC__seekable_stream_decoder_get_state(decoder)); OggFLAC__seekable_stream_decoder_finish(decoder); } - /* send last little bit */ - if (data.chunk_length > 0 && !dc_intr()) - flacSendChunk(&data); fail: oggflac_cleanup(&data, decoder); -- cgit v1.2.3 From 1fb82d55a7a1d2c378cab79b03342b8ac471ab64 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 23 Sep 2008 23:59:54 +0200 Subject: flac: use signed integers in flac_convert_stereo16() By mistake, I casted the sample value to uint16_t, which is wrong. This patch simplifies the code by using a int16_t pointer instead of casting to int16_t* every time. --- src/inputPlugins/_flac_common.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/inputPlugins/_flac_common.c b/src/inputPlugins/_flac_common.c index ddf25a0b9..3085660b3 100644 --- a/src/inputPlugins/_flac_common.c +++ b/src/inputPlugins/_flac_common.c @@ -204,15 +204,13 @@ static inline enum dc_action flacSendChunk(FlacData * data) return ret; } -static void flac_convert_stereo16(unsigned char *dest, +static void flac_convert_stereo16(int16_t *dest, const FLAC__int32 * const buf[], unsigned int position, unsigned int end) { for (; position < end; ++position) { - *(uint16_t*)dest = buf[0][position]; - dest += 2; - *(uint16_t*)dest = buf[1][position]; - dest += 2; + *dest++ = buf[0][position]; + *dest++ = buf[1][position]; } } @@ -258,7 +256,7 @@ flac_common_write(FlacData *data, const FLAC__Frame * frame, num_samples = max_samples; if (num_channels == 2 && bytes_per_sample == 2) - flac_convert_stereo16(data->chunk, + flac_convert_stereo16((int16_t*)data->chunk, buf, c_samp, c_samp + num_samples); else -- cgit v1.2.3 From 5947658caddf0de8288fbae43afaee3c75003ecd Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 23 Sep 2008 23:59:55 +0200 Subject: flac: added optimized converter for 16 bit flac_convert_16() runs a lot faster than the generic (and quite buggy) function flac_convert(). flac_convert_16() is only used for non-stereo files, since there is already flac_convert_stereo16(). --- src/inputPlugins/_flac_common.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'src') diff --git a/src/inputPlugins/_flac_common.c b/src/inputPlugins/_flac_common.c index 3085660b3..7ccdce1ac 100644 --- a/src/inputPlugins/_flac_common.c +++ b/src/inputPlugins/_flac_common.c @@ -214,6 +214,19 @@ static void flac_convert_stereo16(int16_t *dest, } } +static void +flac_convert_16(int16_t *dest, + unsigned int num_channels, + const FLAC__int32 * const buf[], + unsigned int position, unsigned int end) +{ + unsigned int c_chan; + + for (; position < end; ++position) + for (c_chan = 0; c_chan < num_channels; c_chan++) + *dest++ = buf[c_chan][position]; +} + static void flac_convert(unsigned char *dest, unsigned int num_channels, unsigned int bytes_per_sample, @@ -259,6 +272,10 @@ flac_common_write(FlacData *data, const FLAC__Frame * frame, flac_convert_stereo16((int16_t*)data->chunk, buf, c_samp, c_samp + num_samples); + else if (bytes_per_sample == 2) + flac_convert_16((int16_t*)data->chunk, + num_channels, buf, c_samp, + c_samp + num_samples); else flac_convert(data->chunk, num_channels, bytes_per_sample, buf, -- cgit v1.2.3 From 3c2c329e8450f59ccafb6ab973948d5da05951e5 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 23 Sep 2008 23:59:55 +0200 Subject: flac: added special functions for 8 and 32 bit Same optimization for 8 and 32 bit files, like the previous patch for 16 bit. Along the way, this patch adds 24 bit FLAC support! --- src/inputPlugins/_flac_common.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'src') diff --git a/src/inputPlugins/_flac_common.c b/src/inputPlugins/_flac_common.c index 7ccdce1ac..aedd78396 100644 --- a/src/inputPlugins/_flac_common.c +++ b/src/inputPlugins/_flac_common.c @@ -227,6 +227,35 @@ flac_convert_16(int16_t *dest, *dest++ = buf[c_chan][position]; } +/** + * Note: this function also handles 24 bit files! + */ +static void +flac_convert_32(int32_t *dest, + unsigned int num_channels, + const FLAC__int32 * const buf[], + unsigned int position, unsigned int end) +{ + unsigned int c_chan; + + for (; position < end; ++position) + for (c_chan = 0; c_chan < num_channels; c_chan++) + *dest++ = buf[c_chan][position]; +} + +static void +flac_convert_8(int8_t *dest, + unsigned int num_channels, + const FLAC__int32 * const buf[], + unsigned int position, unsigned int end) +{ + unsigned int c_chan; + + for (; position < end; ++position) + for (c_chan = 0; c_chan < num_channels; c_chan++) + *dest++ = buf[c_chan][position]; +} + static void flac_convert(unsigned char *dest, unsigned int num_channels, unsigned int bytes_per_sample, @@ -276,6 +305,14 @@ flac_common_write(FlacData *data, const FLAC__Frame * frame, flac_convert_16((int16_t*)data->chunk, num_channels, buf, c_samp, c_samp + num_samples); + else if (bytes_per_sample == 4) + flac_convert_32((int32_t*)data->chunk, + num_channels, buf, c_samp, + c_samp + num_samples); + else if (bytes_per_sample == 1) + flac_convert_8((int8_t*)data->chunk, + num_channels, buf, c_samp, + c_samp + num_samples); else flac_convert(data->chunk, num_channels, bytes_per_sample, buf, -- cgit v1.2.3 From 09edfb67ec85096ec148852e673f370d39b05b9d Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 23 Sep 2008 23:59:55 +0200 Subject: flac: removed generic sample size support Support for bit rates except 16 bits (and 8 bits on little endian) has always been broken. Since we added optimized functions for 8, 16, 24/32 bits, we can remove the generic flac_convert() function. Instead of removing it, convert it to a wrapper function for flac_convert_*(). --- src/inputPlugins/_flac_common.c | 58 +++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 31 deletions(-) (limited to 'src') diff --git a/src/inputPlugins/_flac_common.c b/src/inputPlugins/_flac_common.c index aedd78396..1ca3aa8c0 100644 --- a/src/inputPlugins/_flac_common.c +++ b/src/inputPlugins/_flac_common.c @@ -262,18 +262,25 @@ static void flac_convert(unsigned char *dest, const FLAC__int32 * const buf[], unsigned int position, unsigned int end) { - unsigned int c_chan, i; - FLAC__uint16 u16; - unsigned char *uc; + switch (bytes_per_sample) { + case 2: + if (num_channels == 2) + flac_convert_stereo16((int16_t*)dest, buf, + position, end); + else + flac_convert_16((int16_t*)dest, num_channels, buf, + position, end); + break; - for (; position < end; ++position) { - for (c_chan = 0; c_chan < num_channels; c_chan++) { - u16 = buf[c_chan][position]; - uc = (unsigned char *)&u16; - for (i = 0; i < bytes_per_sample; i++) { - *dest++ = *uc++; - } - } + case 4: + flac_convert_32((int32_t*)dest, num_channels, buf, + position, end); + break; + + case 1: + flac_convert_8((int8_t*)dest, num_channels, buf, + position, end); + break; } } @@ -291,32 +298,21 @@ flac_common_write(FlacData *data, const FLAC__Frame * frame, assert(dc.audio_format.bits > 0); + if (bytes_per_sample != 1 && bytes_per_sample != 2 && + bytes_per_sample != 4) + /* exotic unsupported bit rate */ + return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; + for (c_samp = 0; c_samp < frame->header.blocksize; c_samp += num_samples) { num_samples = frame->header.blocksize - c_samp; if (num_samples > max_samples) num_samples = max_samples; - if (num_channels == 2 && bytes_per_sample == 2) - flac_convert_stereo16((int16_t*)data->chunk, - buf, c_samp, - c_samp + num_samples); - else if (bytes_per_sample == 2) - flac_convert_16((int16_t*)data->chunk, - num_channels, buf, c_samp, - c_samp + num_samples); - else if (bytes_per_sample == 4) - flac_convert_32((int32_t*)data->chunk, - num_channels, buf, c_samp, - c_samp + num_samples); - else if (bytes_per_sample == 1) - flac_convert_8((int8_t*)data->chunk, - num_channels, buf, c_samp, - c_samp + num_samples); - else - flac_convert(data->chunk, - num_channels, bytes_per_sample, buf, - c_samp, c_samp + num_samples); + flac_convert(data->chunk, + num_channels, bytes_per_sample, buf, + c_samp, c_samp + num_samples); + data->chunk_length = num_samples * bytes_per_channel; switch (flacSendChunk(data)) { -- cgit v1.2.3 From a748ea5a55f4f5d9f9d58b0e6c7667d61cfde501 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 23 Sep 2008 23:59:55 +0200 Subject: flac: merged flacSendChunk() into flac_common_write() Since flacSendChunk() is a trivial function and is only used in one location, move the code there. The advantage is that calling decoder_data() directly returns the decoder_command value, so we can eliminate one decoder_get_command() call. [ew: using the terser API in the main branch, it always eliminated the dc_intr()/dc_seek() call, but I agree that killing a camel, err.. camelCase function is a good thing] --- src/inputPlugins/_flac_common.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/inputPlugins/_flac_common.c b/src/inputPlugins/_flac_common.c index 1ca3aa8c0..1cbce9488 100644 --- a/src/inputPlugins/_flac_common.c +++ b/src/inputPlugins/_flac_common.c @@ -194,16 +194,6 @@ void flac_error_common_cb(const char *plugin, } } -/* keep this inlined, this is just macro but prettier :) */ -static inline enum dc_action flacSendChunk(FlacData * data) -{ - enum dc_action ret = ob_send(data->chunk, data->chunk_length, - data->time, data->bitRate, - data->replayGainInfo); - data->chunk_length = 0; - return ret; -} - static void flac_convert_stereo16(int16_t *dest, const FLAC__int32 * const buf[], unsigned int position, unsigned int end) @@ -295,6 +285,7 @@ flac_common_write(FlacData *data, const FLAC__Frame * frame, bytes_per_sample * frame->header.channels; const unsigned int max_samples = FLAC_CHUNK_SIZE / bytes_per_channel; unsigned int num_samples; + enum dc_action action; assert(dc.audio_format.bits > 0); @@ -315,7 +306,11 @@ flac_common_write(FlacData *data, const FLAC__Frame * frame, data->chunk_length = num_samples * bytes_per_channel; - switch (flacSendChunk(data)) { + action = ob_send(data->chunk, data->chunk_length, + data->time, data->bitRate, + data->replayGainInfo); + data->chunk_length = 0; + switch (action) { case DC_ACTION_STOP: return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; case DC_ACTION_SEEK: -- cgit v1.2.3 From 198f0117c4d1f87cfed51fd51c5bf7bb50cd5334 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 23 Sep 2008 23:59:55 +0200 Subject: flac: removed FlacData.chunk_length chunk_length can be converted to a local variable, because it is always reset to 0 after it was used. --- src/inputPlugins/_flac_common.c | 9 +++------ src/inputPlugins/_flac_common.h | 1 - src/inputPlugins/flac_plugin.c | 1 - src/inputPlugins/oggflac_plugin.c | 1 - 4 files changed, 3 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/inputPlugins/_flac_common.c b/src/inputPlugins/_flac_common.c index 1cbce9488..beff5d431 100644 --- a/src/inputPlugins/_flac_common.c +++ b/src/inputPlugins/_flac_common.c @@ -32,7 +32,6 @@ void init_FlacData(FlacData * data, InputStream * inStream) { - data->chunk_length = 0; data->time = 0; data->position = 0; data->bitRate = 0; @@ -304,12 +303,10 @@ flac_common_write(FlacData *data, const FLAC__Frame * frame, num_channels, bytes_per_sample, buf, c_samp, c_samp + num_samples); - data->chunk_length = num_samples * bytes_per_channel; - - action = ob_send(data->chunk, data->chunk_length, + action = ob_send(data->chunk, + num_samples * bytes_per_channel, data->time, data->bitRate, - data->replayGainInfo); - data->chunk_length = 0; + data->replayGainInfo); switch (action) { case DC_ACTION_STOP: return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; diff --git a/src/inputPlugins/_flac_common.h b/src/inputPlugins/_flac_common.h index 8031f8e69..f88866b08 100644 --- a/src/inputPlugins/_flac_common.h +++ b/src/inputPlugins/_flac_common.h @@ -140,7 +140,6 @@ typedef size_t flac_read_status_size_t; typedef struct { unsigned char chunk[FLAC_CHUNK_SIZE]; - size_t chunk_length; float time; unsigned int bitRate; FLAC__uint64 position; diff --git a/src/inputPlugins/flac_plugin.c b/src/inputPlugins/flac_plugin.c index 2bf5a29bf..228301291 100644 --- a/src/inputPlugins/flac_plugin.c +++ b/src/inputPlugins/flac_plugin.c @@ -359,7 +359,6 @@ static int flac_decode_internal(InputStream * inStream, int is_ogg) data.time = ((float)sampleToSeek) / dc.audio_format.sampleRate; data.position = 0; - data.chunk_length = 0; } else { dc.seek_where = DC_SEEK_ERROR; } diff --git a/src/inputPlugins/oggflac_plugin.c b/src/inputPlugins/oggflac_plugin.c index 49da3dd39..36bd9dced 100644 --- a/src/inputPlugins/oggflac_plugin.c +++ b/src/inputPlugins/oggflac_plugin.c @@ -328,7 +328,6 @@ static int oggflac_decode(InputStream * inStream) data.time = ((float)sampleToSeek) / dc.audio_format.sampleRate; data.position = 0; - data.chunk_length = 0; } else { dc.seek_where = DC_SEEK_ERROR; } -- cgit v1.2.3