slstatus-alsa-4bd78c9.patch - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       slstatus-alsa-4bd78c9.patch (2083B)
       ---
            1 Author: Ivan Krylov <krylov.r00t@gmail.com>
            2 Date:   Sat May 4 11:59:58 2019 +0300
            3 
            4     Add ALSA volume support
            5     
            6     To use, add -DALSA to CPPFLAGS, -lasound to LDFLAGS and pass the
            7     control name (e.g. Master) as argument to vol_perc in config.h.
            8 
            9 diff --git a/components/volume.c b/components/volume.c
           10 index 6cec556..15c5a39 100644
           11 --- a/components/volume.c
           12 +++ b/components/volume.c
           13 @@ -182,6 +182,61 @@
           14  
           15                  return bprintf("%d", value);
           16          }
           17 +#elif defined(ALSA)
           18 +        #include <alsa/asoundlib.h>
           19 +
           20 +        static const char *devname = "default";
           21 +        const char *
           22 +        vol_perc(const char *mixname)
           23 +        {
           24 +                snd_mixer_t *mixer = NULL;
           25 +                snd_mixer_selem_id_t *mixid = NULL;
           26 +                snd_mixer_elem_t *elem = NULL;
           27 +                long min = 0, max = 0, volume = -1;
           28 +                int err;
           29 +
           30 +                if ((err = snd_mixer_open(&mixer, 0))) {
           31 +                        warn("snd_mixer_open: %d", err);
           32 +                        return NULL;
           33 +                }
           34 +                if ((err = snd_mixer_attach(mixer, devname))) {
           35 +                        warn("snd_mixer_attach(mixer, \"%s\"): %d", devname, err);
           36 +                        goto cleanup;
           37 +                }
           38 +                if ((err = snd_mixer_selem_register(mixer, NULL, NULL))) {
           39 +                        warn("snd_mixer_selem_register(mixer, NULL, NULL): %d", err);
           40 +                        goto cleanup;
           41 +                }
           42 +                if ((err = snd_mixer_load(mixer))) {
           43 +                        warn("snd_mixer_load(mixer): %d", err);
           44 +                        goto cleanup;
           45 +                }
           46 +
           47 +                snd_mixer_selem_id_alloca(&mixid);
           48 +                snd_mixer_selem_id_set_name(mixid, mixname);
           49 +                snd_mixer_selem_id_set_index(mixid, 0);
           50 +
           51 +                elem = snd_mixer_find_selem(mixer, mixid);
           52 +                if (!elem) {
           53 +                        warn("snd_mixer_find_selem(mixer, \"%s\") == NULL", mixname);
           54 +                        goto cleanup;
           55 +                }
           56 +
           57 +                if ((err = snd_mixer_selem_get_playback_volume_range(elem, &min, &max))) {
           58 +                        warn("snd_mixer_selem_get_playback_volume_range(): %d", err);
           59 +                        goto cleanup;
           60 +                }
           61 +                if ((err = snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_MONO, &volume))) {
           62 +                        warn("snd_mixer_selem_get_playback_volume(): %d", err);
           63 +                }
           64 +
           65 +        cleanup:
           66 +                snd_mixer_free(mixer);
           67 +                snd_mixer_detach(mixer, devname);
           68 +                snd_mixer_close(mixer);
           69 +
           70 +                return volume == -1 ? NULL : bprintf("%.0f", (volume-min)*100./(max-min));
           71 +        }
           72  #else
           73          #include <sys/soundcard.h>
           74