aboutsummaryrefslogtreecommitdiffstats
path: root/src/inputPlugins/_flac_common.c
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2008-09-23 23:59:55 +0200
committerEric Wong <normalperson@yhbt.net>2008-09-29 01:54:51 -0700
commit09edfb67ec85096ec148852e673f370d39b05b9d (patch)
tree26dd25252ac07945e57607a96e27243e2a21fe79 /src/inputPlugins/_flac_common.c
parent3c2c329e8450f59ccafb6ab973948d5da05951e5 (diff)
downloadmpd-09edfb67ec85096ec148852e673f370d39b05b9d.tar.gz
mpd-09edfb67ec85096ec148852e673f370d39b05b9d.tar.xz
mpd-09edfb67ec85096ec148852e673f370d39b05b9d.zip
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_*().
Diffstat (limited to '')
-rw-r--r--src/inputPlugins/_flac_common.c58
1 files changed, 27 insertions, 31 deletions
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)) {