Commit 48002320 authored by Warren Dukes's avatar Warren Dukes

ok, resampling and converting to mono no works

git-svn-id: https://svn.musicpd.org/mpd/trunk@2309 09075e82-0dd4-0310-85a5-a0d7c8717e4f
parent 12597322
...@@ -242,28 +242,42 @@ void pcm_convertAudioFormat(AudioFormat * inFormat, char * inBuffer, size_t ...@@ -242,28 +242,42 @@ void pcm_convertAudioFormat(AudioFormat * inFormat, char * inBuffer, size_t
else { else {
/* only works if outFormat is 16-bit stereo! */ /* only works if outFormat is 16-bit stereo! */
/* resampling code blatantly ripped from ESD */ /* resampling code blatantly ripped from ESD */
mpd_sint32 rd_dat = 0; mpd_uint32 rd_dat = 0;
mpd_uint32 wr_dat = 0; mpd_uint32 wr_dat = 0;
mpd_sint16 lsample, rsample; mpd_sint16 lsample, rsample;
register mpd_sint16 * out = (mpd_sint16 *)outBuffer; mpd_sint16 * out = (mpd_sint16 *)outBuffer;
register mpd_sint16 * in = (mpd_sint16 *)dataChannelConv; mpd_sint16 * in = (mpd_sint16 *)dataChannelConv;
const int shift = sizeof(mpd_sint16); const int shift = sizeof(mpd_sint16)*outFormat->channels;
mpd_uint32 nlen = ((( dataChannelLen >> shift) * mpd_uint32 nlen = ((( dataChannelLen / shift) *
(mpd_uint32)(outFormat->sampleRate)) / (mpd_uint32)(outFormat->sampleRate)) /
inFormat->sampleRate); inFormat->sampleRate);
nlen <<= shift; nlen *= outFormat->channels;
while( wr_dat < nlen / shift) { switch(outFormat->channels) {
rd_dat = wr_dat * inFormat->sampleRate / case 1:
outFormat->sampleRate; while( wr_dat < nlen) {
rd_dat &= ~1; rd_dat = wr_dat * inFormat->sampleRate /
outFormat->sampleRate;
lsample = in[ rd_dat++ ];
out[ wr_dat++ ] = lsample;
}
break;
case 2:
while( wr_dat < nlen) {
rd_dat = wr_dat * inFormat->sampleRate /
outFormat->sampleRate;
rd_dat &= ~1;
lsample = in[ rd_dat++ ]; lsample = in[ rd_dat++ ];
rsample = in[ rd_dat++ ]; rsample = in[ rd_dat++ ];
out[ wr_dat++ ] = lsample; out[ wr_dat++ ] = lsample;
out[ wr_dat++ ] = rsample; out[ wr_dat++ ] = rsample;
} }
break;
}
} }
return; return;
...@@ -272,7 +286,7 @@ void pcm_convertAudioFormat(AudioFormat * inFormat, char * inBuffer, size_t ...@@ -272,7 +286,7 @@ void pcm_convertAudioFormat(AudioFormat * inFormat, char * inBuffer, size_t
size_t pcm_sizeOfOutputBufferForAudioFormatConversion(AudioFormat * inFormat, size_t pcm_sizeOfOutputBufferForAudioFormatConversion(AudioFormat * inFormat,
size_t inSize, AudioFormat * outFormat) size_t inSize, AudioFormat * outFormat)
{ {
const int shift = sizeof(mpd_sint16); const int shift = sizeof(mpd_sint16)*outFormat->channels;
size_t outSize = inSize; size_t outSize = inSize;
switch(inFormat->bits) { switch(inFormat->bits) {
...@@ -286,21 +300,21 @@ size_t pcm_sizeOfOutputBufferForAudioFormatConversion(AudioFormat * inFormat, ...@@ -286,21 +300,21 @@ size_t pcm_sizeOfOutputBufferForAudioFormatConversion(AudioFormat * inFormat,
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
switch(inFormat->channels) { if(inFormat->channels != outFormat->channels) {
case 1: switch(inFormat->channels) {
outSize = (outSize >> 1) << 2; case 1:
break; outSize = (outSize >> 1) << 2;
case 2: break;
break; case 2:
default: //outSize >>= 1;
ERROR("only 1 or 2 channels are supported for conversion!\n"); break;
exit(EXIT_FAILURE); }
} }
outSize = (((outSize >> shift) * (mpd_uint32)(outFormat->sampleRate)) / outSize = (((outSize / shift) * (mpd_uint32)(outFormat->sampleRate)) /
inFormat->sampleRate); inFormat->sampleRate);
outSize <<= shift; outSize *= shift;
return outSize; return outSize;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment