<p data-ke-size="size16">pyaudio 를 쓰면서 좀 짜증아 났던 부분이 강제적인 디버그 메시지를 봐야 한다는 것입니다.</p>
<p data-ke-size="size16">구현한 프로그램이 시스템의 서비스로 등록되면 해당 메시지가 syslog 를 당당하게 차지하기도 합니다.</p>
<p data-ke-size="size16"> </p>
<p data-ke-size="size16">보통은 /usr/share/alsa/alsa.conf 파일이나 ~/.asoundrc 파일이나 /etc/asound.conf 설정이 문제가 있어서 발생하는 메시지라고 합니다.</p>
<p data-ke-size="size16">가장 좋은 것은 최적화된 설정을 찾아서 고치는 것이겠죠..</p>
<p data-ke-size="size16"> </p>
<p data-ke-size="size16">고치지 않아도 동작 잘 되고, 위의 alsa 설정 고치기도 머리 아프고, 지저분한 것이 싫은 경우에는 에러 핸들러를 비워주면 해당 메시지 없이 사용할 수 있습니다.</p>
<pre id="code_1697610569884" class="python" data-ke-language="python" data-ke-type="codeblock"><code>#!/usr/bin/env python
from ctypes import *
import pyaudio
# c 언어에서 호출을 알아먹을 수 있도록 둘러쌓는(wrapping) 코드
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):
pass
# c 라이브러리에 에러 핸들러 등록
# 반드시 pyaudio 호출 전에 호출
c_error_handler = ERROR_HANDLER_FUNC(py_error_handler)
asound = cdll.LoadLibrary('libasound.so')
asound.snd_lib_error_set_handler(c_error_handler)
# pyaudio 를 사용하는 실제 구현 부분
p = pyaudio.PyAudio()
# ......
p.terminate()
# 프로그램 종료시 기본 핸들러로 돌아가게끔 현재 핸들러 등록 해제
asound.snd_lib_error_set_handler(None)</code></pre>
<p data-ke-size="size16">위 내용은 stackoverflow 의 한 <a href="https://stackoverflow.com/questions/7088672/pyaudio-working-but-spits-out-error-messages-each-time#answer-13453192" target="_blank" rel="noopener">답변</a>에서 찾은 내용인데 핵심은</p>
<ol style="list-style-type: decimal;" data-ke-list-type="decimal">
<li>빈 에러 핸들러(py_error_handler) 를 만들고</li>
<li>C 라이브러리(libasound.so) 가 인식할 수 있게 둘러쌓은 다음(ERROR_HANDLER_FUNC(py_error_handler))</li>
<li>이 함수를 C 라이브러리의 새 핸들러로 등록하는 것입니다.(asound.snd_lib_error_set_handler(c_error_handler))</li>
<li>혹시 모르니 프로그램 끝날 때 이 빈 핸들러를 등록해제 해주면 좋겠죠(asound.snd_lib_error_set_handler(None))</li>
</ol>
<p data-ke-size="size16">전 이방법을 적용해서 디버그 메시지를 꺼버렸습니다!!</p>
↧