diff --git a/src/audio.c b/src/audio.c index 5de64b447..e340771ca 100644 --- a/src/audio.c +++ b/src/audio.c @@ -152,6 +152,8 @@ void initAudioConfig() { switch(audio_configFormat->sampleRate) { case 48000: case 44100: + case 32000: + case 16000: break; default: ERROR("sample rate %i can not be used for audio output\n", diff --git a/src/flac_decode.c b/src/flac_decode.c index 93c114068..c3780ef58 100644 --- a/src/flac_decode.c +++ b/src/flac_decode.c @@ -35,7 +35,8 @@ #include typedef struct { - unsigned char chunk[CHUNK_SIZE]; +#define FLAC_CHUNK_SIZE 4080 + unsigned char chunk[FLAC_CHUNK_SIZE]; int chunk_length; float time; int bitRate; @@ -417,7 +418,7 @@ FLAC__StreamDecoderWriteStatus flacWrite(const FLAC__SeekableStreamDecoder *dec, u16 = buf[c_chan][c_samp]; uc = (unsigned char *)&u16; for(i=0;i<(data->dc->audioFormat.bits/8);i++) { - if(data->chunk_length>=CHUNK_SIZE) { + if(data->chunk_length>=FLAC_CHUNK_SIZE) { if(flacSendChunk(data)<0) { return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; } diff --git a/src/ogg_decode.c b/src/ogg_decode.c index 39f3bd89e..cda00e6cb 100644 --- a/src/ogg_decode.c +++ b/src/ogg_decode.c @@ -181,7 +181,7 @@ int ogg_decode(OutputBuffer * cb, DecoderControl * dc) int current_section; int eof = 0; long ret; -#define OGG_CHUNK_SIZE 64 +#define OGG_CHUNK_SIZE 4096 char chunk[OGG_CHUNK_SIZE]; int chunkpos = 0; long bitRate = 0; diff --git a/src/pcm_utils.c b/src/pcm_utils.c index ba387a4b1..e0ebf2ecb 100644 --- a/src/pcm_utils.c +++ b/src/pcm_utils.c @@ -218,41 +218,29 @@ void pcm_convertAudioFormat(AudioFormat * inFormat, char * inBuffer, size_t } else { /* only works if outFormat is 16-bit stereo! */ - /* resampling code blatantly ripped from XMMS */ - const int shift = sizeof(mpd_sint16); - int x1 = 0, frac; - mpd_sint32 i, in_samples, out_samples, x, delta; - mpd_sint16 * inptr = (mpd_sint16 *)dataChannelConv; - mpd_sint16 * outptr = (mpd_sint16 *)outBuffer; - mpd_uint32 nlen = (((dataChannelLen >> shift) * - (outFormat->sampleRate)) / + /* resampling code blatantly ripped from ESD */ + mpd_sint32 rd_dat = 0; + mpd_uint32 wr_dat = 0; + mpd_sint16 lsample, rsample; + register mpd_sint16 * out = (mpd_sint16 *)outBuffer; + register mpd_sint16 * in = (mpd_sint16 *)dataChannelConv; + const int shift = sizeof(mpd_sint16); + mpd_uint32 nlen = ((( dataChannelLen >> shift) * + (mpd_uint32)(outFormat->sampleRate)) / inFormat->sampleRate); - nlen <<= shift; - in_samples = dataChannelLen >> shift; - out_samples = nlen >> shift; - //printf("in_samples=%i out_samples=%i\n",in_samples,out_samples); - delta = ((in_samples-1) << 12) / (out_samples-1); - for(x = 0, i = 0; i < out_samples; i++) { - //int i1,i2,i3,i4; - x1 = (x >> 12) << 12; - frac = x - x1; - /* i1 = (x1 >> 12) << 1; - i2 = ((x1 >> 12) + 1) << 1; - i3 = ((x1 >> 12) << 1) + 1; - i4 = (((x1 >> 12) + 1) << 1) + 1; - printf("%i,%i,%i,%i\n",i1,i2,i3,i4);*/ - *outptr++ = - ((inptr[(x1 >> 12) << 1] * - ((1<<12) - frac) + - inptr[((x1 >> 12) + 1) << 1 ] * - frac) >> 12); - *outptr++ = - ((inptr[((x1 >> 12) << 1) + 1] * - ((1<<12) - frac) + - inptr[(((x1 >> 12) + 1) << 1) + 1] * - frac) >> 12); - x += delta; - } + nlen <<= shift; + + while( wr_dat < nlen / shift) { + rd_dat = wr_dat * inFormat->sampleRate / + outFormat->sampleRate; + rd_dat &= ~1; + + lsample = in[ rd_dat++ ]; + rsample = in[ rd_dat++ ]; + + out[ wr_dat++ ] = lsample; + out[ wr_dat++ ] = rsample; + } } return;