aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJ. Alexander Treuman <jat@spatialrift.net>2007-05-26 16:39:55 +0000
committerJ. Alexander Treuman <jat@spatialrift.net>2007-05-26 16:39:55 +0000
commit355d18a593c4e79aae733dbd0bb3157b3b5f7014 (patch)
treea7e4227dde83330eed683c37621a6544811ee94f
parentb3726bcc93c4d7eb8b2b7a4e37a76b467b5bfd29 (diff)
downloadmpd-355d18a593c4e79aae733dbd0bb3157b3b5f7014.tar.gz
mpd-355d18a593c4e79aae733dbd0bb3157b3b5f7014.tar.xz
mpd-355d18a593c4e79aae733dbd0bb3157b3b5f7014.zip
Make pcm_convertAudioFormat return the buffer size. This is necessary
because lsr may return less than the input buffer size, and the rest of the audio code needs to know the new size. This fixes the clicking that was introduced with recent changes to the lsr code. A huge thanks to remiss for figuring this out. git-svn-id: https://svn.musicpd.org/mpd/trunk@6273 09075e82-0dd4-0310-85a5-a0d7c8717e4f
-rw-r--r--src/audioOutput.c14
-rw-r--r--src/outputBuffer.c6
-rw-r--r--src/pcm_utils.c37
-rw-r--r--src/pcm_utils.h6
4 files changed, 32 insertions, 31 deletions
diff --git a/src/audioOutput.c b/src/audioOutput.c
index ccc701451..9f6172088 100644
--- a/src/audioOutput.c
+++ b/src/audioOutput.c
@@ -205,14 +205,12 @@ static void convertAudioFormat(AudioOutput * audioOutput, char **chunkArgPtr,
audioOutput->convBufferLen = size;
}
- pcm_convertAudioFormat(&(audioOutput->inAudioFormat),
- *chunkArgPtr,
- *sizeArgPtr,
- &(audioOutput->outAudioFormat),
- audioOutput->convBuffer,
- &audioOutput->convState);
-
- *sizeArgPtr = size;
+ *sizeArgPtr = pcm_convertAudioFormat(&(audioOutput->inAudioFormat),
+ *chunkArgPtr, *sizeArgPtr,
+ &(audioOutput->outAudioFormat),
+ audioOutput->convBuffer,
+ &audioOutput->convState);
+
*chunkArgPtr = audioOutput->convBuffer;
}
diff --git a/src/outputBuffer.c b/src/outputBuffer.c
index d9cbcdc60..c7ff8b479 100644
--- a/src/outputBuffer.c
+++ b/src/outputBuffer.c
@@ -89,9 +89,9 @@ int sendDataToOutputBuffer(OutputBuffer * cb, InputStream * inStream,
convBufferLen = datalen;
}
data = convBuffer;
- pcm_convertAudioFormat(&(dc->audioFormat), dataIn, dataInLen,
- &(cb->audioFormat), data,
- &(cb->convState));
+ datalen = pcm_convertAudioFormat(&(dc->audioFormat), dataIn,
+ dataInLen, &(cb->audioFormat),
+ data, &(cb->convState));
}
if (replayGainInfo && (replayGainState != REPLAYGAIN_OFF))
diff --git a/src/pcm_utils.c b/src/pcm_utils.c
index 8cc19a9d4..bf4b5e4c8 100644
--- a/src/pcm_utils.c
+++ b/src/pcm_utils.c
@@ -182,10 +182,10 @@ static int pcm_getSampleRateConverter(void)
#endif
#ifdef HAVE_LIBSAMPLERATE
-static int pcm_convertSampleRate(mpd_sint8 channels, mpd_uint32 inSampleRate,
- char *inBuffer, size_t inSize,
- mpd_uint32 outSampleRate, char *outBuffer,
- size_t outSize, ConvState *convState)
+static size_t pcm_convertSampleRate(mpd_sint8 channels, mpd_uint32 inSampleRate,
+ char *inBuffer, size_t inSize,
+ mpd_uint32 outSampleRate, char *outBuffer,
+ size_t outSize, ConvState *convState)
{
static int convalgo = -1;
SRC_DATA *data = &convState->data;
@@ -254,14 +254,14 @@ static int pcm_convertSampleRate(mpd_sint8 channels, mpd_uint32 inSampleRate,
src_float_to_short_array(data->data_out, (short *)outBuffer,
data->output_frames_gen * channels);
- return 1;
+ return data->output_frames_gen * 2 * channels;
}
#else /* !HAVE_LIBSAMPLERATE */
/* resampling code blatantly ripped from ESD */
-static int pcm_convertSampleRate(mpd_sint8 channels, mpd_uint32 inSampleRate,
- char *inBuffer, size_t inSize,
- mpd_uint32 outSampleRate, char *outBuffer,
- size_t outSize, ConvState *convState)
+static size_t pcm_convertSampleRate(mpd_sint8 channels, mpd_uint32 inSampleRate,
+ char *inBuffer, size_t inSize,
+ mpd_uint32 outSampleRate, char *outBuffer,
+ size_t outSize, ConvState *convState)
{
mpd_uint32 rd_dat = 0;
mpd_uint32 wr_dat = 0;
@@ -294,7 +294,7 @@ static int pcm_convertSampleRate(mpd_sint8 channels, mpd_uint32 inSampleRate,
break;
}
- return 1;
+ return outSize;
}
#endif /* !HAVE_LIBSAMPLERATE */
@@ -391,9 +391,9 @@ static char *pcm_convertTo16bit(mpd_sint8 bits, char *inBuffer, size_t inSize,
}
/* outFormat bits must be 16 and channels must be 1 or 2! */
-void pcm_convertAudioFormat(AudioFormat * inFormat, char *inBuffer,
- size_t inSize, AudioFormat * outFormat,
- char *outBuffer, ConvState *convState)
+size_t pcm_convertAudioFormat(AudioFormat * inFormat, char *inBuffer,
+ size_t inSize, AudioFormat * outFormat,
+ char *outBuffer, ConvState *convState)
{
char *buf;
size_t len;
@@ -417,12 +417,15 @@ void pcm_convertAudioFormat(AudioFormat * inFormat, char *inBuffer,
assert(outSize >= len);
memcpy(outBuffer, buf, len);
} else {
- if (!pcm_convertSampleRate(outFormat->channels,
- inFormat->sampleRate, buf, len,
- outFormat->sampleRate, outBuffer,
- outSize, convState))
+ len = pcm_convertSampleRate(outFormat->channels,
+ inFormat->sampleRate, buf, len,
+ outFormat->sampleRate, outBuffer,
+ outSize, convState);
+ if (len == 0)
exit(EXIT_FAILURE);
}
+
+ return len;
}
size_t pcm_sizeOfConvBuffer(AudioFormat * inFormat, size_t inSize,
diff --git a/src/pcm_utils.h b/src/pcm_utils.h
index 800ac27f4..2c6610a75 100644
--- a/src/pcm_utils.h
+++ b/src/pcm_utils.h
@@ -48,9 +48,9 @@ void pcm_volumeChange(char *buffer, int bufferSize, AudioFormat * format,
void pcm_mix(char *buffer1, char *buffer2, size_t bufferSize1,
size_t bufferSize2, AudioFormat * format, float portion1);
-void pcm_convertAudioFormat(AudioFormat * inFormat, char *inBuffer,
- size_t inSize, AudioFormat * outFormat,
- char *outBuffer, ConvState *convState);
+size_t pcm_convertAudioFormat(AudioFormat * inFormat, char *inBuffer,
+ size_t inSize, AudioFormat * outFormat,
+ char *outBuffer, ConvState *convState);
size_t pcm_sizeOfConvBuffer(AudioFormat * inFormat, size_t inSize,
AudioFormat * outFormat);