diff options
-rw-r--r-- | src/audio.c | 53 | ||||
-rw-r--r-- | src/audioOutput.c | 59 | ||||
-rw-r--r-- | src/audioOutput.h | 2 |
3 files changed, 52 insertions, 62 deletions
diff --git a/src/audio.c b/src/audio.c index eedbfb1ff..63aecb7f4 100644 --- a/src/audio.c +++ b/src/audio.c @@ -44,7 +44,7 @@ static AudioFormat audio_format; static AudioFormat *audio_configFormat = NULL; -static AudioOutput **audioOutputArray = NULL; +static AudioOutput *audioOutputArray = NULL; static mpd_uint8 audioOutputArraySize = 0; #define DEVICE_OFF 0x00 @@ -120,33 +120,30 @@ void initAudioDriver(void) audioOutputArraySize = audio_device_count(); audioDeviceStates = (getPlayerData())->audioDeviceStates; - audioOutputArray = malloc(sizeof(AudioOutput *) * audioOutputArraySize); - + audioOutputArray = malloc(sizeof(AudioOutput) * audioOutputArraySize); i = 0; param = getNextConfigParam(CONF_AUDIO_OUTPUT, param); do { - AudioOutput *output; + AudioOutput *output = &audioOutputArray[i]; int j; - output = newAudioOutput(param); - if (!output && param) { + if (!initAudioOutput(output, param) && param) { ERROR("problems configuring output device defined at " "line %i\n", param->line); exit(EXIT_FAILURE); } /* require output names to be unique: */ - for (j = i - 1; j >= 0; --j) { - if (!strcmp(output->name, audioOutputArray[j]->name)) { + for (j = i; --j >= 0; ) { + if (!strcmp(output->name, audioOutputArray[j].name)) { ERROR("output devices with identical " "names: %s\n", output->name); exit(EXIT_FAILURE); } } - audioDeviceStates[i] = DEVICE_ENABLE; - audioOutputArray[i++] = output; + audioDeviceStates[i++] = DEVICE_ENABLE; } while ((param = getNextConfigParam(CONF_AUDIO_OUTPUT, param))); } @@ -253,7 +250,7 @@ void finishAudioDriver(void) int i; for (i = 0; i < audioOutputArraySize; i++) { - finishAudioOutput(audioOutputArray[i]); + finishAudioOutput(&audioOutputArray[i]); } free(audioOutputArray); @@ -283,11 +280,11 @@ static int flushAudioBuffer(void) for (i = audioOutputArraySize; --i >= 0; ) { switch (audioDeviceStates[i]) { case DEVICE_ENABLE: - openAudioOutput(audioOutputArray[i], &audio_format); + openAudioOutput(&audioOutputArray[i], &audio_format); audioDeviceStates[i] = DEVICE_ON; /* fall-through */ case DEVICE_ON: - err = playAudioOutput(audioOutputArray[i], audioBuffer, + err = playAudioOutput(&audioOutputArray[i], audioBuffer, audioBufferPos); if (!err) ret = 0; @@ -297,8 +294,8 @@ static int flushAudioBuffer(void) audioDeviceStates[i] = DEVICE_OFF; break; case DEVICE_DISABLE: - dropBufferedAudioOutput(audioOutputArray[i]); - closeAudioOutput(audioOutputArray[i]); + dropBufferedAudioOutput(&audioOutputArray[i]); + closeAudioOutput(&audioOutputArray[i]); audioDeviceStates[i] = DEVICE_OFF; break; } @@ -330,15 +327,15 @@ int openAudioDevice(AudioFormat * audioFormat) for (i = audioOutputArraySize; --i >= 0; ) { switch (audioDeviceStates[i]) { case DEVICE_ENABLE: - openAudioOutput(audioOutputArray[i], &audio_format); + openAudioOutput(&audioOutputArray[i], &audio_format); audioDeviceStates[i] = DEVICE_ON; /* fall-through */ case DEVICE_ON: ret = 0; break; case DEVICE_DISABLE: - dropBufferedAudioOutput(audioOutputArray[i]); - closeAudioOutput(audioOutputArray[i]); + dropBufferedAudioOutput(&audioOutputArray[i]); + closeAudioOutput(&audioOutputArray[i]); audioDeviceStates[i] = DEVICE_OFF; break; } @@ -349,7 +346,7 @@ int openAudioDevice(AudioFormat * audioFormat) else { /* close all devices if there was an error */ for (i = audioOutputArraySize; --i >= 0; ) { - closeAudioOutput(audioOutputArray[i]); + closeAudioOutput(&audioOutputArray[i]); } audioOpened = 0; @@ -393,17 +390,17 @@ void dropBufferedAudio(void) for (i = audioOutputArraySize; --i >= 0; ) { switch (audioDeviceStates[i]) { case DEVICE_ON: - dropBufferedAudioOutput(audioOutputArray[i]); + dropBufferedAudioOutput(&audioOutputArray[i]); break; case DEVICE_ENABLE: - openAudioOutput(audioOutputArray[i], &audio_format); + 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]); - closeAudioOutput(audioOutputArray[i]); + dropBufferedAudioOutput(&audioOutputArray[i]); + closeAudioOutput(&audioOutputArray[i]); audioDeviceStates[i] = DEVICE_OFF; break; } @@ -421,7 +418,7 @@ void closeAudioDevice(void) audioBufferSize = 0; for (i = audioOutputArraySize; --i >= 0; ) { - closeAudioOutput(audioOutputArray[i]); + closeAudioOutput(&audioOutputArray[i]); } audioOpened = 0; @@ -432,7 +429,7 @@ void sendMetadataToAudioDevice(MpdTag * tag) int i; for (i = audioOutputArraySize; --i >= 0; ) { - sendMetadataToAudioOutput(audioOutputArray[i], tag); + sendMetadataToAudioOutput(&audioOutputArray[i], tag); } } @@ -471,7 +468,7 @@ void printAudioDevices(int fd) fdprintf(fd, "outputid: %i\noutputname: %s\noutputenabled: %i\n", i, - audioOutputArray[i]->name, + audioOutputArray[i].name, audioDeviceStates[i] & 0x01); } } @@ -484,7 +481,7 @@ void saveAudioDevicesState(FILE *fp) for (i = 0; i < audioOutputArraySize; i++) { fprintf(fp, AUDIO_DEVICE_STATE "%d:%s\n", audioDeviceStates[i] & 0x01, - audioOutputArray[i]->name); + audioOutputArray[i].name); } } @@ -510,7 +507,7 @@ void readAudioDevicesState(FILE *fp) goto errline; for (i = audioOutputArraySize; --i >= 0; ) { - if (!strcmp(name, audioOutputArray[i]->name)) { + if (!strcmp(name, audioOutputArray[i].name)) { /* devices default to on */ if (!atoi(c)) audioDeviceStates[i] = DEVICE_DISABLE; diff --git a/src/audioOutput.c b/src/audioOutput.c index f938a0deb..358947695 100644 --- a/src/audioOutput.c +++ b/src/audioOutput.c @@ -66,9 +66,8 @@ void finishAudioOutputPlugins(void) if(bp) str = bp->value; \ } -AudioOutput *newAudioOutput(ConfigParam * param) +int initAudioOutput(AudioOutput *ao, ConfigParam * param) { - AudioOutput *ret = NULL; void *data = NULL; char *name = NULL; char *format = NULL; @@ -111,50 +110,47 @@ AudioOutput *newAudioOutput(ConfigParam * param) if (!node) { WARNING("Unable to detect an audio device\n"); - return NULL; + return 0; } name = "default detected output"; type = plugin->name; } - ret = malloc(sizeof(AudioOutput)); - ret->name = strdup(name); - ret->type = strdup(type); - ret->finishDriverFunc = plugin->finishDriverFunc; - ret->openDeviceFunc = plugin->openDeviceFunc; - ret->playFunc = plugin->playFunc; - ret->dropBufferedAudioFunc = plugin->dropBufferedAudioFunc; - ret->closeDeviceFunc = plugin->closeDeviceFunc; - ret->sendMetdataFunc = plugin->sendMetdataFunc; - ret->open = 0; - - ret->convertAudioFormat = 0; - ret->sameInAndOutFormats = 0; - ret->convBuffer = NULL; - ret->convBufferLen = 0; - - memset(&ret->inAudioFormat, 0, sizeof(AudioFormat)); - memset(&ret->outAudioFormat, 0, sizeof(AudioFormat)); - memset(&ret->reqAudioFormat, 0, sizeof(AudioFormat)); + ao->name = name; + ao->type = type; + ao->finishDriverFunc = plugin->finishDriverFunc; + ao->openDeviceFunc = plugin->openDeviceFunc; + ao->playFunc = plugin->playFunc; + ao->dropBufferedAudioFunc = plugin->dropBufferedAudioFunc; + ao->closeDeviceFunc = plugin->closeDeviceFunc; + ao->sendMetdataFunc = plugin->sendMetdataFunc; + ao->open = 0; + + ao->convertAudioFormat = 0; + ao->sameInAndOutFormats = 0; + ao->convBuffer = NULL; + ao->convBufferLen = 0; + + memset(&ao->inAudioFormat, 0, sizeof(AudioFormat)); + memset(&ao->outAudioFormat, 0, sizeof(AudioFormat)); + memset(&ao->reqAudioFormat, 0, sizeof(AudioFormat)); if (format) { - ret->convertAudioFormat = 1; + ao->convertAudioFormat = 1; - if (0 != parseAudioConfig(&ret->reqAudioFormat, format)) { + if (0 != parseAudioConfig(&ao->reqAudioFormat, format)) { ERROR("error parsing format at line %i\n", bp->line); exit(EXIT_FAILURE); } - copyAudioFormat(&ret->outAudioFormat, &ret->reqAudioFormat); + copyAudioFormat(&ao->outAudioFormat, &ao->reqAudioFormat); } - if (plugin->initDriverFunc(ret, param) != 0) { - free(ret); - ret = NULL; - } + if (plugin->initDriverFunc(ao, param) != 0) + return 0; - return ret; + return 1; } int openAudioOutput(AudioOutput * audioOutput, AudioFormat * audioFormat) @@ -248,9 +244,6 @@ void finishAudioOutput(AudioOutput * audioOutput) audioOutput->finishDriverFunc(audioOutput); if (audioOutput->convBuffer) free(audioOutput->convBuffer); - free(audioOutput->type); - free(audioOutput->name); - free(audioOutput); } void sendMetadataToAudioOutput(AudioOutput * audioOutput, MpdTag * tag) diff --git a/src/audioOutput.h b/src/audioOutput.h index 33f53b928..192c93270 100644 --- a/src/audioOutput.h +++ b/src/audioOutput.h @@ -101,7 +101,7 @@ void finishAudioOutputPlugins(); void loadAudioOutputPlugin(AudioOutputPlugin * audioOutputPlugin); void unloadAudioOutputPlugin(AudioOutputPlugin * audioOutputPlugin); -AudioOutput *newAudioOutput(ConfigParam * param); +int initAudioOutput(AudioOutput *, ConfigParam * param); int openAudioOutput(AudioOutput * audioOutput, AudioFormat * audioFormat); int playAudioOutput(AudioOutput * audioOutput, char *playChunk, int size); void dropBufferedAudioOutput(AudioOutput * audioOutput); |