blob: d0dcfed22ef270a48eccf40fc27256aec0a8da55 [file] [log] [blame]
Sjoerd Mullenderaa148371993-12-17 15:18:37 +00001import AL, SUNAUDIODEV
2
3error = 'audiodev.error'
4
5class Play_Audio_sgi:
6 # Private instance variables
7 access frameratelist, nchannelslist, sampwidthlist, oldparams, \
8 params, config, inited_outrate, inited_width, \
9 inited_nchannels, port, converter: private
10
11 frameratelist = [(48000, AL.RATE_48000),
12 (44100, AL.RATE_44100),
13 (32000, AL.RATE_32000),
14 (22050, AL.RATE_22050),
15 (16000, AL.RATE_16000),
16 (11025, AL.RATE_11025),
17 ( 8000, AL.RATE_8000)]
18 nchannelslist = [(1, AL.MONO),
19 (2, AL.STEREO)]
20 sampwidthlist = [(1, AL.SAMPLE_8),
21 (2, AL.SAMPLE_16),
22 (3, AL.SAMPLE_24)]
23
24 def __init__(self):
25 import al
26 self.oldparams = []
27 self.params = [AL.OUTPUT_RATE, 0]
28 self.config = al.newconfig()
29 self.inited_outrate = 0
30 self.inited_width = 0
31 self.inited_nchannels = 0
32 self.converter = None
33 self.port = None
34 return
35
36 def __del__(self):
37 if self.port:
38 self.stop()
39 if self.oldparams:
40 import al
41 al.setparams(AL.DEFAULT_DEVICE, self.oldparams)
42 self.oldparams = []
43
44 def wait(self):
45 if not self.port:
46 return
47 import time
48 while self.port.getfilled() > 0:
49 time.sleep(0.1)
50 self.stop()
51
52 def stop(self):
53 if self.port:
54 self.port.closeport()
55 self.port = None
56 if self.oldparams:
57 import al
58 al.setparams(AL.DEFAULT_DEVICE, self.oldparams)
59 self.oldparams = []
60
61 def setoutrate(self, rate):
62 for (raw, cooked) in self.frameratelist:
63 if rate == raw:
64 self.params[1] = cooked
65 self.inited_outrate = 1
66 break
67 else:
68 raise error, 'bad output rate'
69
70 def setsampwidth(self, width):
71 for (raw, cooked) in self.sampwidthlist:
72 if width == raw:
73 self.config.setwidth(cooked)
74 self.inited_width = 1
75 break
76 else:
77 if width == 0:
78 self.inited_width = 0
79 self.config.setwidth(AL.SAMPLE_16)
80 self.converter = self.ulaw2lin
81 else:
82 raise error, 'bad sample width'
83
84 def setnchannels(self, nchannels):
85 for (raw, cooked) in self.nchannelslist:
86 if nchannels == raw:
87 self.config.setchannels(cooked)
88 self.inited_nchannels = 1
89 break
90 else:
91 raise error, 'bad # of channels'
92
93 def writeframes(self, data):
94 if not (self.inited_outrate and self.inited_nchannels):
95 raise error, 'params not specified'
96 if not self.port:
97 import al
98 self.port = al.openport('Python', 'w', self.config)
99 self.oldparams = self.params[:]
100 al.getparams(AL.DEFAULT_DEVICE, self.oldparams)
101 al.setparams(AL.DEFAULT_DEVICE, self.params)
102 if self.converter:
103 data = self.converter(data)
104 self.port.writesamps(data)
105
106 def getfilled(self):
107 if self.port:
108 return self.port.getfilled()
109 else:
110 return 0
111
112 def getfillable(self):
113 if self.port:
114 return self.port.getfillable()
115 else:
116 return self.config.getqueuesize()
117
118 # private methods
119 access *: private
120
121 def ulaw2lin(self, data):
122 import audioop
123 return audioop.ulaw2lin(data, 2)
124
125class Play_Audio_sun:
126 access outrate, sampwidth, nchannels, inited_outrate, inited_width, \
127 inited_nchannels, converter: private
128
129 def __init__(self):
130 self.outrate = 0
131 self.sampwidth = 0
132 self.nchannels = 0
133 self.inited_outrate = 0
134 self.inited_width = 0
135 self.inited_nchannels = 0
136 self.converter = None
137 self.port = None
138 return
139
140 def __del__(self):
141 self.stop()
142
143 def setoutrate(self, rate):
144 self.outrate = rate
145 self.inited_outrate = 1
146
147 def setsampwidth(self, width):
148 self.sampwidth = width
149 self.inited_width = 1
150
151 def setnchannels(self, nchannels):
152 self.nchannels = nchannels
153 self.inited_nchannels = 1
154
155 def writeframes(self, data):
156 if not (self.inited_outrate and self.inited_width and self.inited_nchannels):
157 raise error, 'params not specified'
158 if not self.port:
159 import sunaudiodev
160 self.port = sunaudiodev.open('w')
161 info = self.port.getinfo()
162 info.o_sample_rate = self.outrate
163 info.o_channels = self.nchannels
164 if self.sampwidth == 0:
165 info.o_precision = 8
166 self.o_encoding = ENCODING_ULAW
167 else:
168 info.o_precision = 8 * self.sampwidth
169 info.o_encoding = SUNAUDIODEV.ENCODING_LINEAR
170 self.port.setinfo(info)
171 if self.converter:
172 data = self.converter(data)
173 self.port.write(data)
174
175 def wait(self):
176 if not self.port:
177 return
178 self.port.drain()
179 self.stop()
180
181 def stop(self):
182 if self.port:
183 self.port.flush()
184 self.port.close()
185 self.port = None
186
187 def getfilled(self):
188 if self.port:
189 return self.port.obufcount()
190 else:
191 return 0
192
193 def getfillable(self):
194 return BUFFERSIZE - self.getfilled()
195
196def AudioDev():
197 try:
198 import al
199 return Play_Audio_sgi()
200 except ImportError:
201 try:
202 import sunaudiodev
203 return Play_Audio_sun()
204 except ImportError:
205 raise error, 'no audio device'