diff options
author | Max Kellermann <max@duempel.org> | 2009-07-06 22:00:50 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2009-07-06 22:00:50 +0200 |
commit | 0275690b5cd133f992e9e34d6c76eb134aef26bd (patch) | |
tree | 3ce67839d522420ff7b99224cdc8892c86395036 /src/volume.c | |
parent | da8095db546544bb9fe3a455ef5742bfef9c2f4f (diff) | |
download | mpd-0275690b5cd133f992e9e34d6c76eb134aef26bd.tar.gz mpd-0275690b5cd133f992e9e34d6c76eb134aef26bd.tar.xz mpd-0275690b5cd133f992e9e34d6c76eb134aef26bd.zip |
output: use the software mixer plugin
Do all the software volume stuff inside each output thread, not in the
player thread. This allows one software mixer per output device, and
also allows the user to configure the mixer type (hardware or
software) for each audio output.
This moves the global "mixer_type" setting into the "audio_output"
section, deprecating the "mixer_enabled" flag.
Diffstat (limited to '')
-rw-r--r-- | src/volume.c | 79 |
1 files changed, 8 insertions, 71 deletions
diff --git a/src/volume.c b/src/volume.c index 3d240f4e4..3e6079cd6 100644 --- a/src/volume.c +++ b/src/volume.c @@ -40,8 +40,6 @@ #define SW_VOLUME_STATE "sw_volume: " -static enum mixer_type volume_mixer_type = MIXER_TYPE_HARDWARE; - static unsigned volume_software_set = 100; /** the cached hardware mixer value; invalid if negative */ @@ -51,37 +49,15 @@ static GTimer *hardware_volume_timer; void volume_finish(void) { - if (volume_mixer_type == MIXER_TYPE_HARDWARE) - g_timer_destroy(hardware_volume_timer); + g_timer_destroy(hardware_volume_timer); } void volume_init(void) { - const struct config_param *param = config_get_param(CONF_MIXER_TYPE); - //hw mixing is by default - if (param) { - volume_mixer_type = mixer_type_parse(param->value); - switch (volume_mixer_type) { - case MIXER_TYPE_NONE: - case MIXER_TYPE_SOFTWARE: - mixer_disable_all(); - break; - - case MIXER_TYPE_HARDWARE: - //nothing to do - break; - - case MIXER_TYPE_UNKNOWN: - g_error("unknown mixer type %s at line %i\n", - param->value, param->line); - } - } - - if (volume_mixer_type == MIXER_TYPE_HARDWARE) - hardware_volume_timer = g_timer_new(); + hardware_volume_timer = g_timer_new(); } -static int hardware_volume_get(void) +int volume_level_get(void) { assert(hardware_volume_timer != NULL); @@ -95,43 +71,12 @@ static int hardware_volume_get(void) return last_hardware_volume; } -static int software_volume_get(void) -{ - return volume_software_set; -} - -int volume_level_get(void) -{ - switch (volume_mixer_type) { - case MIXER_TYPE_SOFTWARE: - return software_volume_get(); - case MIXER_TYPE_HARDWARE: - return hardware_volume_get(); - case MIXER_TYPE_NONE: - case MIXER_TYPE_UNKNOWN: - return -1; - } - - /* unreachable */ - assert(false); - return -1; -} - static bool software_volume_change(unsigned volume) { assert(volume <= 100); volume_software_set = volume; - - if (volume >= 100) - volume = PCM_VOLUME_1; - else if (volume <= 0) - volume = 0; - else - volume = pcm_float_to_volume((exp(volume / 25.0) - 1) / - (54.5981500331F - 1)); - - setPlayerSoftwareVolume(volume); + mixer_all_set_software_volume(volume); return true; } @@ -148,16 +93,11 @@ bool volume_level_change(unsigned volume) { assert(volume <= 100); + volume_software_set = volume; + idle_add(IDLE_MIXER); - switch (volume_mixer_type) { - case MIXER_TYPE_HARDWARE: - return hardware_volume_change(volume); - case MIXER_TYPE_SOFTWARE: - return software_volume_change(volume); - default: - return true; - } + return hardware_volume_change(volume); } void read_sw_volume_state(FILE *fp) @@ -166,8 +106,6 @@ void read_sw_volume_state(FILE *fp) char *end = NULL; long int sv; - if (volume_mixer_type != MIXER_TYPE_SOFTWARE) - return; while (fgets(buf, sizeof(buf), fp)) { if (!g_str_has_prefix(buf, SW_VOLUME_STATE)) continue; @@ -184,6 +122,5 @@ void read_sw_volume_state(FILE *fp) void save_sw_volume_state(FILE *fp) { - if (volume_mixer_type == MIXER_TYPE_SOFTWARE) - fprintf(fp, SW_VOLUME_STATE "%u\n", volume_software_set); + fprintf(fp, SW_VOLUME_STATE "%u\n", volume_software_set); } |