从C代码设置ALSA主音量

34

我一直在寻找一个简单的C代码示例来设置ALSA混音器的主音量,但是没有找到任何简单的东西来执行这个被认为是常见操作的任务。

我对ALSA完全不熟悉,因此自己制作一个最小的示例将需要时间。如果有人能提供一个示例,我会很高兴的。

1个回答

57

以下方法适用于我。参数volume应该在[0, 100]范围内给定。请注意,没有错误处理!

void SetAlsaMasterVolume(long volume)
{
    long min, max;
    snd_mixer_t *handle;
    snd_mixer_selem_id_t *sid;
    const char *card = "default";
    const char *selem_name = "Master";

    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);
}

3
这些属于哪个头文件? - Jonathan Henson
5
@JonathanHenson说: #include <alsa/asoundlib.h>。我认为可能有一个包含较少的头文件,也许是 #include <alsa/mixer.h>。 - trenki
2
我想我本可以从 pkg-config --cflags alsa 中检索输出。不管怎样,谢谢! - Jonathan Henson
2
@trenki,对于我来说,Master作为元素不存在。我如何获取所有的couple card/elem名称?例如,“默认”卡名称对我来说似乎是可以的,即使aplay -l/-L不显示默认卡名称...我尝试了一段代码来枚举所有的card/elem,但没有成功:https://fossies.org/linux/audacity-minsrc/lib-src/portmixer/src/px_linux_alsa.c - ArthurLambert
5
这似乎是目前可用的使用混音器API文档中最好的。能否通过一些注释来解释为什么需要调用这些函数以改进它?实际的API文档非常有限。 - Remco Poelstra
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接