Try to reduce runaway memory usaqe
[scannr.git] / scannr.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import logging
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s\t%(levelname)s\t%(message)s')
 
import snd
import time
from datetime import date
import threading
from pydispatch import dispatcher
import wave
import serial
#python -m serial.tools.miniterm -p COM20 -e -b 115200 --cr
 
filename = "demo.wav"
MIN_LENGTH = 90000
 
def worker(filename):
    """thread worker function
    http://www.doughellmann.com/PyMOTW/threading/
    https://github.com/uskr/pynma
ffmpeg -i 2012-09-29-1348911268.34-demo.wav -ar 8000 -ab 4.75k test.3gp
http://stackoverflow.com/questions/2559746/getting-error-while-converting-wav-to-amr-using-ffmpeg
"""
    print 'Worker for '+filename
    ser.write("GLG\r")   
    line = ser.readline()   # read a '\n' terminated line
    print line
    return
 
def filenameMaker():
    global filename
    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()
    print str(len(data))
    if len(data) > MIN_LENGTH:
        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 "+str(len(data))+" frames written to "+path)
 
dispatcher.connect( filenameMaker, signal='SND_STARTED', sender=dispatcher.Any )
dispatcher.connect( worker, signal='FILE_CREATED', sender=dispatcher.Any )
 
ser = serial.Serial('COM20', 112500, timeout=1) 
 
print "Scannr started..."
while True:
    print "ready to record"
    record_to_async_file()
ser.close()