Select Git revision
-
Jiří Kalvoda authoredJiří Kalvoda authored
osd-alsa.c 5.31 KiB
/*
* A Simple ALSA Volume Control via OSD
*
* (c) 2012 Martin Mares <mj@ucw.cz>
*/
#undef DEBUG
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <getopt.h>
#include <alsa/asoundlib.h>
#include "util.h"
#include "osd.h"
static char *alsa_device = "default";
static char *mixer_control = "Master";
static int adjust_by;
static int want_mute = -1;
static snd_mixer_t *mixer;
static snd_mixer_elem_t *elem;
static void init_mixer(void)
{
int err;
if (err = snd_mixer_open(&mixer, 0))
die("snd_mixer_open failed: error %d", err);
if (err = snd_mixer_attach(mixer, alsa_device))
die("snd_mixer_attach failed: error %d", err);
if (err = snd_mixer_selem_register(mixer, NULL, NULL))
die("snd_mixer_selem_register failed: error %d", err);
if (err = snd_mixer_load(mixer))
die("snd_mixer_load: error %d", err);
for (elem = snd_mixer_first_elem(mixer); elem; elem = snd_mixer_elem_next(elem))
{
const char *name = snd_mixer_selem_get_name(elem);
int index = snd_mixer_selem_get_index(elem);
if (!strcmp(name, mixer_control) || index)
{
if (snd_mixer_elem_get_type(elem) != SND_MIXER_ELEM_SIMPLE)
die("Unable to handle non-simple mixer controls");
if (!snd_mixer_selem_is_active(elem))
die("Selected mixer control is not active");
DBG("Found mixer control %s[%d]\n", name, index);
return;
}
}
die("Unable to find mixer control %s", mixer_control);
}
static int get_mute(void)
{
int mute_on = 0, mute_off = 0;
if (snd_mixer_selem_has_playback_switch(elem))
{
for (snd_mixer_selem_channel_id_t ch=0; ch < SND_MIXER_SCHN_LAST; ch++)
{
int val;
if (!snd_mixer_selem_get_playback_switch(elem, ch, &val))
{