새소식

Programming/python

[python3][pyaudio] 초기화 디버그 메시지 숨기기

  • -

pyaudio 를 쓰면서 좀 짜증아 났던 부분이 강제적인 디버그 메시지를 봐야 한다는 것입니다.

구현한 프로그램이 시스템의 서비스로 등록되면 해당 메시지가 syslog 를 당당하게 차지하기도 합니다.

 

보통은 /usr/share/alsa/alsa.conf 파일이나 ~/.asoundrc 파일이나 /etc/asound.conf 설정이 문제가 있어서 발생하는 메시지라고 합니다.

가장 좋은 것은 최적화된 설정을 찾아서 고치는 것이겠죠..

 

고치지 않아도 동작 잘 되고, 위의 alsa 설정 고치기도 머리 아프고, 지저분한 것이 싫은 경우에는 에러 핸들러를 비워주면 해당 메시지 없이 사용할 수 있습니다.

#!/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)

위 내용은 stackoverflow 의 한 답변에서 찾은 내용인데 핵심은

  1. 빈 에러 핸들러(py_error_handler) 를 만들고
  2. C 라이브러리(libasound.so) 가 인식할 수 있게 둘러쌓은 다음(ERROR_HANDLER_FUNC(py_error_handler))
  3. 이 함수를 C 라이브러리의 새 핸들러로 등록하는 것입니다.(asound.snd_lib_error_set_handler(c_error_handler))
  4. 혹시 모르니 프로그램 끝날 때 이 빈 핸들러를 등록해제 해주면 좋겠죠(asound.snd_lib_error_set_handler(None))

전 이방법을 적용해서 디버그 메시지를 꺼버렸습니다!!

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.