Radek Chalupavývoj software na zakázku, školení a konzultace
Domů | Vývoj software | Školení a konzultace | Články | Ukázky kódu | Freeware | Kontakt

Využijte možnost komunikace na dálku

Využijte možnosti školení a konzultací distanční formou s využitím online komunikace (Skype a další)

Nejnovější příspěvky

Zjištění hlasitosti zvuku v C++ na Linuxu
Jak v C/C++ na Linuxu s využitím rozhraní knihovny ALSA zjistit aktuálně nastavenou úroveň hlasitosti výchozího výstupního zvukového zařízení. (26.2.2020)

Vlastní sledování využití paměti v panelu Xfce
jednoduchý program v C++ pro zobrazení využité paměti v panelu Xfce s vlastním formátem výstupu. (16.2.2020)

Databáze SQLite - nadstavba v C++
Ukázka jednoduché třídy v C++ v Linuxu pro zapouzření některých běžných funkcí databáze SQLite. (3.2.2020)

Databáze SQLite v C++ - kódování textů
Jaké kódování, resp. znakové sady použít při ukládání a načítání textových položek v databázi SQLite v C/C++? (7.12.2019)

Databáze SQLite v C++ - třídění českých textů
Ukážeme si jak při výpisu dat z databáze SQLite dosáhnout správného českého řazení textů obsahujících diakritiku. (22.11.2019)

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

Máte připomínku, dotaz nebo komentář k článku a souvisejícími tématy?

Napište a odešlete ji emailem

Copyright © 2020  Radek Chalupa