如何禁用或重新路由ALSA库日志记录

How to disable or re-route ALSA lib logging

本文关键字:ALSA 日志 记录 路由 何禁用 新路由      更新时间:2023-10-16

我有一个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

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

可以使用freopen重定向stderr的输出。(有可能在c++中禁用stderr吗?)在我的例子中,这些错误是在调用Pa_Initialize();时生成的,所以我在调用stderr之前将其重定向到/dev/null,然后将其重定向回。

freopen("/dev/null","w",stderr);
PaError err= Pa_Initialize();
freopen("/dev/tty","w",stderr);

您可以查看snd_lib_error_set_handler函数来注册任意错误处理回调。

http://www.alsa-project.org/alsa-doc/alsa-lib/group___error.html ga6ba1f0aa6c6bc5d335ab297d6019cb03

这对我有用

#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);
}