ยปCore Development>Code coverage>Lib/plat-mac/Audio_mac.py

Python code coverage for Lib/plat-mac/Audio_mac.py

#countcontent
1n/aQSIZE = 100000
2n/aerror='Audio_mac.error'
3n/a
4n/afrom warnings import warnpy3k
5n/awarnpy3k("In 3.x, the Play_Audio_mac module is removed.", stacklevel=2)
6n/a
7n/aclass Play_Audio_mac:
8n/a
9n/a def __init__(self, qsize=QSIZE):
10n/a self._chan = None
11n/a self._qsize = qsize
12n/a self._outrate = 22254
13n/a self._sampwidth = 1
14n/a self._nchannels = 1
15n/a self._gc = []
16n/a self._usercallback = None
17n/a
18n/a def __del__(self):
19n/a self.stop()
20n/a self._usercallback = None
21n/a
22n/a def wait(self):
23n/a import time
24n/a while self.getfilled():
25n/a time.sleep(0.1)
26n/a self._chan = None
27n/a self._gc = []
28n/a
29n/a def stop(self, quietNow = 1):
30n/a ##chan = self._chan
31n/a self._chan = None
32n/a ##chan.SndDisposeChannel(1)
33n/a self._gc = []
34n/a
35n/a def setoutrate(self, outrate):
36n/a self._outrate = outrate
37n/a
38n/a def setsampwidth(self, sampwidth):
39n/a self._sampwidth = sampwidth
40n/a
41n/a def setnchannels(self, nchannels):
42n/a self._nchannels = nchannels
43n/a
44n/a def writeframes(self, data):
45n/a import time
46n/a from Carbon.Sound import bufferCmd, callBackCmd, extSH
47n/a import struct
48n/a import MacOS
49n/a if not self._chan:
50n/a from Carbon import Snd
51n/a self._chan = Snd.SndNewChannel(5, 0, self._callback)
52n/a nframes = len(data) / self._nchannels / self._sampwidth
53n/a if len(data) != nframes * self._nchannels * self._sampwidth:
54n/a raise error, 'data is not a whole number of frames'
55n/a while self._gc and \
56n/a self.getfilled() + nframes > \
57n/a self._qsize / self._nchannels / self._sampwidth:
58n/a time.sleep(0.1)
59n/a if self._sampwidth == 1:
60n/a import audioop
61n/a data = audioop.add(data, '\x80'*len(data), 1)
62n/a h1 = struct.pack('llHhllbbl',
63n/a id(data)+MacOS.string_id_to_buffer,
64n/a self._nchannels,
65n/a self._outrate, 0,
66n/a 0,
67n/a 0,
68n/a extSH,
69n/a 60,
70n/a nframes)
71n/a h2 = 22*'\0'
72n/a h3 = struct.pack('hhlll',
73n/a self._sampwidth*8,
74n/a 0,
75n/a 0,
76n/a 0,
77n/a 0)
78n/a header = h1+h2+h3
79n/a self._gc.append((header, data))
80n/a self._chan.SndDoCommand((bufferCmd, 0, header), 0)
81n/a self._chan.SndDoCommand((callBackCmd, 0, 0), 0)
82n/a
83n/a def _callback(self, *args):
84n/a del self._gc[0]
85n/a if self._usercallback:
86n/a self._usercallback()
87n/a
88n/a def setcallback(self, callback):
89n/a self._usercallback = callback
90n/a
91n/a def getfilled(self):
92n/a filled = 0
93n/a for header, data in self._gc:
94n/a filled = filled + len(data)
95n/a return filled / self._nchannels / self._sampwidth
96n/a
97n/a def getfillable(self):
98n/a return (self._qsize / self._nchannels / self._sampwidth) - self.getfilled()
99n/a
100n/a def ulaw2lin(self, data):
101n/a import audioop
102n/a return audioop.ulaw2lin(data, 2)
103n/a
104n/adef test():
105n/a import aifc
106n/a import EasyDialogs
107n/a fn = EasyDialogs.AskFileForOpen(message="Select an AIFF soundfile", typeList=("AIFF",))
108n/a if not fn: return
109n/a af = aifc.open(fn, 'r')
110n/a print af.getparams()
111n/a p = Play_Audio_mac()
112n/a p.setoutrate(af.getframerate())
113n/a p.setsampwidth(af.getsampwidth())
114n/a p.setnchannels(af.getnchannels())
115n/a BUFSIZ = 10000
116n/a while 1:
117n/a data = af.readframes(BUFSIZ)
118n/a if not data: break
119n/a p.writeframes(data)
120n/a print 'wrote', len(data), 'space', p.getfillable()
121n/a p.wait()
122n/a
123n/aif __name__ == '__main__':
124n/a test()