diff options
author | Eric Wong <normalperson@yhbt.net> | 2006-08-01 10:07:16 +0000 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2006-08-01 10:07:16 +0000 |
commit | eb537f84f1ebcd508fded4f1a319a0da146a7fc4 (patch) | |
tree | bfa2ca32d530d175dc5ffe3a8acdba10a10d6550 /src/audioOutput.c | |
parent | b0965c317babb7d25b3d42241788661b94c59fa2 (diff) | |
download | mpd-eb537f84f1ebcd508fded4f1a319a0da146a7fc4.tar.gz mpd-eb537f84f1ebcd508fded4f1a319a0da146a7fc4.tar.xz mpd-eb537f84f1ebcd508fded4f1a319a0da146a7fc4.zip |
audio: malloc reductions
Just malloc all of the audioOutput array in one shot
to avoid fragmentation and to improve cache locality
when iterating through the array.
We also know name and type members of the AudioOutput
struct won't change in the config, so there's no
need to strdup them.
newAudioOutput => initAudioOutput
git-svn-id: https://svn.musicpd.org/mpd/trunk@4515 09075e82-0dd4-0310-85a5-a0d7c8717e4f
Diffstat (limited to 'src/audioOutput.c')
-rw-r--r-- | src/audioOutput.c | 59 |
1 files changed, 26 insertions, 33 deletions
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) |