diff options
Diffstat (limited to '')
-rw-r--r-- | src/audioOutput.c | 183 |
1 files changed, 98 insertions, 85 deletions
diff --git a/src/audioOutput.c b/src/audioOutput.c index bda61941b..3de860a40 100644 --- a/src/audioOutput.c +++ b/src/audioOutput.c @@ -22,30 +22,36 @@ #include "log.h" #include "pcm_utils.h" -#include <string.h> +#include <string.h> #define AUDIO_OUTPUT_TYPE "type" #define AUDIO_OUTPUT_NAME "name" #define AUDIO_OUTPUT_FORMAT "format" -static List * audioOutputPluginList; +static List *audioOutputPluginList; -void loadAudioOutputPlugin(AudioOutputPlugin * audioOutputPlugin) { - if(!audioOutputPlugin->name) return; +void loadAudioOutputPlugin(AudioOutputPlugin * audioOutputPlugin) +{ + if (!audioOutputPlugin->name) + return; insertInList(audioOutputPluginList, audioOutputPlugin->name, - audioOutputPlugin); + audioOutputPlugin); } -void unloadAudioOutputPlugin(AudioOutputPlugin * audioOutputPlugin) { - if(!audioOutputPlugin->name) return; +void unloadAudioOutputPlugin(AudioOutputPlugin * audioOutputPlugin) +{ + if (!audioOutputPlugin->name) + return; deleteFromList(audioOutputPluginList, audioOutputPlugin->name); } -void initAudioOutputPlugins(void) { +void initAudioOutputPlugins(void) +{ audioOutputPluginList = makeList(NULL, 0); } -void finishAudioOutputPlugins(void) { +void finishAudioOutputPlugins(void) +{ freeList(audioOutputPluginList); } @@ -60,52 +66,50 @@ void finishAudioOutputPlugins(void) { if(bp) str = bp->value; \ } -AudioOutput * newAudioOutput(ConfigParam * param) { - AudioOutput * ret = NULL; - void * data = NULL; - char * name = NULL; - char * format = NULL; - char * type = NULL; - BlockParam * bp = NULL; - AudioOutputPlugin * plugin = NULL; - - if(param) { +AudioOutput *newAudioOutput(ConfigParam * param) +{ + AudioOutput *ret = NULL; + void *data = NULL; + char *name = NULL; + char *format = NULL; + char *type = NULL; + BlockParam *bp = NULL; + AudioOutputPlugin *plugin = NULL; + + if (param) { getBlockParam(AUDIO_OUTPUT_NAME, name, 1); getBlockParam(AUDIO_OUTPUT_TYPE, type, 1); getBlockParam(AUDIO_OUTPUT_FORMAT, format, 0); - if(!findInList(audioOutputPluginList, type, &data)) { + if (!findInList(audioOutputPluginList, type, &data)) { ERROR("couldn't find audio output plugin for type " - "\"%s\" at line %i\n", type, - param->line); + "\"%s\" at line %i\n", type, param->line); exit(EXIT_FAILURE); } plugin = (AudioOutputPlugin *) data; - } - else { - ListNode * node = audioOutputPluginList->firstNode; + } else { + ListNode *node = audioOutputPluginList->firstNode; - WARNING("No \"%s\" defined in config file\n", - CONF_AUDIO_OUTPUT); + WARNING("No \"%s\" defined in config file\n", + CONF_AUDIO_OUTPUT); WARNING("Attempt to detect audio output device\n"); - while(node) { + while (node) { plugin = (AudioOutputPlugin *) node->data; - if(plugin->testDefaultDeviceFunc) { + if (plugin->testDefaultDeviceFunc) { WARNING("Attempting to detect a %s audio " - "device\n", plugin->name); - if(plugin->testDefaultDeviceFunc() == 0) { + "device\n", plugin->name); + if (plugin->testDefaultDeviceFunc() == 0) { WARNING("Successfully detected a %s " - "audio device\n", - plugin->name); + "audio device\n", plugin->name); break; } } node = node->nextNode; } - if(!node) { + if (!node) { WARNING("Unable to detect an audio device\n"); return NULL; } @@ -134,20 +138,18 @@ AudioOutput * newAudioOutput(ConfigParam * param) { memset(&ret->outAudioFormat, 0, sizeof(AudioFormat)); memset(&ret->reqAudioFormat, 0, sizeof(AudioFormat)); - if(format) { + if (format) { ret->convertAudioFormat = 1; - if(0 != parseAudioConfig(&ret->reqAudioFormat, format)) - { - ERROR("error parsing format at line %i\n", - bp->line); + if (0 != parseAudioConfig(&ret->reqAudioFormat, format)) { + ERROR("error parsing format at line %i\n", bp->line); exit(EXIT_FAILURE); } copyAudioFormat(&ret->outAudioFormat, &ret->reqAudioFormat); } - if(plugin->initDriverFunc(ret, param) != 0) { + if (plugin->initDriverFunc(ret, param) != 0) { free(ret); ret = NULL; } @@ -155,13 +157,13 @@ AudioOutput * newAudioOutput(ConfigParam * param) { return ret; } -int openAudioOutput(AudioOutput * audioOutput, AudioFormat * audioFormat) { +int openAudioOutput(AudioOutput * audioOutput, AudioFormat * audioFormat) +{ int ret; - - if(audioOutput->open) { - if(cmpAudioFormat(audioFormat, &audioOutput->inAudioFormat) - == 0) - { + + if (audioOutput->open) { + if (cmpAudioFormat(audioFormat, &audioOutput->inAudioFormat) + == 0) { return 0; } closeAudioOutput(audioOutput); @@ -169,92 +171,103 @@ int openAudioOutput(AudioOutput * audioOutput, AudioFormat * audioFormat) { copyAudioFormat(&audioOutput->inAudioFormat, audioFormat); - if(audioOutput->convertAudioFormat) { + if (audioOutput->convertAudioFormat) { copyAudioFormat(&audioOutput->outAudioFormat, &audioOutput->reqAudioFormat); - } - else { - copyAudioFormat(&audioOutput->outAudioFormat, + } else { + copyAudioFormat(&audioOutput->outAudioFormat, &audioOutput->inAudioFormat); } ret = audioOutput->openDeviceFunc(audioOutput); - if(cmpAudioFormat(&audioOutput->inAudioFormat, - &audioOutput->outAudioFormat) == 0) - { + if (cmpAudioFormat(&audioOutput->inAudioFormat, + &audioOutput->outAudioFormat) == 0) { audioOutput->sameInAndOutFormats = 1; - } - else audioOutput->sameInAndOutFormats = 0; + } else + audioOutput->sameInAndOutFormats = 0; return ret; } -static void convertAudioFormat(AudioOutput * audioOutput, char ** chunkArgPtr, - int * sizeArgPtr) +static void convertAudioFormat(AudioOutput * audioOutput, char **chunkArgPtr, + int *sizeArgPtr) { - int size = pcm_sizeOfOutputBufferForAudioFormatConversion( - &(audioOutput->inAudioFormat), *sizeArgPtr, - &(audioOutput->outAudioFormat)); - - if(size > audioOutput->convBufferLen) { - audioOutput->convBuffer = - realloc(audioOutput->convBuffer, size); + int size = + pcm_sizeOfOutputBufferForAudioFormatConversion(& + (audioOutput-> + inAudioFormat), + *sizeArgPtr, +&(audioOutput->outAudioFormat)); + + if (size > audioOutput->convBufferLen) { + audioOutput->convBuffer = + realloc(audioOutput->convBuffer, size); audioOutput->convBufferLen = size; } - pcm_convertAudioFormat(&(audioOutput->inAudioFormat), *chunkArgPtr, - *sizeArgPtr, &(audioOutput->outAudioFormat), - audioOutput->convBuffer); - + pcm_convertAudioFormat(&(audioOutput->inAudioFormat), *chunkArgPtr, + *sizeArgPtr, &(audioOutput->outAudioFormat), + audioOutput->convBuffer); + *sizeArgPtr = size; *chunkArgPtr = audioOutput->convBuffer; } -int playAudioOutput(AudioOutput * audioOutput, char * playChunk, int size) { +int playAudioOutput(AudioOutput * audioOutput, char *playChunk, int size) +{ int ret; - if(!audioOutput->open) return -1; + if (!audioOutput->open) + return -1; - if(!audioOutput->sameInAndOutFormats) { + if (!audioOutput->sameInAndOutFormats) { convertAudioFormat(audioOutput, &playChunk, &size); } - ret = audioOutput->playFunc(audioOutput, playChunk, size); return ret; } -void dropBufferedAudioOutput(AudioOutput * audioOutput) { - if(audioOutput->open) audioOutput->dropBufferedAudioFunc(audioOutput); +void dropBufferedAudioOutput(AudioOutput * audioOutput) +{ + if (audioOutput->open) + audioOutput->dropBufferedAudioFunc(audioOutput); } -void closeAudioOutput(AudioOutput * audioOutput) { - if(audioOutput->open) audioOutput->closeDeviceFunc(audioOutput); +void closeAudioOutput(AudioOutput * audioOutput) +{ + if (audioOutput->open) + audioOutput->closeDeviceFunc(audioOutput); } -void finishAudioOutput(AudioOutput * audioOutput) { +void finishAudioOutput(AudioOutput * audioOutput) +{ closeAudioOutput(audioOutput); audioOutput->finishDriverFunc(audioOutput); - if(audioOutput->convBuffer) free(audioOutput->convBuffer); + if (audioOutput->convBuffer) + free(audioOutput->convBuffer); free(audioOutput->type); free(audioOutput->name); free(audioOutput); } -void sendMetadataToAudioOutput(AudioOutput * audioOutput, MpdTag * tag) { - if(!audioOutput->sendMetdataFunc) return; +void sendMetadataToAudioOutput(AudioOutput * audioOutput, MpdTag * tag) +{ + if (!audioOutput->sendMetdataFunc) + return; audioOutput->sendMetdataFunc(audioOutput, tag); } -void printAllOutputPluginTypes(FILE *fp) { +void printAllOutputPluginTypes(FILE * fp) +{ ListNode *node = audioOutputPluginList->firstNode; AudioOutputPlugin *plugin; - - while(node) { - plugin = (AudioOutputPlugin *)node->data; - myfprintf(fp, "%s ", plugin->name); + + while (node) { + plugin = (AudioOutputPlugin *) node->data; + myfprintf(fp, "%s ", plugin->name); node = node->nextNode; } myfprintf(fp, "\n"); |