你可以嘗試清理你的ALSA的配置,例如,
ALSA lib pcm.c:2212:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2212:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2212:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
由/usr/share/alsa/alsa.conf
引起:
pcm.rear cards.pcm.rear
pcm.center_lfe cards.pcm.center_lfe
pcm.side cards.pcm.side
一旦你註釋掉這些行,這些錯誤信息將不復存在。您可能還想檢查~/.asoundrc
和/etc/asound.conf
。
這就是說,其中一些消息告訴你的配置有問題,儘管它們不會引起任何實際問題。我不建議你清理alsa.conf
,因爲它最初來自ALSA,所以當你更新alsa-lib時它可能會被覆蓋。
有抑制在Python所述消息的方式,這裏是一個示例代碼:
#!/usr/bin/env python
from ctypes import *
import pyaudio
# From alsa-lib Git 3fd4ab9be0db7c7430ebd258f2717a976381715d
# $ grep -rn snd_lib_error_handler_t
# include/error.h:59:typedef void (*snd_lib_error_handler_t)(const char *file, int line, const char *function, int err, const char *fmt, ...) /* __attribute__ ((format (printf, 5, 6))) */;
# Define our error handler type
ERROR_HANDLER_FUNC = CFUNCTYPE(None, c_char_p, c_int, c_char_p, c_int, c_char_p)
def py_error_handler(filename, line, function, err, fmt):
print 'messages are yummy'
c_error_handler = ERROR_HANDLER_FUNC(py_error_handler)
asound = cdll.LoadLibrary('libasound.so')
# Set error handler
asound.snd_lib_error_set_handler(c_error_handler)
# Initialize PyAudio
p = pyaudio.PyAudio()
p.terminate()
print '-'*40
# Reset to default error handler
asound.snd_lib_error_set_handler(None)
# Re-initialize
p = pyaudio.PyAudio()
p.terminate()
從我的計算機的輸出:
messages are yummy
messages are yummy
messages are yummy
messages are yummy
messages are yummy
messages are yummy
----------------------------------------
ALSA lib pcm_dmix.c:1018:(snd_pcm_dmix_open) unable to open slave
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib pcm_dmix.c:957:(snd_pcm_dmix_open) The dmix plugin supports only playback stream
ALSA lib pcm_dmix.c:1018:(snd_pcm_dmix_open) unable to open slave
這些消息由ALSA-lib的打印輸出而不是PyAudio或PortAudio。該代碼直接使用alsa-lib snd_lib_error_set_handler
函數來設置錯誤處理程序py_error_handler
,您可以使用它來刪除任何消息。
我檢查了其他Python ALSA綁定,pyalsa和PyAlsaAudio,它們不支持設置錯誤處理程序。但是,PortAudio上有an issue,所有的ALSA錯誤消息似乎都被壓縮了。
這不會擺脫傑克的消息,對吧? – Matthias