95 lines
2.5 KiB
Python
95 lines
2.5 KiB
Python
|
import AL
|
||
|
import al
|
||
|
import sys
|
||
|
import vtime
|
||
|
import socket
|
||
|
import time
|
||
|
|
||
|
|
||
|
SLEEPTIME = 500 # 500 ms sleeps
|
||
|
SAMPLEFREQ = 16000 # 16Khz samples
|
||
|
SAMPLERATE = AL.RATE_16000
|
||
|
NEEDBUFFERED = SAMPLEFREQ # Buffer 1 second of sound
|
||
|
BUFFERSIZE = NEEDBUFFERED*4 # setqueuesize() par for 2 second sound
|
||
|
|
||
|
AVSYNCPORT = 10000 # Port for time syncing
|
||
|
AVCTLPORT = 10001 # Port for record start/stop
|
||
|
|
||
|
def main():
|
||
|
if len(sys.argv) <> 3:
|
||
|
print 'Usage: ', sys.argv[0], 'videohostname soundfile'
|
||
|
sys.exit(1)
|
||
|
#
|
||
|
ofile = open(sys.argv[2], 'w')
|
||
|
#
|
||
|
globaltime = vtime.VTime().init(0,sys.argv[1],AVSYNCPORT)
|
||
|
#
|
||
|
ctl = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
|
||
|
ctl.bind((socket.gethostname(),AVCTLPORT))
|
||
|
#
|
||
|
inp = openmic()
|
||
|
#
|
||
|
out = 0 # Open aiff file
|
||
|
#
|
||
|
while 1:
|
||
|
if mainloop(None, ctl, inp, out, globaltime):
|
||
|
break
|
||
|
if mainloop(ofile, ctl, inp, out, globaltime):
|
||
|
break
|
||
|
pass # Close aiff file
|
||
|
sys.exit(0)
|
||
|
#
|
||
|
def openmic():
|
||
|
conf = al.newconfig()
|
||
|
conf.setqueuesize(BUFFERSIZE)
|
||
|
conf.setwidth(AL.SAMPLE_16)
|
||
|
conf.setchannels(AL.MONO)
|
||
|
return al.openport('micr','r',conf)
|
||
|
#
|
||
|
def mainloop(ofile, ctl, inp, out, globaltime):
|
||
|
#
|
||
|
# Wait for sync packet, keeping 1-2 seconds of sound in the
|
||
|
# buffer
|
||
|
#
|
||
|
totsamps = 0
|
||
|
totbytes = 0
|
||
|
starttime = time.millitimer()
|
||
|
while 1:
|
||
|
time.millisleep(SLEEPTIME)
|
||
|
if ctl.avail():
|
||
|
break
|
||
|
nsamples = inp.getfilled()-NEEDBUFFERED
|
||
|
if nsamples>0:
|
||
|
data = inp.readsamps(nsamples)
|
||
|
totsamps = totsamps + nsamples
|
||
|
totbytes = totbytes + len(data)
|
||
|
if ofile <> None:
|
||
|
ofile.write(data)
|
||
|
#
|
||
|
# Compute his starttime and the timestamp of the first byte in the
|
||
|
# buffer. Discard all buffered data upto his starttime
|
||
|
#
|
||
|
startstop,histime = eval(ctl.recv(100))
|
||
|
if (ofile = None and startstop = 0) or \
|
||
|
(ofile <> None and startstop = 1):
|
||
|
print 'Sync error: saving=',save,' request=',startstop
|
||
|
sys.exit(1)
|
||
|
filllevel = inp.getfilled()
|
||
|
filltime = time.millitimer()
|
||
|
filltime = filltime - filllevel / (SAMPLEFREQ/1000)
|
||
|
starttime = globaltime.his2mine(histime)
|
||
|
nsamples = starttime - filltime
|
||
|
if nsamples < 0:
|
||
|
print 'Start/stop signal came too late'
|
||
|
sys.exit(1)
|
||
|
nsamples = nsamples * (SAMPLEFREQ / 1000)
|
||
|
data = inp.readsamps(nsamples)
|
||
|
totsamps = totsamps + nsamples
|
||
|
totbytes = totbytes + len(data)
|
||
|
print 'Time: ', time.millitimer()-starttime, ', Bytes: ', totbytes, ', Samples: ', totsamps
|
||
|
if ofile <> None:
|
||
|
ofile.write(data)
|
||
|
return (startstop = 2)
|
||
|
|
||
|
main()
|