aboutsummaryrefslogtreecommitdiffstats
path: root/src/audio.c
diff options
context:
space:
mode:
authorWarren Dukes <warren.dukes@gmail.com>2004-10-27 22:40:59 +0000
committerWarren Dukes <warren.dukes@gmail.com>2004-10-27 22:40:59 +0000
commit6237195faba7064df2496d410d9a615471b65807 (patch)
tree37a7ac1de869f12091c9d345fe5ff3972b8729b6 /src/audio.c
parentc5310c33f54603d623b76fa5eb4f19edeb25be77 (diff)
downloadmpd-6237195faba7064df2496d410d9a615471b65807.tar.gz
mpd-6237195faba7064df2496d410d9a615471b65807.tar.xz
mpd-6237195faba7064df2496d410d9a615471b65807.zip
more config file rewrite actions happening
git-svn-id: https://svn.musicpd.org/mpd/branches/shank-rewrite-config@2364 09075e82-0dd4-0310-85a5-a0d7c8717e4f
Diffstat (limited to 'src/audio.c')
-rw-r--r--src/audio.c107
1 files changed, 83 insertions, 24 deletions
diff --git a/src/audio.c b/src/audio.c
index 653fb55f5..7f04ea2df 100644
--- a/src/audio.c
+++ b/src/audio.c
@@ -31,9 +31,6 @@ static AudioFormat audio_format;
static AudioFormat * audio_configFormat = NULL;
-static AudioOutput * aoOutput = NULL;
-static AudioOutput * shoutOutput = NULL;
-
void copyAudioFormat(AudioFormat * dest, AudioFormat * src) {
if(!src) return;
@@ -42,17 +39,34 @@ void copyAudioFormat(AudioFormat * dest, AudioFormat * src) {
dest->channels = src->channels;
}
+static AudioOutput ** audioOutputArray = NULL;
+static int audioOutputArraySize = 0;
+
extern AudioOutputPlugin aoPlugin;
extern AudioOutputPlugin shoutPlugin;
void initAudioDriver() {
+ ConfigParam * param = NULL;
+ int i;
+
initAudioOutputPlugins();
loadAudioOutputPlugin(&aoPlugin);
loadAudioOutputPlugin(&shoutPlugin);
- aoOutput = newAudioOutput("ao");
- assert(aoOutput);
- shoutOutput = newAudioOutput("shout");
+ while((param = getNextConfigParam(CONF_AUDIO_OUTPUT, param))) {
+ i = audioOutputArraySize++;
+
+ audioOutputArray = realloc(audioOutputArray,
+ audioOutputArraySize*sizeof(AudioOutput *));
+
+ audioOutputArray[i] = newAudioOutput(param);
+
+ if(!audioOutputArray[i]) {
+ ERROR("problems configuring output device defined at "
+ "line %i\n", param->line);
+ exit(EXIT_FAILURE);
+ }
+ }
}
void getOutputAudioFormat(AudioFormat * inAudioFormat,
@@ -65,13 +79,17 @@ void getOutputAudioFormat(AudioFormat * inAudioFormat,
}
void initAudioConfig() {
- char * conf = getConf()[CONF_AUDIO_OUTPUT_FORMAT];
+ ConfigParam * param = getConfigParam(CONF_AUDIO_OUTPUT_FORMAT);
- if(NULL == conf) return;
+ if(NULL == param || NULL == param->value) return;
audio_configFormat = malloc(sizeof(AudioFormat));
- if(0 != parseAudioConfig(audio_configFormat, conf)) exit(EXIT_FAILURE);
+ if(0 != parseAudioConfig(audio_configFormat, param->value)) {
+ ERROR("error parsing \"%s\" at line %i\n",
+ CONF_AUDIO_OUTPUT_FORMAT, param->line);
+ exit(EXIT_FAILURE);
+ }
}
int parseAudioConfig(AudioFormat * audioFormat, char * conf) {
@@ -145,10 +163,15 @@ void finishAudioConfig() {
}
void finishAudioDriver() {
- finishAudioOutput(aoOutput);
- if(shoutOutput) finishAudioOutput(shoutOutput);
- shoutOutput = NULL;
- aoOutput = NULL;
+ int i;
+
+ for(i = 0; i < audioOutputArraySize; i++) {
+ finishAudioOutput(audioOutputArray[i]);
+ }
+
+ free(audioOutputArray);
+ audioOutputArray = NULL;
+ audioOutputArraySize = 0;
}
int isCurrentAudioFormat(AudioFormat * audioFormat) {
@@ -160,29 +183,65 @@ int isCurrentAudioFormat(AudioFormat * audioFormat) {
}
int openAudioDevice(AudioFormat * audioFormat) {
- if(!aoOutput->open || !isCurrentAudioFormat(audioFormat)) {
- if(audioFormat) copyAudioFormat(&audio_format, audioFormat);
- if(shoutOutput) openAudioOutput(shoutOutput, &audio_format);
- return openAudioOutput(aoOutput, &audio_format);
+ int isCurrentFormat = isCurrentAudioFormat(audioFormat);
+ int ret = -1;
+ int i;
+
+ if(!audioOutputArray) return -1;
+
+ if(!isCurrentFormat) {
+ copyAudioFormat(&audio_format, audioFormat);
}
- return 0;
+ for(i = 0; i < audioOutputArraySize; i++) {
+ if(!audioOutputArray[i]->open || !isCurrentFormat) {
+ if(0 == openAudioOutput(audioOutputArray[i],
+ &audio_format))
+ {
+ ret = 0;
+ }
+ }
+ }
+
+ return ret;
}
int playAudio(char * playChunk, int size) {
- if(shoutOutput) playAudioOutput(shoutOutput, playChunk, size);
- return playAudioOutput(aoOutput, playChunk, size);
+ int ret = -1;
+ int i;
+
+ for(i = 0; i < audioOutputArraySize; i++) {
+ if(0 == playAudioOutput(audioOutputArray[i], playChunk, size)) {
+ ret = 0;
+ }
+ }
+
+ return ret;
}
int isAudioDeviceOpen() {
- return aoOutput->open;
+ int ret = 0;
+ int i;
+
+ for(i = 0; i < audioOutputArraySize; i++) {
+ ret &= audioOutputArray[i]->open;
+ }
+
+ return ret;
}
void closeAudioDevice() {
- if(shoutOutput) closeAudioOutput(shoutOutput);
- closeAudioOutput(aoOutput);
+ int i;
+
+ for(i = 0; i < audioOutputArraySize; i++) {
+ closeAudioOutput(audioOutputArray[i]);
+ }
}
void sendMetadataToAudioDevice(MpdTag * tag) {
- if(shoutOutput) sendMetadataToAudioOutput(shoutOutput, tag);
+ int i;
+
+ for(i = 0; i < audioOutputArraySize; i++) {
+ sendMetadataToAudioOutput(audioOutputArray[i], tag);
+ }
}