ALSA库调用无法按预期使用root权限工作

时间:2016-08-14 19:21:50

标签: c++ linux alsa

我尝试使用我从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机器上运行。

0 个答案:

没有答案