Re: [hackers] [PATCH] volume: compute volume by alsa api on linux
 
Works great! There's just still one issue as far as I can see. How do you
select a mixer when you have multiple cards (for example usb Microphone in)?
On Tue, Apr 2, 2019 at 3:11 AM Doan Tran Cong Danh <congdanhqx_AT_gmail.com>
wrote:
> From: Đoàn Trần Công Danh <congdanhqx_AT_gmail.com>
>
> There's a non-posix assignment inside config.mk,
> but it's supported with both gmake and bmake.
>
>     var != shell command
> ---
>  components/volume.c | 59 +++++++++++++++++++++++++++++++++++++++++++++
>  config.def.h        |  1 +
>  config.mk           |  3 ++-
>  3 files changed, 62 insertions(+), 1 deletion(-)
>
> diff --git a/components/volume.c b/components/volume.c
> index 61cec90..eeb3975 100644
> --- a/components/volume.c
> +++ b/components/volume.c
> _AT__AT_ -1,5 +1,6 @@
>  /* See LICENSE file for copyright and license details. */
>  #include <fcntl.h>
> +#include <limits.h>
>  #include <stdio.h>
>  #include <string.h>
>  #include <sys/ioctl.h>
> _AT__AT_ -72,6 +73,64 @@
>
>                 return bprintf("%d", m ? 0 : v * 100 / 255);
>         }
> +#elif defined(__linux__)
> +#include <alsa/asoundlib.h>
> +#include <alsa/control.h>
> +
> +#define SOUND_CARD "default"
> +#define MIXER_IDX 0
> +
> +const char*
> +vol_perc(const char *mixer)
> +{
> +       snd_mixer_t* handle;
> +       snd_mixer_elem_t* elem;
> +       snd_mixer_selem_id_t* sid;
> +       snd_mixer_selem_channel_id_t c;
> +
> +       int emute, muted = 0;
> +       long minv, maxv, elemv, vol = LONG_MIN;
> +       const char *result = NULL;
> +
> +       snd_mixer_selem_id_alloca(&sid);
> +
> +       //sets simple-mixer index and name
> +       snd_mixer_selem_id_set_index(sid, MIXER_IDX);
> +       snd_mixer_selem_id_set_name(sid, mixer);
> +
> +       if ((snd_mixer_open(&handle, 0)) < 0)
> +               goto out;
> +       if (snd_mixer_attach(handle, SOUND_CARD) < 0 ||
> +           snd_mixer_selem_register(handle, NULL, NULL) < 0 ||
> +           snd_mixer_load(handle) < 0 ||
> +           !(elem = snd_mixer_find_selem(handle, sid)))
> +               goto cleanup;
> +
> +       snd_mixer_selem_get_playback_volume_range(elem, &minv, &maxv);
> +
> +       if(minv == maxv)
> +               goto cleanup;
> +
> +       for (c = 0; c <= SND_MIXER_SCHN_LAST; ++c)
> +               if (snd_mixer_selem_has_playback_channel(elem, c)) {
> +                       if (!snd_mixer_selem_get_playback_volume(elem, c,
> &elemv)
> +                           && elemv > vol)
> +                               vol = elemv;
> +                       if (!muted
> +                           && !snd_mixer_selem_get_playback_switch(elem,
> c, &emute))
> +                               muted = !emute;
> +               }
> +       if (minv > vol || maxv < vol)
> +               goto cleanup;
> +
> +       result = bprintf("%d%% [%s]",
> +                        (200 * (vol - minv) + maxv - minv) / (maxv -
> minv) / 2,
> +                        muted ? "off" : "on");
> +cleanup:
> +       snd_mixer_close(handle);
> +out:
> +       return result;
> +}
>  #else
>         #include <sys/soundcard.h>
>
> diff --git a/config.def.h b/config.def.h
> index e06be66..40f0a28 100644
> --- a/config.def.h
> +++ b/config.def.h
> _AT__AT_ -58,6 +58,7 @@ static const char unknown_str[] = "n/a";
>   * uptime              system uptime                   NULL
>   * username            username of current user        NULL
>   * vol_perc            OSS/ALSA volume in percent      mixer file
> (/dev/mixer)
> + *                                                     mixer name on
> Linux (Master)
>   * wifi_perc           WiFi signal in percent          interface name
> (wlan0)
>   * wifi_essid          WiFi ESSID                      interface name
> (wlan0)
>   */
> diff --git a/config.mk b/config.mk
> index 3b32b7c..6903fe1 100644
> --- a/config.mk
> +++ b/config.mk
> _AT__AT_ -14,7 +14,8 @@ X11LIB = /usr/X11R6/lib
>  CPPFLAGS = -I$(X11INC) -D_DEFAULT_SOURCE
>  CFLAGS   = -std=c99 -pedantic -Wall -Wextra -Os
>  LDFLAGS  = -L$(X11LIB) -s
> -LDLIBS   = -lX11
> +ALSALIBS != [ Linux = `uname -s` ] && printf "%s" "-lasound"
> +LDLIBS   = -lX11 $(ALSALIBS)
>
>  # compiler and linker
>  CC = cc
> --
> 2.21.0
>
>
>
Received on Tue Apr 02 2019 - 11:30:37 CEST
This archive was generated by hypermail 2.3.0
: Tue Apr 02 2019 - 13:48:22 CEST