diff options
Diffstat (limited to 'Demo/sgi/video/syncaudio.py')
-rwxr-xr-x | Demo/sgi/video/syncaudio.py | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/Demo/sgi/video/syncaudio.py b/Demo/sgi/video/syncaudio.py new file mode 100755 index 0000000..742a433 --- /dev/null +++ b/Demo/sgi/video/syncaudio.py @@ -0,0 +1,94 @@ +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() |