Я управляю громкостью динамика через библиотеку Alsa amixer в Linux.У меня проблема в том, что он не контролирует громкость в правильном масштабе между [0,100] процентами. Этот пример кода, который я получил отсюда Установите основной объем ALSA из кода C
//volume.c
#include<stdio.h>
#include<alsa/asoundlib.h>
int main(int argc, char *argv[])
{
long volume=atoi(argv[1]);
long min, max;
snd_mixer_t *handle;
snd_mixer_selem_id_t *sid;
const char *card = "hw:0";
const char *selem_name = "Speaker";
snd_mixer_open(&handle, 0);
snd_mixer_attach(handle, card);
snd_mixer_selem_register(handle, NULL, NULL);
snd_mixer_load(handle);
snd_mixer_selem_id_alloca(&sid);
snd_mixer_selem_id_set_index(sid, 0);
snd_mixer_selem_id_set_name(sid, selem_name);
snd_mixer_elem_t* elem = snd_mixer_find_selem(handle, sid);
snd_mixer_selem_get_playback_volume_range(elem, &min, &max);
snd_mixer_selem_set_playback_volume_all(elem, volume * max / 100);
snd_mixer_close(handle);
}
//compiling source code
gcc volume.c -o volume -lasound
//set volume of speaker 90%
./volume 90
вышеуказанная программа не устанавливает громкость в правильном процентном соотношении, которое я передаю в качестве аргумента.
Процент, заданный для громкости программы -> фактический установленный объем
0-> 0
10-> 2
20-> 6
30-> 10
40-> 15
50-> 22 * 1020 *
60-> 31
70-> 41
80-> 56
90-> 75
100-> 100
Как показано выше, когда я устанавливаю громкость в диапазоне [0,100]%, я получаю приведенный объем в другом масштабе.для значения 40 он установит громкость на 15%.
Как настроить громкость в правильном масштабе в пределах [0,100] процента?