Radek Chalupa   konzultace a školení programování, vývoj software na zakázku

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