Skip to content
Snippets Groups Projects
Select Git revision
  • ab0c6edc63fa0dceac7a847ca276910a03119b12
  • jk default protected
2 results

display.c

Blame
  • 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))
    	    {