aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/pcm_utils.c68
1 files changed, 41 insertions, 27 deletions
diff --git a/src/pcm_utils.c b/src/pcm_utils.c
index b3191a399..dffdbde8d 100644
--- a/src/pcm_utils.c
+++ b/src/pcm_utils.c
@@ -242,28 +242,42 @@ void pcm_convertAudioFormat(AudioFormat * inFormat, char * inBuffer, size_t
else {
/* only works if outFormat is 16-bit stereo! */
/* resampling code blatantly ripped from ESD */
- mpd_sint32 rd_dat = 0;
+ mpd_uint32 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_sint16 * out = (mpd_sint16 *)outBuffer;
+ mpd_sint16 * in = (mpd_sint16 *)dataChannelConv;
+ const int shift = sizeof(mpd_sint16)*outFormat->channels;
+ mpd_uint32 nlen = ((( dataChannelLen / shift) *
(mpd_uint32)(outFormat->sampleRate)) /
inFormat->sampleRate);
- nlen <<= shift;
+ nlen *= outFormat->channels;
- while( wr_dat < nlen / shift) {
- rd_dat = wr_dat * inFormat->sampleRate /
- outFormat->sampleRate;
- rd_dat &= ~1;
+ switch(outFormat->channels) {
+ case 1:
+ while( wr_dat < nlen) {
+ 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++ ];
- rsample = in[ rd_dat++ ];
+ lsample = in[ rd_dat++ ];
+ rsample = in[ rd_dat++ ];
- out[ wr_dat++ ] = lsample;
- out[ wr_dat++ ] = rsample;
- }
+ out[ wr_dat++ ] = lsample;
+ out[ wr_dat++ ] = rsample;
+ }
+ break;
+ }
}
return;
@@ -272,7 +286,7 @@ void pcm_convertAudioFormat(AudioFormat * inFormat, char * inBuffer, size_t
size_t pcm_sizeOfOutputBufferForAudioFormatConversion(AudioFormat * inFormat,
size_t inSize, AudioFormat * outFormat)
{
- const int shift = sizeof(mpd_sint16);
+ const int shift = sizeof(mpd_sint16)*outFormat->channels;
size_t outSize = inSize;
switch(inFormat->bits) {
@@ -286,21 +300,21 @@ size_t pcm_sizeOfOutputBufferForAudioFormatConversion(AudioFormat * inFormat,
exit(EXIT_FAILURE);
}
- switch(inFormat->channels) {
- case 1:
- outSize = (outSize >> 1) << 2;
- break;
- case 2:
- break;
- default:
- ERROR("only 1 or 2 channels are supported for conversion!\n");
- exit(EXIT_FAILURE);
+ if(inFormat->channels != outFormat->channels) {
+ switch(inFormat->channels) {
+ case 1:
+ outSize = (outSize >> 1) << 2;
+ break;
+ case 2:
+ //outSize >>= 1;
+ break;
+ }
}
- outSize = (((outSize >> shift) * (mpd_uint32)(outFormat->sampleRate)) /
+ outSize = (((outSize / shift) * (mpd_uint32)(outFormat->sampleRate)) /
inFormat->sampleRate);
- outSize <<= shift;
+ outSize *= shift;
return outSize;
}