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

Posted

技术标签:

【中文标题】如何使用 Alsa 库更改扬声器的音量?【英文标题】:How to change volume of Speaker using Alsa library? 【发布时间】:2019-11-02 15:10:13 【问题描述】:

我在 Linux 上使用 Alsa amixer 库控制扬声器的音量。 我遇到的问题是它没有在 [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】:

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

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

【讨论】:

所以这意味着库给出的行为是正确的。那么如何在 [0,100] 对数刻度之间控制音量,就像 Ubuntu 等操作系统中的声音滑块一样?@meaning-matters

以上是关于如何使用 Alsa 库更改扬声器的音量?的主要内容,如果未能解决你的问题,请参考以下文章

android2.3采用alsa作为音频系统,在asound.conf中的扬声器音量设置问题。

iOS:静音右声道音量

在 C 中使用 ALSA 以不同的音量播放多个 wav 文件

如何使用 C# 使用 ALSA 在 Linux 中获取和设置音量?

从 C 代码中获取 ALSA 峰值

如何获得扬声器音量级别? [复制]