Zjištění hlasitosti zvuku v C++ na Linuxu
26.2.2020
Pokud chceme v Linuxu ve vlastním programu zjistit aktuálně nastavenou úroveň hlasitosti zvuku výchozího výstupního zařízení, můžeme využít knihovny ALSA (Advanced Linux Sound Architecture), resp. jejího rozhraní v jazyce C.
Pro překlad a sestavení je třeba nainstalovat balíček libasound2-dev. V Debianu (a v další na něm založených distribucích) je ve standardním repositáři, tj.
su - apt install libasound2-dev
Následující jednoduchá ukázka kódu zjistí a vypíše aktuální úroveň hlasitosti v procentech a také hodnoty z nichž je vypočtena, tj. minimální, maximální a aktuální úroveň.
#include <stdlib.h>
#include <stdio.h>
#include <alsa/asoundlib.h>
#include <alsa/mixer.h>
int main(int argc, char const *argv[])
{
const char* szcard = "default";
const char* szname = "Master";
long vmin;
long vmax;
long volume;
snd_mixer_t* hmixer;
snd_mixer_selem_id_t* selid;
snd_mixer_elem_t* pelem;
while(true)
{
if (0 != snd_mixer_open(&hmixer, 0))
break;
if (0 != snd_mixer_attach(hmixer, szcard))
break;
if (0 != snd_mixer_selem_register(hmixer, NULL, NULL))
break;
if (0 != snd_mixer_load(hmixer))
break;
snd_mixer_selem_id_alloca(&selid);
if (NULL == selid)
break;
snd_mixer_selem_id_set_index(selid, 0);
snd_mixer_selem_id_set_name(selid, szname);
pelem = snd_mixer_find_selem(hmixer, selid);
if (NULL == pelem)
break;
if (0 != snd_mixer_selem_get_playback_volume_range(pelem, &vmin, &vmax))
break;
if (0 != snd_mixer_selem_get_playback_volume(pelem, SND_MIXER_SCHN_MONO, &volume))
break;
printf("volume: %ld%c\n", volume * 100 / vmax, '%');
printf("volume: %ld (%ld - %ld)\n", volume, vmin, vmax);
return EXIT_SUCCESS;
}
printf("Došlo k chybě...");
return EXIT_FAILURE;
}
Kód přeložíme překladačem GCC následovně:
g++ get-sound-volume.cpp -g -Wall -lasound -oget-sound-volume