annotate Mac/Lib/Audio_mac.py @ 4566:6403c94de50d legacy-trunk

Added safeguard against failure in __del__.
author Guido van Rossum <guido@python.org>
date Wed, 27 Nov 1996 19:39:58 +0000
parents a7c2737687c2
children d087cd060bad
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2267
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 QSIZE = 100000
3453
a7c2737687c2 Added option to set queue size
Jack Jansen <jack.jansen@cwi.nl>
parents: 3312
diff changeset
2 error='Audio_mac.error'
2267
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
3
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 class Play_Audio_mac:
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
5
3453
a7c2737687c2 Added option to set queue size
Jack Jansen <jack.jansen@cwi.nl>
parents: 3312
diff changeset
6 def __init__(self, qsize=QSIZE):
2267
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 self._chan = None
3453
a7c2737687c2 Added option to set queue size
Jack Jansen <jack.jansen@cwi.nl>
parents: 3312
diff changeset
8 self._qsize = qsize
2267
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 self._outrate = 22254
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 self._sampwidth = 1
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 self._nchannels = 1
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 self._gc = []
3312
c0664be7f662 - Fixed bug in getfillable()
Jack Jansen <jack.jansen@cwi.nl>
parents: 3304
diff changeset
13 self._usercallback = None
2267
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
14
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 def __del__(self):
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 self.stop()
3312
c0664be7f662 - Fixed bug in getfillable()
Jack Jansen <jack.jansen@cwi.nl>
parents: 3304
diff changeset
17 self._usercallback = None
2267
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
18
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 def wait(self):
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 import time
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 while self.getfilled():
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 time.sleep(0.1)
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 self._chan = None
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 self._gc = []
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
25
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 def stop(self, quietNow = 1):
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 ##chan = self._chan
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 self._chan = None
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
29 ##chan.SndDisposeChannel(1)
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 self._gc = []
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
31
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 def setoutrate(self, outrate):
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 self._outrate = outrate
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
34
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 def setsampwidth(self, sampwidth):
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 self._sampwidth = sampwidth
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
37
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 def setnchannels(self, nchannels):
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 self._nchannels = nchannels
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
40
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 def writeframes(self, data):
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 import time
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 from Sound import *
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 import struct
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 if not self._chan:
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 import Snd
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 self._chan = Snd.SndNewChannel(5, 0, self._callback)
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 nframes = len(data) / self._nchannels / self._sampwidth
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 if len(data) != nframes * self._nchannels * self._sampwidth:
3453
a7c2737687c2 Added option to set queue size
Jack Jansen <jack.jansen@cwi.nl>
parents: 3312
diff changeset
50 raise error, 'data is not a whole number of frames'
2267
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 while self._gc and \
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 self.getfilled() + nframes > \
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 self._qsize / self._nchannels / self._sampwidth:
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 time.sleep(0.1)
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 if self._sampwidth == 1:
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 import audioop
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 data = audioop.add(data, '\x80'*len(data), 1)
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 h1 = struct.pack('llhhllbbl',
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 id(data)+12,
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 self._nchannels,
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 self._outrate, 0,
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 0,
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
63 0,
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 extSH,
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 60,
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 nframes)
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 h2 = 22*'\0'
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 h3 = struct.pack('hhlll',
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 self._sampwidth*8,
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 0,
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 0,
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 0,
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 0)
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 header = h1+h2+h3
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 self._gc.append((header, data))
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 self._chan.SndDoCommand((bufferCmd, 0, header), 0)
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 self._chan.SndDoCommand((callBackCmd, 0, 0), 0)
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
78
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 def _callback(self, *args):
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 del self._gc[0]
3312
c0664be7f662 - Fixed bug in getfillable()
Jack Jansen <jack.jansen@cwi.nl>
parents: 3304
diff changeset
81 if self._usercallback:
c0664be7f662 - Fixed bug in getfillable()
Jack Jansen <jack.jansen@cwi.nl>
parents: 3304
diff changeset
82 self._usercallback()
c0664be7f662 - Fixed bug in getfillable()
Jack Jansen <jack.jansen@cwi.nl>
parents: 3304
diff changeset
83
c0664be7f662 - Fixed bug in getfillable()
Jack Jansen <jack.jansen@cwi.nl>
parents: 3304
diff changeset
84 def setcallback(self, callback):
c0664be7f662 - Fixed bug in getfillable()
Jack Jansen <jack.jansen@cwi.nl>
parents: 3304
diff changeset
85 self._usercallback = callback
2267
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
86
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
87 def getfilled(self):
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 filled = 0
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
89 for header, data in self._gc:
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
90 filled = filled + len(data)
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 return filled / self._nchannels / self._sampwidth
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
92
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 def getfillable(self):
3312
c0664be7f662 - Fixed bug in getfillable()
Jack Jansen <jack.jansen@cwi.nl>
parents: 3304
diff changeset
94 return (self._qsize / self._nchannels / self._sampwidth) - self.getfilled()
2267
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
95
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 def ulaw2lin(self, data):
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
97 import audioop
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 return audioop.ulaw2lin(data, 2)
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
99
3304
8a5097e9d7ee Fixed example
Jack Jansen <jack.jansen@cwi.nl>
parents: 2267
diff changeset
100 def test():
2267
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 import aifc
3304
8a5097e9d7ee Fixed example
Jack Jansen <jack.jansen@cwi.nl>
parents: 2267
diff changeset
102 import macfs
8a5097e9d7ee Fixed example
Jack Jansen <jack.jansen@cwi.nl>
parents: 2267
diff changeset
103 fss, ok = macfs.PromptGetFile("Select an AIFF soundfile", "AIFF")
8a5097e9d7ee Fixed example
Jack Jansen <jack.jansen@cwi.nl>
parents: 2267
diff changeset
104 if not ok: return
8a5097e9d7ee Fixed example
Jack Jansen <jack.jansen@cwi.nl>
parents: 2267
diff changeset
105 fn = fss.as_pathname()
2267
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
106 af = aifc.open(fn, 'r')
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 print af.getparams()
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 p = Play_Audio_mac()
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 p.setoutrate(af.getframerate())
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
110 p.setsampwidth(af.getsampwidth())
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
111 p.setnchannels(af.getnchannels())
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 BUFSIZ = 10000
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 while 1:
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 data = af.readframes(BUFSIZ)
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 if not data: break
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
116 p.writeframes(data)
3304
8a5097e9d7ee Fixed example
Jack Jansen <jack.jansen@cwi.nl>
parents: 2267
diff changeset
117 print 'wrote', len(data), 'space', p.getfillable()
2267
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
118 p.wait()
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
119
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 if __name__ == '__main__':
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 test()