add a buffer to audio layer, so we only send data to audio devices 32 times per second

git-svn-id: https://svn.musicpd.org/mpd/trunk@2553 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
Warren Dukes 2004-11-09 00:13:42 +00:00
parent 9b03731c86
commit b7315f8391
2 changed files with 53 additions and 15 deletions

View File

@ -42,6 +42,10 @@ static mpd_sint8 myAudioDevicesEnabled[AUDIO_MAX_DEVICES];
static mpd_uint8 audioOpened = 0; static mpd_uint8 audioOpened = 0;
static mpd_sint32 audioBufferSize = 0;
static char * audioBuffer = NULL;
static mpd_sint32 audioBufferPos = 0;
void copyAudioFormat(AudioFormat * dest, AudioFormat * src) { void copyAudioFormat(AudioFormat * dest, AudioFormat * src) {
if(!src) return; if(!src) return;
@ -221,6 +225,32 @@ inline void syncAudioDevicesEnabledArrays() {
} }
} }
static int flushAudioBuffer() {
int ret = -1;
int i;
if(audioBufferPos == 0) return 0;
if(0 != memcmp(pdAudioDevicesEnabled, myAudioDevicesEnabled,
AUDIO_MAX_DEVICES))
{
syncAudioDevicesEnabledArrays();
}
for(i = 0; i < audioOutputArraySize; i++) {
if(!myAudioDevicesEnabled[i]) continue;
if(0 == playAudioOutput(audioOutputArray[i], audioBuffer,
audioBufferPos))
{
ret = 0;
}
}
audioBufferPos = 0;
return ret;
}
int openAudioDevice(AudioFormat * audioFormat) { int openAudioDevice(AudioFormat * audioFormat) {
int isCurrentFormat = isCurrentAudioFormat(audioFormat); int isCurrentFormat = isCurrentAudioFormat(audioFormat);
int ret = -1; int ret = -1;
@ -228,8 +258,12 @@ int openAudioDevice(AudioFormat * audioFormat) {
if(!audioOutputArray) return -1; if(!audioOutputArray) return -1;
if(!isCurrentFormat) { if(!audioOpened || !isCurrentFormat) {
flushAudioBuffer();
copyAudioFormat(&audio_format, audioFormat); copyAudioFormat(&audio_format, audioFormat);
audioBufferSize = (audio_format.bits/8)*audio_format.channels;
audioBufferSize*= audio_format.sampleRate >> 5;
audioBuffer = realloc(audioBuffer, audioBufferSize);
} }
syncAudioDevicesEnabledArrays(); syncAudioDevicesEnabledArrays();
@ -252,23 +286,23 @@ int openAudioDevice(AudioFormat * audioFormat) {
} }
int playAudio(char * playChunk, int size) { int playAudio(char * playChunk, int size) {
int ret = -1; int send;
int i;
if(0 != memcmp(pdAudioDevicesEnabled, myAudioDevicesEnabled, while(size > 0) {
AUDIO_MAX_DEVICES)) send = audioBufferSize-audioBufferPos;
{ send = send < size ? send : size;
syncAudioDevicesEnabledArrays();
}
for(i = 0; i < audioOutputArraySize; i++) { memcpy(audioBuffer+audioBufferPos, playChunk, send);
if(!myAudioDevicesEnabled[i]) continue; audioBufferPos += send;
if(0 == playAudioOutput(audioOutputArray[i], playChunk, size)) { size -= send;
ret = 0; playChunk+= send;
if(audioBufferPos == audioBufferSize) {
if( flushAudioBuffer() < 0 ) return -1;
} }
} }
return ret; return 0;
} }
int isAudioDeviceOpen() { int isAudioDeviceOpen() {
@ -278,6 +312,12 @@ int isAudioDeviceOpen() {
void closeAudioDevice() { void closeAudioDevice() {
int i; int i;
flushAudioBuffer();
free(audioBuffer);
audioBuffer = NULL;
audioBufferSize = 0;
for(i = 0; i < audioOutputArraySize; i++) { for(i = 0; i < audioOutputArraySize; i++) {
closeAudioOutput(audioOutputArray[i]); closeAudioOutput(audioOutputArray[i]);
} }

View File

@ -160,9 +160,7 @@ int playAudioOutput(AudioOutput * audioOutput, char * playChunk, int size) {
} }
blockSignals();
ret = audioOutput->playFunc(audioOutput, playChunk, size); ret = audioOutput->playFunc(audioOutput, playChunk, size);
unblockSignals();
return ret; return ret;
} }