diff options
author | waker <wakeroid@gmail.com> | 2009-08-29 23:04:23 +0200 |
---|---|---|
committer | waker <wakeroid@gmail.com> | 2009-08-29 23:04:35 +0200 |
commit | 2b088104790e6f752e1c342d6c4caf7dc23755fd (patch) | |
tree | bdd4c984daaeed5c6e84cfb2daeda374c5b40380 /streamer.c | |
parent | f4d508b243888a9dbe79b5916e497254d370e35a (diff) |
read_float32 support in mad mp3 decoder and streamer
Diffstat (limited to 'streamer.c')
-rw-r--r-- | streamer.c | 53 |
1 files changed, 40 insertions, 13 deletions
@@ -219,11 +219,11 @@ streamer_read_async (char *bytes, int size) { if (decoder->info.samplerate == p_get_rate ()) { int i; if (decoder->info.channels == 2) { - bytesread = decoder->read (bytes, size); + bytesread = decoder->read_int16 (bytes, size); codec_unlock (); } else { - bytesread = decoder->read (g_readbuffer, size/2); + bytesread = decoder->read_int16 (g_readbuffer, size/2); codec_unlock (); for (i = 0; i < size/4; i++) { int16_t sample = (int16_t)(((int32_t)(((int16_t*)g_readbuffer)[i]))); @@ -243,6 +243,7 @@ streamer_read_async (char *bytes, int size) { assert (src_is_valid_ratio ((double)p_get_rate ()/samplerate)); // read data at source samplerate (with some room for SRC) int nbytes = (nsamples - codecleft) * 2 * nchannels; + int samplesize = 2; if (nbytes < 0) { nbytes = 0; } @@ -251,23 +252,49 @@ streamer_read_async (char *bytes, int size) { // printf ("FATAL: nbytes=%d, nsamples=%d, codecleft=%d, nchannels=%d, ratio=%f\n", nbytes, nsamples, codecleft, nchannels, (float)p_get_rate ()/samplerate); // assert ((nbytes & 3) == 0); // } - bytesread = decoder->read (g_readbuffer, nbytes); + if (!decoder->read_float32) { + bytesread = decoder->read_int16 (g_readbuffer, nbytes); + } + else { + samplesize = 4; + } } codec_unlock (); // recalculate nsamples according to how many bytes we've got - nsamples = bytesread / (2 * nchannels) + codecleft; - // convert to float int i; - float *fbuffer = g_fbuffer + codecleft*2; - if (nchannels == 2) { - for (i = 0; i < (nsamples - codecleft) * 2; i++) { - fbuffer[i] = ((int16_t *)g_readbuffer)[i]/32767.f; + if (!decoder->read_float32) { + nsamples = bytesread / (samplesize * nchannels) + codecleft; + // convert to float + float *fbuffer = g_fbuffer + codecleft*2; + if (nchannels == 2) { + for (i = 0; i < (nsamples - codecleft) * 2; i++) { + fbuffer[i] = ((int16_t *)g_readbuffer)[i]/32767.f; + } + } + else if (nchannels == 1) { // convert mono to stereo + for (i = 0; i < (nsamples - codecleft); i++) { + fbuffer[i*2+0] = ((int16_t *)g_readbuffer)[i]/32767.f; + fbuffer[i*2+1] = fbuffer[i*2+0]; + } } } - else if (nchannels == 1) { // convert mono to stereo - for (i = 0; i < (nsamples - codecleft); i++) { - fbuffer[i*2+0] = ((int16_t *)g_readbuffer)[i]/32767.f; - fbuffer[i*2+1] = fbuffer[i*2+0]; + else { + float *fbuffer = g_fbuffer + codecleft*2; + if (nchannels == 1) { + codec_lock (); + bytesread = decoder->read_float32 (g_readbuffer, nbytes*2); + codec_unlock (); + nsamples = bytesread / (samplesize * nchannels) + codecleft; + for (i = 0; i < (nsamples - codecleft); i++) { + fbuffer[i*2+0] = ((float *)g_readbuffer)[i]; + fbuffer[i*2+1] = fbuffer[i*2+0]; + } + } + else { + codec_lock (); + bytesread = decoder->read_float32 ((char *)fbuffer, nbytes*2); + codec_unlock (); + nsamples = bytesread / (samplesize * nchannels) + codecleft; } } //codec_lock (); |