Commit 188f9e66 authored by Max Kellermann's avatar Max Kellermann

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().
parent 8695b942
...@@ -246,9 +246,9 @@ int main(int argc, char *argv[]) ...@@ -246,9 +246,9 @@ int main(int argc, char *argv[])
command_init(); command_init();
initialize_decoder_and_player(); initialize_decoder_and_player();
volume_init();
initAudioConfig(); initAudioConfig();
initAudioDriver(); initAudioDriver();
volume_init();
client_manager_init(); client_manager_init();
replay_gain_global_init(); replay_gain_global_init();
initNormalization(); initNormalization();
......
...@@ -47,32 +47,80 @@ void volume_finish(void) ...@@ -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 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 /* see if the deprecated configuration exists */
newparam = newConfigParam(NULL, -1);
param = config_get_param(CONF_MIXER_DEVICE); param = config_get_param(name);
if (param) { if (param == NULL)
g_warning("deprecated option mixer_device found, translating to %s config section\n", driver); return;
addBlockParam(newparam, "mixer_device", param->value, -1);
} g_warning("deprecated option '%s' found, moving to '%s' audio output",
param = config_get_param(CONF_MIXER_CONTROL); name, type);
if (param) {
g_warning("deprecated option mixer_control found, translating to %s config section\n", driver); /* determine the configuration section */
addBlockParam(newparam, "mixer_control", param->value, -1);
} output = find_output_config(type);
if (newparam->num_block_params > 0) { if (output == NULL) {
//call configure method of corrensponding mixer /* if there is no output configuration at all, create
if (!mixer_configure_legacy(driver, newparam)) { a new and empty configuration section for the
g_error("Using mixer_type '%s' with not enabled %s output", driver, driver); 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) void volume_init(void)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment