ยปCore Development>Code coverage>Lib/audiodev.py

Python code coverage for Lib/audiodev.py

#countcontent
11"""Classes for manipulating audio devices (currently only for Sun and SGI)"""
21from warnings import warnpy3k
31warnpy3k("the audiodev module has been removed in Python 3.0", stacklevel=2)
41del warnpy3k
5n/a
61__all__ = ["error","AudioDev"]
7n/a
82class error(Exception):
91 pass
10n/a
112class Play_Audio_sgi:
12n/a # Private instance variables
13n/a## if 0: access frameratelist, nchannelslist, sampwidthlist, oldparams, \
14n/a## params, config, inited_outrate, inited_width, \
15n/a## inited_nchannels, port, converter, classinited: private
16n/a
171 classinited = 0
181 frameratelist = nchannelslist = sampwidthlist = None
19n/a
201 def initclass(self):
210 import AL
22n/a self.frameratelist = [
230 (48000, AL.RATE_48000),
240 (44100, AL.RATE_44100),
250 (32000, AL.RATE_32000),
260 (22050, AL.RATE_22050),
270 (16000, AL.RATE_16000),
280 (11025, AL.RATE_11025),
290 ( 8000, AL.RATE_8000),
30n/a ]
31n/a self.nchannelslist = [
320 (1, AL.MONO),
330 (2, AL.STEREO),
340 (4, AL.QUADRO),
35n/a ]
36n/a self.sampwidthlist = [
370 (1, AL.SAMPLE_8),
380 (2, AL.SAMPLE_16),
390 (3, AL.SAMPLE_24),
40n/a ]
410 self.classinited = 1
42n/a
431 def __init__(self):
440 import al, AL
450 if not self.classinited:
460 self.initclass()
470 self.oldparams = []
480 self.params = [AL.OUTPUT_RATE, 0]
490 self.config = al.newconfig()
500 self.inited_outrate = 0
510 self.inited_width = 0
520 self.inited_nchannels = 0
530 self.converter = None
540 self.port = None
550 return
56n/a
571 def __del__(self):
580 if self.port:
590 self.stop()
600 if self.oldparams:
610 import al, AL
620 al.setparams(AL.DEFAULT_DEVICE, self.oldparams)
630 self.oldparams = []
64n/a
651 def wait(self):
660 if not self.port:
670 return
680 import time
690 while self.port.getfilled() > 0:
700 time.sleep(0.1)
710 self.stop()
72n/a
731 def stop(self):
740 if self.port:
750 self.port.closeport()
760 self.port = None
770 if self.oldparams:
780 import al, AL
790 al.setparams(AL.DEFAULT_DEVICE, self.oldparams)
800 self.oldparams = []
81n/a
821 def setoutrate(self, rate):
830 for (raw, cooked) in self.frameratelist:
840 if rate == raw:
850 self.params[1] = cooked
860 self.inited_outrate = 1
870 break
88n/a else:
890 raise error, 'bad output rate'
90n/a
911 def setsampwidth(self, width):
920 for (raw, cooked) in self.sampwidthlist:
930 if width == raw:
940 self.config.setwidth(cooked)
950 self.inited_width = 1
960 break
97n/a else:
980 if width == 0:
990 import AL
1000 self.inited_width = 0
1010 self.config.setwidth(AL.SAMPLE_16)
1020 self.converter = self.ulaw2lin
103n/a else:
1040 raise error, 'bad sample width'
105n/a
1061 def setnchannels(self, nchannels):
1070 for (raw, cooked) in self.nchannelslist:
1080 if nchannels == raw:
1090 self.config.setchannels(cooked)
1100 self.inited_nchannels = 1
1110 break
112n/a else:
1130 raise error, 'bad # of channels'
114n/a
1151 def writeframes(self, data):
1160 if not (self.inited_outrate and self.inited_nchannels):
1170 raise error, 'params not specified'
1180 if not self.port:
1190 import al, AL
1200 self.port = al.openport('Python', 'w', self.config)
1210 self.oldparams = self.params[:]
1220 al.getparams(AL.DEFAULT_DEVICE, self.oldparams)
1230 al.setparams(AL.DEFAULT_DEVICE, self.params)
1240 if self.converter:
1250 data = self.converter(data)
1260 self.port.writesamps(data)
127n/a
1281 def getfilled(self):
1290 if self.port:
1300 return self.port.getfilled()
131n/a else:
1320 return 0
133n/a
1341 def getfillable(self):
1350 if self.port:
1360 return self.port.getfillable()
137n/a else:
1380 return self.config.getqueuesize()
139n/a
140n/a # private methods
141n/a## if 0: access *: private
142n/a
1431 def ulaw2lin(self, data):
1440 import audioop
1450 return audioop.ulaw2lin(data, 2)
146n/a
1472class Play_Audio_sun:
148n/a## if 0: access outrate, sampwidth, nchannels, inited_outrate, inited_width, \
149n/a## inited_nchannels, converter: private
150n/a
1511 def __init__(self):
1520 self.outrate = 0
1530 self.sampwidth = 0
1540 self.nchannels = 0
1550 self.inited_outrate = 0
1560 self.inited_width = 0
1570 self.inited_nchannels = 0
1580 self.converter = None
1590 self.port = None
1600 return
161n/a
1621 def __del__(self):
1630 self.stop()
164n/a
1651 def setoutrate(self, rate):
1660 self.outrate = rate
1670 self.inited_outrate = 1
168n/a
1691 def setsampwidth(self, width):
1700 self.sampwidth = width
1710 self.inited_width = 1
172n/a
1731 def setnchannels(self, nchannels):
1740 self.nchannels = nchannels
1750 self.inited_nchannels = 1
176n/a
1771 def writeframes(self, data):
1780 if not (self.inited_outrate and self.inited_width and self.inited_nchannels):
1790 raise error, 'params not specified'
1800 if not self.port:
1810 import sunaudiodev, SUNAUDIODEV
1820 self.port = sunaudiodev.open('w')
1830 info = self.port.getinfo()
1840 info.o_sample_rate = self.outrate
1850 info.o_channels = self.nchannels
1860 if self.sampwidth == 0:
1870 info.o_precision = 8
1880 self.o_encoding = SUNAUDIODEV.ENCODING_ULAW
189n/a # XXX Hack, hack -- leave defaults
190n/a else:
1910 info.o_precision = 8 * self.sampwidth
1920 info.o_encoding = SUNAUDIODEV.ENCODING_LINEAR
1930 self.port.setinfo(info)
1940 if self.converter:
1950 data = self.converter(data)
1960 self.port.write(data)
197n/a
1981 def wait(self):
1990 if not self.port:
2000 return
2010 self.port.drain()
2020 self.stop()
203n/a
2041 def stop(self):
2050 if self.port:
2060 self.port.flush()
2070 self.port.close()
2080 self.port = None
209n/a
2101 def getfilled(self):
2110 if self.port:
2120 return self.port.obufcount()
213n/a else:
2140 return 0
215n/a
216n/a## # Nobody remembers what this method does, and it's broken. :-(
217n/a## def getfillable(self):
218n/a## return BUFFERSIZE - self.getfilled()
219n/a
2201def AudioDev():
221n/a # Dynamically try to import and use a platform specific module.
2220 try:
2230 import al
2240 except ImportError:
2250 try:
2260 import sunaudiodev
2270 return Play_Audio_sun()
2280 except ImportError:
2290 try:
2300 import Audio_mac
2310 except ImportError:
2320 raise error, 'no audio device'
233n/a else:
2340 return Audio_mac.Play_Audio_mac()
235n/a else:
2360 return Play_Audio_sgi()
237n/a
2381def test(fn = None):
2390 import sys
2400 if sys.argv[1:]:
2410 fn = sys.argv[1]
242n/a else:
2430 fn = 'f:just samples:just.aif'
2440 import aifc
2450 af = aifc.open(fn, 'r')
2460 print fn, af.getparams()
2470 p = AudioDev()
2480 p.setoutrate(af.getframerate())
2490 p.setsampwidth(af.getsampwidth())
2500 p.setnchannels(af.getnchannels())
2510 BUFSIZ = af.getframerate()/af.getsampwidth()/af.getnchannels()
2520 while 1:
2530 data = af.readframes(BUFSIZ)
2540 if not data: break
2550 print len(data)
2560 p.writeframes(data)
2570 p.wait()
258n/a
2591if __name__ == '__main__':
2600 test()