|
7 | 7 | import wave
|
8 | 8 | import os
|
9 | 9 | import logging
|
| 10 | +from ctypes import * |
| 11 | +from contextlib import contextmanager |
10 | 12 |
|
11 | 13 | logging.basicConfig()
|
12 | 14 | logger = logging.getLogger("snowboy")
|
|
17 | 19 | DETECT_DING = os.path.join(TOP_DIR, "resources/ding.wav")
|
18 | 20 | DETECT_DONG = os.path.join(TOP_DIR, "resources/dong.wav")
|
19 | 21 |
|
| 22 | +ERROR_HANDLER_FUNC = CFUNCTYPE(None, c_char_p, c_int, c_char_p, c_int, c_char_p) |
| 23 | + |
| 24 | +def py_error_handler(filename, line, function, err, fmt): |
| 25 | + pass |
| 26 | + |
| 27 | +c_error_handler = ERROR_HANDLER_FUNC(py_error_handler) |
| 28 | + |
| 29 | +@contextmanager |
| 30 | +def no_alsa_error(): |
| 31 | + asound = cdll.LoadLibrary('libasound.so') |
| 32 | + asound.snd_lib_error_set_handler(c_error_handler) |
| 33 | + yield |
| 34 | + asound.snd_lib_error_set_handler(None) |
20 | 35 |
|
21 | 36 | class RingBuffer(object):
|
22 | 37 | """Ring buffer to hold audio from PortAudio"""
|
@@ -44,7 +59,8 @@ def play_audio_file(fname=DETECT_DING):
|
44 | 59 | """
|
45 | 60 | ding_wav = wave.open(fname, 'rb')
|
46 | 61 | ding_data = ding_wav.readframes(ding_wav.getnframes())
|
47 |
| - audio = pyaudio.PyAudio() |
| 62 | + with no_alsa_error(): |
| 63 | + audio = pyaudio.PyAudio() |
48 | 64 | stream_out = audio.open(
|
49 | 65 | format=audio.get_format_from_width(ding_wav.getsampwidth()),
|
50 | 66 | channels=ding_wav.getnchannels(),
|
@@ -141,7 +157,8 @@ def audio_callback(in_data, frame_count, time_info, status):
|
141 | 157 | play_data = chr(0) * len(in_data)
|
142 | 158 | return play_data, pyaudio.paContinue
|
143 | 159 |
|
144 |
| - self.audio = pyaudio.PyAudio() |
| 160 | + with no_alsa_error(): |
| 161 | + self.audio = pyaudio.PyAudio() |
145 | 162 | self.stream_in = self.audio.open(
|
146 | 163 | input=True, output=False,
|
147 | 164 | format=self.audio.get_format_from_width(
|
|
0 commit comments