aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/audio.c2
-rw-r--r--src/flac_decode.c5
-rw-r--r--src/ogg_decode.c2
-rw-r--r--src/pcm_utils.c56
4 files changed, 28 insertions, 37 deletions
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 <FLAC/metadata.h>
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;