如何使用Alsa库更改扬声器的音量?

时间:2019-06-19 20:04:47

标签: c linux audio alsa libalsa

我正在Linux上使用Alsa amixer库控制Speaker的音量。 我的问题是,它无法将音量控制在[0,100]百分比之间的适当范围内。 Set ALSA master volume from C code

//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

60-> 31

70-> 41

80-> 56

90-> 75

100-> 100

如上所示,当我将音量设置在[0,100]%范围内时,我得到的是不同比例的结果音量。如果值为40,则将音量设置为15%。

如何在[0,100]个百分比之间以适当的比例设置音量?

1 个答案:

答案 0 :(得分:0)

您看到的是对数标度。因此,您为您设置的百分比可以很好地转换,以便我们的耳朵体验线性比例。

这是设置音量的唯一正确方法,您可以阅读here for example