an attempted fix for bug 1368
- don't close and reopen an audioOutput when it has a fixed output format, and closing and reopening the device is unneccessary when the input audio format changes git-svn-id: https://svn.musicpd.org/mpd/trunk@4908 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
@@ -155,33 +155,38 @@ int initAudioOutput(AudioOutput *ao, ConfigParam * param)
|
|||||||
|
|
||||||
int openAudioOutput(AudioOutput * audioOutput, AudioFormat * audioFormat)
|
int openAudioOutput(AudioOutput * audioOutput, AudioFormat * audioFormat)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret = 0;
|
||||||
|
|
||||||
if (audioOutput->open) {
|
if (audioOutput->open)
|
||||||
if (cmpAudioFormat(audioFormat, &audioOutput->inAudioFormat)
|
{
|
||||||
== 0) {
|
if (0==cmpAudioFormat(audioFormat, &audioOutput->inAudioFormat))
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
closeAudioOutput(audioOutput);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
copyAudioFormat(&audioOutput->inAudioFormat, audioFormat);
|
copyAudioFormat(&audioOutput->inAudioFormat, audioFormat);
|
||||||
|
|
||||||
if (audioOutput->convertAudioFormat) {
|
if (audioOutput->convertAudioFormat)
|
||||||
|
{
|
||||||
copyAudioFormat(&audioOutput->outAudioFormat,
|
copyAudioFormat(&audioOutput->outAudioFormat,
|
||||||
&audioOutput->reqAudioFormat);
|
&audioOutput->reqAudioFormat);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
copyAudioFormat(&audioOutput->outAudioFormat,
|
copyAudioFormat(&audioOutput->outAudioFormat,
|
||||||
&audioOutput->inAudioFormat);
|
&audioOutput->inAudioFormat);
|
||||||
|
if (audioOutput->open) closeAudioOutput(audioOutput);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!audioOutput->open)
|
||||||
|
{
|
||||||
ret = audioOutput->openDeviceFunc(audioOutput);
|
ret = audioOutput->openDeviceFunc(audioOutput);
|
||||||
|
}
|
||||||
|
|
||||||
if (cmpAudioFormat(&audioOutput->inAudioFormat,
|
audioOutput->sameInAndOutFormats =
|
||||||
&audioOutput->outAudioFormat) == 0) {
|
!cmpAudioFormat(&audioOutput->inAudioFormat,
|
||||||
audioOutput->sameInAndOutFormats = 1;
|
&audioOutput->outAudioFormat);
|
||||||
} else
|
|
||||||
audioOutput->sameInAndOutFormats = 0;
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -190,11 +195,10 @@ static void convertAudioFormat(AudioOutput * audioOutput, char **chunkArgPtr,
|
|||||||
int *sizeArgPtr)
|
int *sizeArgPtr)
|
||||||
{
|
{
|
||||||
int size =
|
int size =
|
||||||
pcm_sizeOfOutputBufferForAudioFormatConversion(&
|
pcm_sizeOfOutputBufferForAudioFormatConversion(
|
||||||
(audioOutput->
|
&(audioOutput->inAudioFormat),
|
||||||
inAudioFormat),
|
*sizeArgPtr,
|
||||||
*sizeArgPtr,
|
&(audioOutput->outAudioFormat));
|
||||||
&(audioOutput->outAudioFormat));
|
|
||||||
|
|
||||||
if (size > audioOutput->convBufferLen) {
|
if (size > audioOutput->convBufferLen) {
|
||||||
audioOutput->convBuffer =
|
audioOutput->convBuffer =
|
||||||
@@ -202,8 +206,10 @@ static void convertAudioFormat(AudioOutput * audioOutput, char **chunkArgPtr,
|
|||||||
audioOutput->convBufferLen = size;
|
audioOutput->convBufferLen = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
pcm_convertAudioFormat(&(audioOutput->inAudioFormat), *chunkArgPtr,
|
pcm_convertAudioFormat(&(audioOutput->inAudioFormat),
|
||||||
*sizeArgPtr, &(audioOutput->outAudioFormat),
|
*chunkArgPtr,
|
||||||
|
*sizeArgPtr,
|
||||||
|
&(audioOutput->outAudioFormat),
|
||||||
audioOutput->convBuffer);
|
audioOutput->convBuffer);
|
||||||
|
|
||||||
*sizeArgPtr = size;
|
*sizeArgPtr = size;
|
||||||
|
Reference in New Issue
Block a user