如何以root身份使用pulseaudio API?

时间:2017-02-25 16:11:59

标签: c raspberry-pi pulseaudio

我目前正在尝试使用pulseaudio simple API来记录我的USB声卡中的麦克风数据和我的Rasberry pi 3.我在我自己的程序中使用了来自pulseaudio的示例程序parec-simple相当不错。

我使用此代码的程序是访问gpio的,所以我需要以root身份运行它。但是,当我尝试以root身份执行程序时,我收到以下错误:

Home directory not accessible: Permission denied
W: [pulseaudio] core-util.c: Failed to open configuration file '/root/.config/pulse//daemon.conf': Permission denied
W: [pulseaudio] daemon-conf.c: Failed to open configuration file: Permission denied
pa_simple_new() failed: Connection refused

使用的代码如下:

static const pa_sample_spec ss = {
    .format = PA_SAMPLE_S16LE,
    .rate = 44100,
    .channels = 1
};
pa_simple *s = NULL;
int ret = 1;
int error;
/* Create the recording stream */
if (!(s = pa_simple_new(NULL, argv[0], PA_STREAM_RECORD, NULL, "record", &ss, NULL, NULL, &error))) {
    fprintf(stderr, "pa_simple_new() failed: %s\n", pa_strerror(error));
    goto finish;
}



while(1)
{
    uint8_t buf[BUFSIZE];
    /* Record some data ... */
    if (pa_simple_read(s, buf, sizeof(buf), &error) < 0) {
        fprintf(stderr, __FILE__": pa_simple_read() failed: %s\n", pa_strerror(error));
        goto finish;
    }

    /* And write it to STDOUT */
    if (loop_write(STDOUT_FILENO, buf, sizeof(buf)) != sizeof(buf)) {
        fprintf(stderr, __FILE__": write() failed: %s\n", strerror(errno));
        goto finish;
    }

}
   ret = 0;
finish:
    if (s)
        pa_simple_free(s);
    return ret;

我已根据建议here尝试chown pi:pi /home/pi尝试修复它,但它不起作用。将/ home / pi的所有者从pi更改为root也不适用于我。

我也试过了一次干净的重新安装的pulseaudio,但不幸的是它没有解决它。

那么我该怎么做才能解决这些错误?

2 个答案:

答案 0 :(得分:0)

如果您需要以root用户身份运行程序,则必须模拟root。我不知道pulseaudio是否查看用户名以查找配置文件,或者查看$ HOME变量。在第二种情况下,也许通过将HOME设置为“工作”用户的家庭有帮助。

无论如何,你所说的情况很清楚:pulseaudio找不到文件:

  

'/根/的.config /脉冲// daemon.conf'

在该目录中放置一个正确的“daemon.conf” - 可能你可以从某个地方复制它(比如/home/auser/.config/pulse/daemon.conf)。

考虑名称以点开头的目录通常是隐藏的;如果使用文件管理器,则必须启用“显示隐藏文件”,如果使用shell,ls -a可以提供帮助。

您的第一个目标是确认该文件存在,并且您的程序不应该抱怨丢失/不可读的配置文件。然后,也许会出现其他错误,但是,一个接一个,你可以消除它们。

答案 1 :(得分:0)

使用sudo运行进程时,它不会将主目录更改为/root-sudo echo $HOME # /home/username。您需要通过运行sudo HOME=/root executable来指定HOME目录。

当您想从根目录访问Pulseaudio时,需要使用命令sudo pulseaudio --system=true在系统范围内运行它。

然后您将收到Pulseaudio的错误消息:

W: [pulseaudio] protocol-native.c: Denied access to client with invalid authentication data.

可以通过将root个用户添加到audio-pulse组-sudo adduser root pulse-access中来解决。