From: Maxious Date: Fri, 28 Sep 2012 09:34:18 +0000 Subject: allocate filename when signal starts X-Git-Url: http://maxious.lambdacomplex.org/git/?p=scannr.git&a=commitdiff&h=b9b409fd0053ba6a7936a7cd7d1a1aa8a342f54c --- allocate filename when signal starts --- --- a/scannr.py +++ b/scannr.py @@ -2,31 +2,43 @@ import time from datetime import date import threading +from pydispatch import dispatcher +import wave -filename = "" +filename = "demo.wav" + def worker(filename): """thread worker function http://www.doughellmann.com/PyMOTW/threading/ - https://github.com/uskr/pynma""" + https://github.com/uskr/pynma + +http://stackoverflow.com/questions/1092531/event-system-in-python """ print 'Worker for '+filename + return def filenameMaker(): global filename - while True: - filename = date.today().isoformat()+'-'+str(time.time())+'-demo.wav' - time.sleep(5) + filename = date.today().isoformat()+'-'+str(time.time())+'-demo.wav' +def record_to_async_file(): + "Records from the microphone and outputs the resulting data to `path`" + sample_width, data = snd.record() + data = snd.pack('<' + ('h'*len(data)), *data) + path = filename + dispatcher.send( signal='FILE_CREATED', sender=filename, filename=filename) + wf = wave.open(path, 'wb') + wf.setnchannels(1) + wf.setsampwidth(sample_width) + wf.setframerate(snd.RATE) + wf.writeframes(data) + wf.close() + print("done - result written to "+path) - -threads = [] -fm = threading.Thread(target=filenameMaker) -fm.daemon = True -fm.start() +dispatcher.connect( filenameMaker, signal='SND_STARTED', sender=dispatcher.Any ) +dispatcher.connect( worker, signal='FILE_CREATED', sender=dispatcher.Any ) print "Scannr started..." while True: print "ready to record" - snd.record_to_file(filename) - t = threading.Thread(target=worker,args=(filename,)) - t.start() + record_to_async_file() --- a/snd.py +++ b/snd.py @@ -10,12 +10,14 @@ from array import array from struct import unpack, pack import threading +from pydispatch import dispatcher CHANNELS = 1 THRESHOLD = 500 CHUNK_SIZE = 1024 FORMAT = pyaudio.paInt16 RATE = 44100 +MAX_SILENT = 30 def is_silent(L): "Returns `True` if below the 'silent' threshold" @@ -97,9 +99,10 @@ num_silent += 1 print num_silent elif not silent and not snd_started: + dispatcher.send( signal='SND_STARTED') snd_started = True print snd_started - if snd_started and num_silent > 30: + if snd_started and num_silent > MAX_SILENT: break sample_width = p.get_sample_size(FORMAT)