如何禁用或重新定向ALSA lib记录日志

3
我有一个C++应用程序,使用libespeak和ALSA扩展库。当这个应用程序第一次产生音频时,它会在stderr上产生以下输出:
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib pcm_dmix.c:961:(snd_pcm_dmix_open) The dmix plugin supports only playback stream
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started

我有自己的日志记录系统,希望能够禁用这些错误,或将它们通过我的日志框架重新路由,以便进行额外的处理和报告。


1
只有部分消息来自ALSA。这是PortAudio bug - CL.
3个回答

3
可以使用 freopen 来重定向 stderr 的输出。(参见 Is it possible to disable stderr in C++?)在我的情况下,当调用 Pa_Initialize() 时会产生错误,所以我在调用之前将 stderr 重定向到 /dev/null,并在调用后将其恢复。
freopen("/dev/null","w",stderr);
PaError err= Pa_Initialize();
freopen("/dev/tty","w",stderr);

不错的方法。谢谢,我会试试看。 - Drew Noakes
根据几年前的评论[https://app.assembla.com/spaces/arhHGeUuSr4k70eJe4gwI3/tickets/163/details?comment=65633503],在CL链接的错误中,这似乎不是PortAudio的优先事项。像这样的解决方案可能最适合在freopen的性能不会成为问题的情况下使用。 - cardiff space man

2

0

这对我有效

#include <fcntl.h>

int main()
{
    int saved_stderr = dup(STDERR_FILENO);
    int devnull = open("/dev/null", O_RDWR);
    dup2(devnull, STDERR_FILENO);  // Replace standard out
    Pa_Initialize();
    dup2(saved_stderr, STDERR_FILENO);
}

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