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