summaryrefslogtreecommitdiff
path: root/streamer.c
diff options
context:
space:
mode:
authorGravatar waker <wakeroid@gmail.com>2009-08-29 23:04:23 +0200
committerGravatar waker <wakeroid@gmail.com>2009-08-29 23:04:35 +0200
commit2b088104790e6f752e1c342d6c4caf7dc23755fd (patch)
treebdd4c984daaeed5c6e84cfb2daeda374c5b40380 /streamer.c
parentf4d508b243888a9dbe79b5916e497254d370e35a (diff)
read_float32 support in mad mp3 decoder and streamer
Diffstat (limited to 'streamer.c')
-rw-r--r--streamer.c53
1 files changed, 40 insertions, 13 deletions
diff --git a/streamer.c b/streamer.c
index b5dafebc..91ae3cda 100644
--- a/streamer.c
+++ b/streamer.c
@@ -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 ();