diff options
author | Darren Salt <linux@youmustbejoking.demon.co.uk> | 2010-01-17 20:25:45 +0000 |
---|---|---|
committer | Darren Salt <linux@youmustbejoking.demon.co.uk> | 2010-01-17 20:25:45 +0000 |
commit | 04ef2788ad1b74fcbc767a76662553d969c0da4d (patch) | |
tree | e69bfb560ae0f9eef7579afb37ad16dd67190309 /src/combined | |
parent | a9c145bf2c701b9fe60795b16856e37038f5e740 (diff) | |
parent | e890141a04b1e79feddf17b4db460050a25f613e (diff) | |
download | xine-lib-04ef2788ad1b74fcbc767a76662553d969c0da4d.tar.gz xine-lib-04ef2788ad1b74fcbc767a76662553d969c0da4d.tar.bz2 |
Merge from 1.1, omitting .qtl support (already present).
--HG--
rename : src/combined/decoder_flac.c => src/combined/flac_decoder.c
Diffstat (limited to 'src/combined')
-rw-r--r-- | src/combined/flac_decoder.c | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/src/combined/flac_decoder.c b/src/combined/flac_decoder.c index 312749c7b..0b2250678 100644 --- a/src/combined/flac_decoder.c +++ b/src/combined/flac_decoder.c @@ -114,7 +114,7 @@ flac_write_callback (const FLAC__StreamDecoder *decoder, flac_decoder_t *this = (flac_decoder_t *)client_data; audio_buffer_t *audio_buffer = NULL; int samples_left = frame->header.blocksize; - int bytes_per_sample = (frame->header.bits_per_sample == 8)?1:2; + int bytes_per_sample = (frame->header.bits_per_sample <= 8) ? 1 : 2; int buf_samples; int8_t *data8; int16_t *data16; @@ -131,21 +131,31 @@ flac_write_callback (const FLAC__StreamDecoder *decoder, else buf_samples = samples_left; - - if( frame->header.bits_per_sample == 8 ) { + switch (frame->header.bits_per_sample) { + case 8: data8 = (int8_t *)audio_buffer->mem; for( j=0; j < buf_samples; j++ ) for( i=0; i < frame->header.channels; i++ ) *data8++ = buffer[i][j]; + break; - } else { - + case 16: data16 = (int16_t *)audio_buffer->mem; for( j=0; j < buf_samples; j++ ) for( i=0; i < frame->header.channels; i++ ) *data16++ = buffer[i][j]; + break; + + case 24: + data16 = (int16_t *)audio_buffer->mem; + + for( j=0; j < buf_samples; j++ ) + for( i=0; i < frame->header.channels; i++ ) + *data16++ = buffer[i][j] >> 8; + break; + } audio_buffer->num_frames = buf_samples; @@ -250,14 +260,13 @@ flac_decode_data (audio_decoder_t *this_gen, buf_element_t *buf) if (!this->output_open) { + const int bits = this->bits_per_sample; this->output_open = (this->stream->audio_out->open) ( this->stream->audio_out, this->stream, - bits_per_sample, - sample_rate, + bits > 16 ? 16 : bits, + this->sample_rate, mode); - - } this->buf_pos = 0; } else if (this->output_open) |