14acc25bd392216c4f867a10ca8081e7c8a739676Guido van Rossum"""Classes for manipulating audio devices (currently only for Sun and SGI)""" 2e5d2cbaeaf58c643674a2869294d90314132273cBrett Cannonfrom warnings import warnpy3k 3e5d2cbaeaf58c643674a2869294d90314132273cBrett Cannonwarnpy3k("the audiodev module has been removed in Python 3.0", stacklevel=2) 4e5d2cbaeaf58c643674a2869294d90314132273cBrett Cannondel warnpy3k 54acc25bd392216c4f867a10ca8081e7c8a739676Guido van Rossum 6e99d5ea25ba994491c773d9b5872332334ccd1c5Skip Montanaro__all__ = ["error","AudioDev"] 7e99d5ea25ba994491c773d9b5872332334ccd1c5Skip Montanaro 8227b1204681a8bd7077bf1f8e9098b7e2e9f4c13Fred Drakeclass error(Exception): 9146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters pass 10aa14837bd00c28997dbde4014f8c994b9482def1Sjoerd Mullender 11aa14837bd00c28997dbde4014f8c994b9482def1Sjoerd Mullenderclass Play_Audio_sgi: 12146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters # Private instance variables 13146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters## if 0: access frameratelist, nchannelslist, sampwidthlist, oldparams, \ 14146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters## params, config, inited_outrate, inited_width, \ 15146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters## inited_nchannels, port, converter, classinited: private 16146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters 17146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters classinited = 0 18146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters frameratelist = nchannelslist = sampwidthlist = None 19146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters 20146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters def initclass(self): 21146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters import AL 22146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.frameratelist = [ 23146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters (48000, AL.RATE_48000), 24146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters (44100, AL.RATE_44100), 25146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters (32000, AL.RATE_32000), 26146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters (22050, AL.RATE_22050), 27146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters (16000, AL.RATE_16000), 28146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters (11025, AL.RATE_11025), 29146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters ( 8000, AL.RATE_8000), 30146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters ] 31146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.nchannelslist = [ 32146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters (1, AL.MONO), 33146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters (2, AL.STEREO), 34146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters (4, AL.QUADRO), 35146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters ] 36146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.sampwidthlist = [ 37146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters (1, AL.SAMPLE_8), 38146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters (2, AL.SAMPLE_16), 39146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters (3, AL.SAMPLE_24), 40146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters ] 41146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.classinited = 1 42146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters 43146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters def __init__(self): 44146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters import al, AL 45146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters if not self.classinited: 46146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.initclass() 47146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.oldparams = [] 48146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.params = [AL.OUTPUT_RATE, 0] 49146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.config = al.newconfig() 50146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.inited_outrate = 0 51146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.inited_width = 0 52146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.inited_nchannels = 0 53146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.converter = None 54146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.port = None 55146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters return 56146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters 57146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters def __del__(self): 58146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters if self.port: 59146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.stop() 60146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters if self.oldparams: 61146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters import al, AL 62146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters al.setparams(AL.DEFAULT_DEVICE, self.oldparams) 63146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.oldparams = [] 64146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters 65146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters def wait(self): 66146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters if not self.port: 67146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters return 68146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters import time 69146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters while self.port.getfilled() > 0: 70146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters time.sleep(0.1) 71146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.stop() 72146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters 73146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters def stop(self): 74146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters if self.port: 75146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.port.closeport() 76146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.port = None 77146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters if self.oldparams: 78146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters import al, AL 79146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters al.setparams(AL.DEFAULT_DEVICE, self.oldparams) 80146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.oldparams = [] 81146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters 82146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters def setoutrate(self, rate): 83146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters for (raw, cooked) in self.frameratelist: 84146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters if rate == raw: 85146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.params[1] = cooked 86146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.inited_outrate = 1 87146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters break 88146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters else: 89146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters raise error, 'bad output rate' 90146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters 91146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters def setsampwidth(self, width): 92146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters for (raw, cooked) in self.sampwidthlist: 93146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters if width == raw: 94146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.config.setwidth(cooked) 95146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.inited_width = 1 96146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters break 97146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters else: 98146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters if width == 0: 99146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters import AL 100146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.inited_width = 0 101146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.config.setwidth(AL.SAMPLE_16) 102146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.converter = self.ulaw2lin 103146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters else: 104146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters raise error, 'bad sample width' 105146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters 106146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters def setnchannels(self, nchannels): 107146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters for (raw, cooked) in self.nchannelslist: 108146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters if nchannels == raw: 109146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.config.setchannels(cooked) 110146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.inited_nchannels = 1 111146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters break 112146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters else: 113146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters raise error, 'bad # of channels' 114146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters 115146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters def writeframes(self, data): 116146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters if not (self.inited_outrate and self.inited_nchannels): 117146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters raise error, 'params not specified' 118146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters if not self.port: 119146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters import al, AL 120146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.port = al.openport('Python', 'w', self.config) 121146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.oldparams = self.params[:] 122146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters al.getparams(AL.DEFAULT_DEVICE, self.oldparams) 123146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters al.setparams(AL.DEFAULT_DEVICE, self.params) 124146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters if self.converter: 125146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters data = self.converter(data) 126146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.port.writesamps(data) 127146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters 128146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters def getfilled(self): 129146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters if self.port: 130146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters return self.port.getfilled() 131146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters else: 132146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters return 0 133146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters 134146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters def getfillable(self): 135146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters if self.port: 136146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters return self.port.getfillable() 137146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters else: 138146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters return self.config.getqueuesize() 139146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters 140146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters # private methods 141146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters## if 0: access *: private 142146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters 143146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters def ulaw2lin(self, data): 144146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters import audioop 145146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters return audioop.ulaw2lin(data, 2) 146aa14837bd00c28997dbde4014f8c994b9482def1Sjoerd Mullender 147aa14837bd00c28997dbde4014f8c994b9482def1Sjoerd Mullenderclass Play_Audio_sun: 148146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters## if 0: access outrate, sampwidth, nchannels, inited_outrate, inited_width, \ 149146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters## inited_nchannels, converter: private 150146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters 151146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters def __init__(self): 152146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.outrate = 0 153146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.sampwidth = 0 154146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.nchannels = 0 155146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.inited_outrate = 0 156146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.inited_width = 0 157146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.inited_nchannels = 0 158146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.converter = None 159146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.port = None 160146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters return 161146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters 162146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters def __del__(self): 163146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.stop() 164146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters 165146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters def setoutrate(self, rate): 166146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.outrate = rate 167146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.inited_outrate = 1 168146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters 169146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters def setsampwidth(self, width): 170146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.sampwidth = width 171146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.inited_width = 1 172146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters 173146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters def setnchannels(self, nchannels): 174146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.nchannels = nchannels 175146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.inited_nchannels = 1 176146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters 177146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters def writeframes(self, data): 178146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters if not (self.inited_outrate and self.inited_width and self.inited_nchannels): 179146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters raise error, 'params not specified' 180146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters if not self.port: 181146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters import sunaudiodev, SUNAUDIODEV 182146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.port = sunaudiodev.open('w') 183146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters info = self.port.getinfo() 184146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters info.o_sample_rate = self.outrate 185146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters info.o_channels = self.nchannels 186146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters if self.sampwidth == 0: 187146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters info.o_precision = 8 188146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.o_encoding = SUNAUDIODEV.ENCODING_ULAW 189146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters # XXX Hack, hack -- leave defaults 190146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters else: 191146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters info.o_precision = 8 * self.sampwidth 192146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters info.o_encoding = SUNAUDIODEV.ENCODING_LINEAR 193146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.port.setinfo(info) 194146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters if self.converter: 195146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters data = self.converter(data) 196146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.port.write(data) 197146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters 198146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters def wait(self): 199146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters if not self.port: 200146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters return 201146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.port.drain() 202146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.stop() 203146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters 204146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters def stop(self): 205146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters if self.port: 206146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.port.flush() 207146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.port.close() 208146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters self.port = None 209146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters 210146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters def getfilled(self): 211146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters if self.port: 212146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters return self.port.obufcount() 213146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters else: 214146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters return 0 215146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters 2168710681400acac735ad7bdb980a075ec0591aa7cGuido van Rossum## # Nobody remembers what this method does, and it's broken. :-( 2178710681400acac735ad7bdb980a075ec0591aa7cGuido van Rossum## def getfillable(self): 2188710681400acac735ad7bdb980a075ec0591aa7cGuido van Rossum## return BUFFERSIZE - self.getfilled() 219aa14837bd00c28997dbde4014f8c994b9482def1Sjoerd Mullender 220aa14837bd00c28997dbde4014f8c994b9482def1Sjoerd Mullenderdef AudioDev(): 221146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters # Dynamically try to import and use a platform specific module. 222146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters try: 223146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters import al 224146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters except ImportError: 225146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters try: 226146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters import sunaudiodev 227146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters return Play_Audio_sun() 228146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters except ImportError: 229146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters try: 230146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters import Audio_mac 231146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters except ImportError: 232146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters raise error, 'no audio device' 233146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters else: 234146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters return Audio_mac.Play_Audio_mac() 235146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters else: 236146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters return Play_Audio_sgi() 237e174c1500f9a9560a7c162eb3b15517c51c1582aGuido van Rossum 23827eb14d89479ff23b7f66b274e46993e386e7aa7Guido van Rossumdef test(fn = None): 239146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters import sys 240146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters if sys.argv[1:]: 241146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters fn = sys.argv[1] 242146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters else: 243146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters fn = 'f:just samples:just.aif' 244146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters import aifc 245146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters af = aifc.open(fn, 'r') 246146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters print fn, af.getparams() 247146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters p = AudioDev() 248146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters p.setoutrate(af.getframerate()) 249146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters p.setsampwidth(af.getsampwidth()) 250146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters p.setnchannels(af.getnchannels()) 251146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters BUFSIZ = af.getframerate()/af.getsampwidth()/af.getnchannels() 252146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters while 1: 253146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters data = af.readframes(BUFSIZ) 254146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters if not data: break 255146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters print len(data) 256146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters p.writeframes(data) 257146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters p.wait() 258e174c1500f9a9560a7c162eb3b15517c51c1582aGuido van Rossum 259e174c1500f9a9560a7c162eb3b15517c51c1582aGuido van Rossumif __name__ == '__main__': 260146965abf2378cdb248cead43a613fb81aa7d1a4Tim Peters test() 261