diff options
author | Max Kellermann <max@duempel.org> | 2009-01-25 17:38:02 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2009-01-25 17:38:02 +0100 |
commit | 188f9e663cbc109e2dc367eb7995dd8dd3fdf90f (patch) | |
tree | 77242907d2ca399eaf5046fefc6093fb74aa53f1 | |
parent | 8695b9423233e9e8ad18ed7b4d56a020254fbdd6 (diff) | |
download | mpd-188f9e663cbc109e2dc367eb7995dd8dd3fdf90f.tar.gz mpd-188f9e663cbc109e2dc367eb7995dd8dd3fdf90f.tar.xz mpd-188f9e663cbc109e2dc367eb7995dd8dd3fdf90f.zip |
mixer: configure legacy mixer before the audio outputs
Reimplemented the legacy mixer configuration: copy the deprecated
configuration values into the audio_output section. Don't configure
the mixers twice (once for the audio_output, and a second time for the
legacy values).
This requires volume_init() to be called before initAudioDriver().
-rw-r--r-- | src/main.c | 2 | ||||
-rw-r--r-- | src/volume.c | 90 |
2 files changed, 70 insertions, 22 deletions
diff --git a/src/main.c b/src/main.c index f82ea596a..e872d3d91 100644 --- a/src/main.c +++ b/src/main.c @@ -246,9 +246,9 @@ int main(int argc, char *argv[]) command_init(); initialize_decoder_and_player(); + volume_init(); initAudioConfig(); initAudioDriver(); - volume_init(); client_manager_init(); replay_gain_global_init(); initNormalization(); diff --git a/src/volume.c b/src/volume.c index ce6e38dc1..6f7c922c0 100644 --- a/src/volume.c +++ b/src/volume.c @@ -47,32 +47,80 @@ void volume_finish(void) { } +/** + * Finds the first audio_output configuration section with the + * specified type. + */ +static struct config_param * +find_output_config(const char *type) +{ + struct config_param *param = NULL; + + while ((param = config_get_next_param(CONF_AUDIO_OUTPUT, + param)) != NULL) { + const char *param_type = + config_get_block_string(param, "type", NULL); + if (param_type != NULL && strcmp(param_type, type) == 0) + return param; + } + + return NULL; +} + +/** + * Copy a (top-level) legacy mixer configuration parameter to the + * audio_output section. + */ static void -mixer_reconfigure(char *driver) +mixer_copy_legacy_param(const char *type, const char *name) { - struct config_param *newparam, *param; + const struct config_param *param; + struct config_param *output; + const struct block_param *bp; - //create parameter list - newparam = newConfigParam(NULL, -1); + /* see if the deprecated configuration exists */ - param = config_get_param(CONF_MIXER_DEVICE); - if (param) { - g_warning("deprecated option mixer_device found, translating to %s config section\n", driver); - addBlockParam(newparam, "mixer_device", param->value, -1); - } - param = config_get_param(CONF_MIXER_CONTROL); - if (param) { - g_warning("deprecated option mixer_control found, translating to %s config section\n", driver); - addBlockParam(newparam, "mixer_control", param->value, -1); - } - if (newparam->num_block_params > 0) { - //call configure method of corrensponding mixer - if (!mixer_configure_legacy(driver, newparam)) { - g_error("Using mixer_type '%s' with not enabled %s output", driver, driver); - } + param = config_get_param(name); + if (param == NULL) + return; + + g_warning("deprecated option '%s' found, moving to '%s' audio output", + name, type); + + /* determine the configuration section */ + + output = find_output_config(type); + if (output == NULL) { + /* if there is no output configuration at all, create + a new and empty configuration section for the + legacy mixer */ + + if (config_get_next_param(CONF_AUDIO_OUTPUT, NULL) != NULL) + /* there is an audio_output configuration, but + it does not match the mixer_type setting */ + g_error("no '%s' audio output found", type); + + output = newConfigParam(NULL, param->line); + addBlockParam(output, "type", type, param->line); + addBlockParam(output, "name", type, param->line); + config_add_param(CONF_AUDIO_OUTPUT, output); } - //free parameter list - config_param_free(newparam, NULL); + + bp = getBlockParam(output, name); + if (bp != NULL) + g_error("the '%s' audio output already has a '%s' setting", + type, name); + + /* duplicate the parameter in the configuration section */ + + addBlockParam(output, name, param->value, param->line); +} + +static void +mixer_reconfigure(const char *type) +{ + mixer_copy_legacy_param(type, CONF_MIXER_DEVICE); + mixer_copy_legacy_param(type, CONF_MIXER_CONTROL); } void volume_init(void) |