mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			94 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
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()
 |