我尝试使用我从here获得的函数从C ++代码设置系统的播放音量(虽然我做了一些小的修改,比如没有保留未初始化的变量)。
这是一个完全有效的简单示例:
#include <iostream>
#include <alsa/asoundlib.h>
#include <alsa/mixer.h>
using namespace std;
void setVolume(long volume) {
long vMin{ 0 };
long vMax{ 0 };
snd_mixer_t* handle{ nullptr };
snd_mixer_selem_id_t* sid{ nullptr };
static const char* card{ "default" };
static const char* selem_name{ "Master" };
snd_mixer_open(&handle, 0);
snd_mixer_attach(handle, card);
snd_mixer_selem_register(handle, nullptr, nullptr);
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);
auto elem = snd_mixer_find_selem(handle, sid);
snd_mixer_selem_get_playback_volume_range(elem, &vMin, &vMax);
snd_mixer_selem_set_playback_volume_all(elem, vMin + static_cast<long>(static_cast<double>(vMax - vMin) / 100.0 * static_cast<double>(volume)));
snd_mixer_close(handle);
}
int main() {
cout << "Volume (0-100): ";
long vol{ 0 };
cin >> vol;
setVolume(vol);
}
要编译它,您需要
libasound2-dev
包,-lasound
链接器标志和C ++ 11编译器
代码非常自我解释。键入0-100范围内的整数,程序将播放音量设置为该值。这只是一个真正测试setVolume
函数的简单程序。
正常启动时效果非常好,但每当我使用root权限(sudo)启动它时,它都无法正常工作。问题是当程序以root身份运行时snd_mixer_find_selem
将返回NULL
。
我尝试查看ALSA文档以及库本身的实际源文件,但我找不到任何有用的东西。
我在Raspbian上的Raspberry Pi 3上运行它,但它应该可以在任何Linux机器上运行。