annotate Mac/Lib/Audio_mac.py @ 5817:48b94de85bf3 legacy-trunk

Extensive changes by AMK.
author Guido van Rossum <guido@python.org>
date Thu, 17 Jul 1997 16:29:42 +0000
parents d087cd060bad
children 6f869e5d33cc
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
5255
d087cd060bad Use MacOS.string_id_to_buffer for id() to buffer address hack
Jack Jansen <jack.jansen@cwi.nl>
parents: 3453
diff changeset
45 import MacOS
2267
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 if not self._chan:
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 import Snd
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 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
49 nframes = len(data) / self._nchannels / self._sampwidth
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 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
51 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
52 while self._gc and \
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 self.getfilled() + nframes > \
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 self._qsize / self._nchannels / self._sampwidth:
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 time.sleep(0.1)
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 if self._sampwidth == 1:
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 import audioop
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 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
59 h1 = struct.pack('llhhllbbl',
5255
d087cd060bad Use MacOS.string_id_to_buffer for id() to buffer address hack
Jack Jansen <jack.jansen@cwi.nl>
parents: 3453
diff changeset
60 id(data)+MacOS.string_id_to_data,
2267
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 self._nchannels,
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 self._outrate, 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 0,
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 extSH,
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 60,
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 nframes)
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 h2 = 22*'\0'
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 h3 = struct.pack('hhlll',
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 self._sampwidth*8,
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 0)
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 header = h1+h2+h3
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 self._gc.append((header, data))
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 self._chan.SndDoCommand((bufferCmd, 0, header), 0)
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 self._chan.SndDoCommand((callBackCmd, 0, 0), 0)
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
79
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 def _callback(self, *args):
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 del self._gc[0]
3312
c0664be7f662 - Fixed bug in getfillable()
Jack Jansen <jack.jansen@cwi.nl>
parents: 3304
diff changeset
82 if self._usercallback:
c0664be7f662 - Fixed bug in getfillable()
Jack Jansen <jack.jansen@cwi.nl>
parents: 3304
diff changeset
83 self._usercallback()
c0664be7f662 - Fixed bug in getfillable()
Jack Jansen <jack.jansen@cwi.nl>
parents: 3304
diff changeset
84
c0664be7f662 - Fixed bug in getfillable()
Jack Jansen <jack.jansen@cwi.nl>
parents: 3304
diff changeset
85 def setcallback(self, callback):
c0664be7f662 - Fixed bug in getfillable()
Jack Jansen <jack.jansen@cwi.nl>
parents: 3304
diff changeset
86 self._usercallback = callback
2267
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
87
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 def getfilled(self):
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
89 filled = 0
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
90 for header, data in self._gc:
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 filled = filled + len(data)
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 return filled / self._nchannels / self._sampwidth
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
93
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
94 def getfillable(self):
3312
c0664be7f662 - Fixed bug in getfillable()
Jack Jansen <jack.jansen@cwi.nl>
parents: 3304
diff changeset
95 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
96
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
97 def ulaw2lin(self, data):
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 import audioop
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 return audioop.ulaw2lin(data, 2)
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
100
3304
8a5097e9d7ee Fixed example
Jack Jansen <jack.jansen@cwi.nl>
parents: 2267
diff changeset
101 def test():
2267
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 import aifc
3304
8a5097e9d7ee Fixed example
Jack Jansen <jack.jansen@cwi.nl>
parents: 2267
diff changeset
103 import macfs
8a5097e9d7ee Fixed example
Jack Jansen <jack.jansen@cwi.nl>
parents: 2267
diff changeset
104 fss, ok = macfs.PromptGetFile("Select an AIFF soundfile", "AIFF")
8a5097e9d7ee Fixed example
Jack Jansen <jack.jansen@cwi.nl>
parents: 2267
diff changeset
105 if not ok: return
8a5097e9d7ee Fixed example
Jack Jansen <jack.jansen@cwi.nl>
parents: 2267
diff changeset
106 fn = fss.as_pathname()
2267
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 af = aifc.open(fn, 'r')
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 print af.getparams()
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 p = Play_Audio_mac()
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
110 p.setoutrate(af.getframerate())
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
111 p.setsampwidth(af.getsampwidth())
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 p.setnchannels(af.getnchannels())
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 BUFSIZ = 10000
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 while 1:
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 data = af.readframes(BUFSIZ)
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
116 if not data: break
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
117 p.writeframes(data)
3304
8a5097e9d7ee Fixed example
Jack Jansen <jack.jansen@cwi.nl>
parents: 2267
diff changeset
118 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
119 p.wait()
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
120
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 if __name__ == '__main__':
7411b6a06920 Committed a more or less working version.
Guido van Rossum <guido@python.org>
parents:
diff changeset
122 test()