Commit 468c9900 authored by Eric Wong's avatar Eric Wong

audio: pause/resume-from-statefile bugfixes,

Oops, I broke pause/resuming from a statefile r4514 Everything should be fixed out. Also we now avoid opening the audio device until we have a playable audio_format set. This is a long-standing bug that got exposed more blatantly with the single array. Thanks to MattD in #mpd for reporting my breakage. git-svn-id: https://svn.musicpd.org/mpd/trunk@4516 09075e82-0dd4-0310-85a5-a0d7c8717e4f
parent eb537f84
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
#define AUDIO_DEVICE_STATE_LEN 19 /* strlen(AUDIO_DEVICE_STATE) */ #define AUDIO_DEVICE_STATE_LEN 19 /* strlen(AUDIO_DEVICE_STATE) */
#define AUDIO_BUFFER_SIZE 2*MAXPATHLEN #define AUDIO_BUFFER_SIZE 2*MAXPATHLEN
static AudioFormat audio_format; static AudioFormat audio_format = { 0, 0, 0 };
static AudioFormat *audio_configFormat = NULL; static AudioFormat *audio_configFormat = NULL;
...@@ -269,29 +269,17 @@ int isCurrentAudioFormat(AudioFormat * audioFormat) ...@@ -269,29 +269,17 @@ int isCurrentAudioFormat(AudioFormat * audioFormat)
return 1; return 1;
} }
static int flushAudioBuffer(void) static void syncAudioDeviceStates(void)
{ {
int ret = -1; int i;
int i, err;
if (audioBufferPos == 0)
return 0;
if (!audio_format.channels)
return;
for (i = audioOutputArraySize; --i >= 0; ) { for (i = audioOutputArraySize; --i >= 0; ) {
switch (audioDeviceStates[i]) { switch (audioDeviceStates[i]) {
case DEVICE_ENABLE: case DEVICE_ENABLE:
openAudioOutput(&audioOutputArray[i], &audio_format); openAudioOutput(&audioOutputArray[i], &audio_format);
audioDeviceStates[i] = DEVICE_ON; audioDeviceStates[i] = DEVICE_ON;
/* fall-through */
case DEVICE_ON:
err = playAudioOutput(&audioOutputArray[i], audioBuffer,
audioBufferPos);
if (!err)
ret = 0;
else if (err < 0)
/* device should already be closed if the play
* func returned an error */
audioDeviceStates[i] = DEVICE_OFF;
break; break;
case DEVICE_DISABLE: case DEVICE_DISABLE:
dropBufferedAudioOutput(&audioOutputArray[i]); dropBufferedAudioOutput(&audioOutputArray[i]);
...@@ -300,6 +288,30 @@ static int flushAudioBuffer(void) ...@@ -300,6 +288,30 @@ static int flushAudioBuffer(void)
break; break;
} }
} }
}
static int flushAudioBuffer(void)
{
int ret = -1;
int i, err;
if (audioBufferPos == 0)
return 0;
syncAudioDeviceStates();
for (i = audioOutputArraySize; --i >= 0; ) {
if (audioDeviceStates[i] != DEVICE_ON)
continue;
err = playAudioOutput(&audioOutputArray[i], audioBuffer,
audioBufferPos);
if (!err)
ret = 0;
else if (err < 0)
/* device should already be closed if the play
* func returned an error */
audioDeviceStates[i] = DEVICE_ENABLE;
}
audioBufferPos = 0; audioBufferPos = 0;
...@@ -324,21 +336,11 @@ int openAudioDevice(AudioFormat * audioFormat) ...@@ -324,21 +336,11 @@ int openAudioDevice(AudioFormat * audioFormat)
audioBuffer = realloc(audioBuffer, audioBufferSize); audioBuffer = realloc(audioBuffer, audioBufferSize);
} }
syncAudioDeviceStates();
for (i = audioOutputArraySize; --i >= 0; ) { for (i = audioOutputArraySize; --i >= 0; ) {
switch (audioDeviceStates[i]) { if (audioOutputArray[i].open)
case DEVICE_ENABLE:
openAudioOutput(&audioOutputArray[i], &audio_format);
audioDeviceStates[i] = DEVICE_ON;
/* fall-through */
case DEVICE_ON:
ret = 0; ret = 0;
break;
case DEVICE_DISABLE:
dropBufferedAudioOutput(&audioOutputArray[i]);
closeAudioOutput(&audioOutputArray[i]);
audioDeviceStates[i] = DEVICE_OFF;
break;
}
} }
if (ret == 0) if (ret == 0)
...@@ -386,24 +388,12 @@ void dropBufferedAudio(void) ...@@ -386,24 +388,12 @@ void dropBufferedAudio(void)
{ {
int i; int i;
syncAudioDeviceStates();
audioBufferPos = 0; audioBufferPos = 0;
for (i = audioOutputArraySize; --i >= 0; ) { for (i = audioOutputArraySize; --i >= 0; ) {
switch (audioDeviceStates[i]) { if (audioDeviceStates[i] == DEVICE_ON)
case DEVICE_ON:
dropBufferedAudioOutput(&audioOutputArray[i]);
break;
case DEVICE_ENABLE:
openAudioOutput(&audioOutputArray[i], &audio_format);
audioDeviceStates[i] = DEVICE_ON;
/* there's no point in dropping audio for something
* we just enabled */
break;
case DEVICE_DISABLE:
dropBufferedAudioOutput(&audioOutputArray[i]); dropBufferedAudioOutput(&audioOutputArray[i]);
closeAudioOutput(&audioOutputArray[i]);
audioDeviceStates[i] = DEVICE_OFF;
break;
}
} }
} }
...@@ -418,6 +408,8 @@ void closeAudioDevice(void) ...@@ -418,6 +408,8 @@ void closeAudioDevice(void)
audioBufferSize = 0; audioBufferSize = 0;
for (i = audioOutputArraySize; --i >= 0; ) { for (i = audioOutputArraySize; --i >= 0; ) {
if (audioDeviceStates[i] == DEVICE_ON)
audioDeviceStates[i] = DEVICE_ENABLE;
closeAudioOutput(&audioOutputArray[i]); closeAudioOutput(&audioOutputArray[i]);
} }
......
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