mixer_all: added mixer_all_set_software_volume()

The special-purpose function is used for saving/restore the software
volume control to the state file.
This commit is contained in:
Max Kellermann 2009-07-06 21:52:29 +02:00
parent 5d74b1efef
commit da8095db54
2 changed files with 73 additions and 0 deletions

View File

@ -22,6 +22,9 @@
#include "output_all.h"
#include "output_plugin.h"
#include "output_internal.h"
#include "pcm_volume.h"
#include "mixer_api.h"
#include "mixer_list.h"
#include <glib.h>
@ -103,3 +106,57 @@ mixer_all_set_volume(unsigned volume)
return success;
}
static int
output_mixer_get_software_volume(unsigned i)
{
struct audio_output *output;
struct mixer *mixer;
assert(i < audio_output_count());
output = audio_output_get(i);
if (!output->enabled)
return -1;
mixer = output->mixer;
if (mixer == NULL || mixer->plugin != &software_mixer_plugin)
return -1;
return mixer_get_volume(mixer);
}
int
mixer_all_get_software_volume(void)
{
unsigned count = audio_output_count(), ok = 0;
int volume, total = 0;
for (unsigned i = 0; i < count; i++) {
volume = output_mixer_get_software_volume(i);
if (volume >= 0) {
total += volume;
++ok;
}
}
if (ok == 0)
return -1;
return total / ok;
}
void
mixer_all_set_software_volume(unsigned volume)
{
unsigned count = audio_output_count();
assert(volume <= PCM_VOLUME_1);
for (unsigned i = 0; i < count; i++) {
struct audio_output *output = audio_output_get(i);
if (output->mixer != NULL &&
output->mixer->plugin == &software_mixer_plugin)
mixer_set_volume(output->mixer, volume);
}
}

View File

@ -43,4 +43,20 @@ mixer_all_get_volume(void);
bool
mixer_all_set_volume(unsigned volume);
/**
* Similar to mixer_all_get_volume(), but gets the volume only for
* software mixers. See #software_mixer_plugin. This function fails
* if no software mixer is configured.
*/
int
mixer_all_get_software_volume(void);
/**
* Similar to mixer_all_set_volume(), but sets the volume only for
* software mixers. See #software_mixer_plugin. This function cannot
* fail, because the underlying software mixers cannot fail either.
*/
void
mixer_all_set_software_volume(unsigned volume);
#endif