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:
parent
5d74b1efef
commit
da8095db54
@ -22,6 +22,9 @@
|
|||||||
#include "output_all.h"
|
#include "output_all.h"
|
||||||
#include "output_plugin.h"
|
#include "output_plugin.h"
|
||||||
#include "output_internal.h"
|
#include "output_internal.h"
|
||||||
|
#include "pcm_volume.h"
|
||||||
|
#include "mixer_api.h"
|
||||||
|
#include "mixer_list.h"
|
||||||
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
|
||||||
@ -103,3 +106,57 @@ mixer_all_set_volume(unsigned volume)
|
|||||||
|
|
||||||
return success;
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -43,4 +43,20 @@ mixer_all_get_volume(void);
|
|||||||
bool
|
bool
|
||||||
mixer_all_set_volume(unsigned volume);
|
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
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user