summaryrefslogtreecommitdiffstats
path: root/Demo/sgi/video/syncaudio.py
diff options
context:
space:
mode:
Diffstat (limited to 'Demo/sgi/video/syncaudio.py')
-rwxr-xr-xDemo/sgi/video/syncaudio.py94
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()