--- a/snd.py +++ b/snd.py @@ -12,12 +12,16 @@ import threading from pydispatch import dispatcher -CHANNELS = 1 THRESHOLD = 500 CHUNK_SIZE = 1024 FORMAT = pyaudio.paInt16 RATE = 44100 -MAX_SILENT = 30 +if sys.platform.startswith('darwin'): + CHANNELS = 2 +elif sys.platform.startswith('win32'): + CHANNELS = 1 + +MAX_SILENT = 60 def is_silent(L): "Returns `True` if below the 'silent' threshold" @@ -77,8 +81,8 @@ it without getting chopped off. """ p = pyaudio.PyAudio() - stream = p.open(format=FORMAT, channels=1, rate=RATE, - input=True, output=True, + stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, + input=True, frames_per_buffer=CHUNK_SIZE) num_silent = 0 @@ -87,7 +91,12 @@ LRtn = array('h') while 1: - data = stream.read(CHUNK_SIZE) + try: + data = stream.read(CHUNK_SIZE) + except IOError as ex: + if ex[1] != pyaudio.paInputOverflowed: + raise + data = '\x00' * CHUNK_SIZE L = unpack('<' + ('h'*(len(data)/2)), data) # little endian, signed short L = array('h', L) @@ -96,7 +105,7 @@ if silent and snd_started: num_silent += 1 - print num_silent + #print num_silent elif not silent and not snd_started: dispatcher.send( signal='SND_STARTED') snd_started = True @@ -122,7 +131,7 @@ data = pack('<' + ('h'*len(data)), *data) wf = wave.open(path, 'wb') - wf.setnchannels(1) + wf.setnchannels(CHANNELS) wf.setsampwidth(sample_width) wf.setframerate(RATE) wf.writeframes(data)