ALSA图书馆称don';无法使用root权限按预期工作 我试图从C++代码中设置系统回放音量,但我得到了一个函数(虽然我做了一些小的修改,比如不让变量未初始化)。

ALSA图书馆称don';无法使用root权限按预期工作 我试图从C++代码中设置系统回放音量,但我得到了一个函数(虽然我做了一些小的修改,比如不让变量未初始化)。,c++,linux,alsa,C++,Linux,Alsa,这是一个完全有效的简单示例: #包括 #包括 #包括 使用名称空间std; 无效设置卷(长卷){ 长vMin{0}; 长vMax{0}; snd_mixer_t*句柄{nullptr}; snd_mixer_selem_id_t*sid{nullptr}; 静态常量字符*卡{“默认”}; 静态常量char*selem_name{“Master”}; snd_混合器_打开(&handle,0); snd_混合器_附件(手柄、卡); snd_混频器_selem_寄存器(句柄、nullptr、null

这是一个完全有效的简单示例:

#包括
#包括
#包括
使用名称空间std;
无效设置卷(长卷){
长vMin{0};
长vMax{0};
snd_mixer_t*句柄{nullptr};
snd_mixer_selem_id_t*sid{nullptr};
静态常量字符*卡{“默认”};
静态常量char*selem_name{“Master”};
snd_混合器_打开(&handle,0);
snd_混合器_附件(手柄、卡);
snd_混频器_selem_寄存器(句柄、nullptr、nullptr);
snd_搅拌机_负载(手柄);
snd_混合器_selem_id_alloca(&sid);
snd_mixer_selem_id_set_index(sid,0);
snd_mixer_selem_id_set_name(sid,selem_name);
自动元素=snd\u mixer\u find\u selem(句柄,sid);
snd_混音器_selem_get_playback_volume_range(elem,&vMin,&vMax);
snd_mixer_selem_set_playback_volume_all(elem,vMin+static_cast(static_cast(vMax-vMin)/100.0*static_cast(volume));
snd_混合器_关闭(手柄);
}
int main(){
cout>vol;
设定体积(vol);
}
要编译它,您需要
libasound2dev
包、
-lasound
链接器标志和一个C++11编译器

代码是相当自我解释的。输入一个0-100范围内的整数,程序会将播放音量设置为该值。这只是一个简单的程序,可以真正测试
setVolume
功能

它在正常启动时工作得非常好,但每当我以root权限(sudo)启动它时,它就不工作了。问题是当程序以root用户身份运行时,
snd\u mixer\u find\u selem
将返回
NULL

我试图查看ALSA文档以及库本身的实际源文件,但找不到任何有用的东西


我在Raspbian上的Raspberry Pi 3上运行这个,但是它应该可以在任何Linux机器上运行。

也许你在用户的home目录中有正确的
~/.asoundrc
~/.alsarc
,但没有正确的
/etc/asound.conf
?也许以root用户身份运行
alsactl init
(我不知道这是否重要)?@gavv我没有这些文件,而运行这个命令根本没有帮助。我马上就要在Ubuntu上试用它,看看它是否工作得很好,出于某种原因,我无法在Ubuntu上编译它。链接器抱怨它找不到ALSA函数的引用,即使我安装了库并且使用了正确的链接器标志。但无论如何,问题仍然存在于我的Pi上。请尝试在ptrace/strace下运行您的程序,并比较user和root的输出?顺便说一句,无论哪种方式(在Gentoo上)对我都很好。也许你在用户的主页目录中有正确的
~/.asoundrc
~/.alsarc
,但没有正确的
/etc/asound.conf
?也许以root用户身份运行
alsactl init
(我不知道这是否重要)?@gavv我没有这些文件,而运行这个命令根本没有帮助。我马上就要在Ubuntu上试用它,看看它是否工作得很好,出于某种原因,我无法在Ubuntu上编译它。链接器抱怨它找不到ALSA函数的引用,即使我安装了库并且使用了正确的链接器标志。但无论如何,问题仍然存在于我的Pi上。请尝试在ptrace/strace下运行您的程序,并比较user和root的输出?顺便说一句,无论哪种方式对我来说都很好(不过在Gentoo上)。