blob: d0edea62207014086e877acc24770904f3573b40 [file] [log] [blame]
Guido van Rossum9c52e0f1992-06-03 17:06:14 +00001/***********************************************************
Guido van Rossum524b5881995-01-04 19:10:35 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossum9c52e0f1992-06-03 17:06:14 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossum9c52e0f1992-06-03 17:06:14 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000029
30******************************************************************/
31
32/* Sad objects */
33
Barry Warsaw8496d391996-12-13 00:11:04 +000034#include "Python.h"
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000035#include "structmember.h"
36
Guido van Rossumb6775db1994-08-01 11:34:53 +000037#ifdef HAVE_SYS_AUDIOIO_H
38#define SOLARIS
39#endif
40
Guido van Rossume29ed8f1996-12-10 15:21:30 +000041#ifdef HAVE_UNISTD_H
42#include <unistd.h>
43#endif
44
45#ifdef HAVE_FCNTL_H
46#include <fcntl.h>
47#endif
48
Guido van Rossum234f9421993-06-17 12:35:49 +000049#include <stropts.h>
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000050#include <sys/ioctl.h>
Sjoerd Mullender66bca321993-12-03 16:54:45 +000051#ifdef SOLARIS
Guido van Rossumb6775db1994-08-01 11:34:53 +000052#include <sys/audioio.h>
Sjoerd Mullender66bca321993-12-03 16:54:45 +000053#else
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000054#include <sun/audioio.h>
Sjoerd Mullender66bca321993-12-03 16:54:45 +000055#endif
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000056
57/* #define offsetof(str,mem) ((int)(((str *)0)->mem)) */
58
59typedef struct {
Barry Warsaw8496d391996-12-13 00:11:04 +000060 PyObject_HEAD
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000061 int x_fd; /* The open file */
62 int x_icount; /* # samples read */
63 int x_ocount; /* # samples written */
64 int x_isctl; /* True if control device */
65
66} sadobject;
67
68typedef struct {
Barry Warsaw8496d391996-12-13 00:11:04 +000069 PyObject_HEAD
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000070 audio_info_t ai;
71} sadstatusobject;
72
Barry Warsaw8496d391996-12-13 00:11:04 +000073staticforward PyTypeObject Sadtype;
74staticforward PyTypeObject Sadstatustype;
Sjoerd Mullender66bca321993-12-03 16:54:45 +000075static sadstatusobject *sads_alloc(); /* Forward */
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000076
Barry Warsaw8496d391996-12-13 00:11:04 +000077static PyObject *SunAudioError;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000078
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000079#define is_sadobject(v) ((v)->ob_type == &Sadtype)
80#define is_sadstatusobject(v) ((v)->ob_type == &Sadstatustype)
81
82static sadobject *
83newsadobject(arg)
Barry Warsaw8496d391996-12-13 00:11:04 +000084 PyObject *arg;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000085{
86 sadobject *xp;
87 int fd;
88 char *mode;
89 int imode;
90
91 /* Check arg for r/w/rw */
Barry Warsaw8496d391996-12-13 00:11:04 +000092 if (!PyArg_Parse(arg, "s", &mode))
93 return NULL;
94 if (strcmp(mode, "r") == 0)
95 imode = 0;
96 else if (strcmp(mode, "w") == 0)
97 imode = 1;
98 else if (strcmp(mode, "rw") == 0)
99 imode = 2;
100 else if (strcmp(mode, "control") == 0)
101 imode = -1;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000102 else {
Barry Warsaw8496d391996-12-13 00:11:04 +0000103 PyErr_SetString(SunAudioError,
104 "Mode should be one of 'r', 'w', 'rw' or 'control'");
105 return NULL;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000106 }
107
108 /* Open the correct device */
Barry Warsaw8496d391996-12-13 00:11:04 +0000109 if (imode < 0)
110 /* XXXX Check that this works */
111 fd = open("/dev/audioctl", 2);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000112 else
Barry Warsaw8496d391996-12-13 00:11:04 +0000113 fd = open("/dev/audio", imode);
114 if (fd < 0) {
115 PyErr_SetFromErrno(SunAudioError);
116 return NULL;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000117 }
118
119 /* Create and initialize the object */
Barry Warsaw8496d391996-12-13 00:11:04 +0000120 xp = PyObject_NEW(sadobject, &Sadtype);
Barry Warsaw42185a21997-01-09 22:29:57 +0000121 if (xp == NULL) {
122 close(fd);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000123 return NULL;
Barry Warsaw42185a21997-01-09 22:29:57 +0000124 }
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000125 xp->x_fd = fd;
126 xp->x_icount = xp->x_ocount = 0;
127 xp->x_isctl = (imode < 0);
128
129 return xp;
130}
131
132/* Sad methods */
133
134static void
135sad_dealloc(xp)
136 sadobject *xp;
137{
138 close(xp->x_fd);
Barry Warsaw8496d391996-12-13 00:11:04 +0000139 PyMem_DEL(xp);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000140}
141
Barry Warsaw8496d391996-12-13 00:11:04 +0000142static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000143sad_read(self, args)
144 sadobject *self;
Barry Warsaw8496d391996-12-13 00:11:04 +0000145 PyObject *args;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000146{
147 int size, count;
148 char *cp;
Barry Warsaw8496d391996-12-13 00:11:04 +0000149 PyObject *rv;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000150
Barry Warsaw8496d391996-12-13 00:11:04 +0000151 if (!PyArg_Parse(args, "i", &size))
152 return NULL;
153 rv = PyString_FromStringAndSize(NULL, size);
154 if (rv == NULL)
155 return NULL;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000156
Barry Warsaw8496d391996-12-13 00:11:04 +0000157 if (!(cp = PyString_AsString(rv)))
158 goto finally;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000159
160 count = read(self->x_fd, cp, size);
Barry Warsaw8496d391996-12-13 00:11:04 +0000161 if (count < 0) {
162 PyErr_SetFromErrno(SunAudioError);
163 goto finally;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000164 }
Barry Warsaw8496d391996-12-13 00:11:04 +0000165#if 0
166 /* TBD: why print this message if you can handle the condition?
Barry Warsaw42185a21997-01-09 22:29:57 +0000167 * assume it's debugging info which we can just as well get rid
168 * of. in any case this message should *not* be using printf!
169 */
Barry Warsaw8496d391996-12-13 00:11:04 +0000170 if (count != size)
171 printf("sunaudio: funny read rv %d wtd %d\n", count, size);
172#endif
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000173 self->x_icount += count;
174 return rv;
Barry Warsaw8496d391996-12-13 00:11:04 +0000175
176 finally:
177 Py_DECREF(rv);
178 return NULL;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000179}
180
Barry Warsaw8496d391996-12-13 00:11:04 +0000181static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000182sad_write(self, args)
183 sadobject *self;
Barry Warsaw8496d391996-12-13 00:11:04 +0000184 PyObject *args;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000185{
186 char *cp;
187 int count, size;
188
Barry Warsaw8496d391996-12-13 00:11:04 +0000189 if (!PyArg_Parse(args, "s#", &cp, &size))
190 return NULL;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000191
192 count = write(self->x_fd, cp, size);
Barry Warsaw8496d391996-12-13 00:11:04 +0000193 if (count < 0) {
194 PyErr_SetFromErrno(SunAudioError);
195 return NULL;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000196 }
Barry Warsaw8496d391996-12-13 00:11:04 +0000197#if 0
198 if (count != size)
199 printf("sunaudio: funny write rv %d wanted %d\n", count, size);
200#endif
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000201 self->x_ocount += count;
202
Barry Warsaw8496d391996-12-13 00:11:04 +0000203 Py_INCREF(Py_None);
204 return Py_None;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000205}
206
Barry Warsaw8496d391996-12-13 00:11:04 +0000207static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000208sad_getinfo(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000209 sadobject *self;
210 PyObject *args;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000211{
212 sadstatusobject *rv;
213
Barry Warsaw8496d391996-12-13 00:11:04 +0000214 if (!PyArg_Parse(args, ""))
215 return NULL;
Barry Warsaw42185a21997-01-09 22:29:57 +0000216 if (!(rv = sads_alloc()))
217 return NULL;
218
Barry Warsaw8496d391996-12-13 00:11:04 +0000219 if (ioctl(self->x_fd, AUDIO_GETINFO, &rv->ai) < 0) {
220 PyErr_SetFromErrno(SunAudioError);
221 Py_DECREF(rv);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000222 return NULL;
223 }
Barry Warsaw8496d391996-12-13 00:11:04 +0000224 return (PyObject *)rv;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000225}
226
Barry Warsaw8496d391996-12-13 00:11:04 +0000227static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000228sad_setinfo(self, arg)
Barry Warsaw8496d391996-12-13 00:11:04 +0000229 sadobject *self;
230 sadstatusobject *arg;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000231{
Barry Warsaw8496d391996-12-13 00:11:04 +0000232 if (!is_sadstatusobject(arg)) {
233 PyErr_SetString(PyExc_TypeError,
234 "Must be sun audio status object");
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000235 return NULL;
236 }
Barry Warsaw8496d391996-12-13 00:11:04 +0000237 if (ioctl(self->x_fd, AUDIO_SETINFO, &arg->ai) < 0) {
238 PyErr_SetFromErrno(SunAudioError);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000239 return NULL;
240 }
Barry Warsaw8496d391996-12-13 00:11:04 +0000241 Py_INCREF(Py_None);
242 return Py_None;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000243}
244
Barry Warsaw8496d391996-12-13 00:11:04 +0000245static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000246sad_ibufcount(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000247 sadobject *self;
248 PyObject *args;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000249{
Barry Warsaw8496d391996-12-13 00:11:04 +0000250 audio_info_t ai;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000251
Barry Warsaw8496d391996-12-13 00:11:04 +0000252 if (!PyArg_Parse(args, ""))
253 return NULL;
254 if (ioctl(self->x_fd, AUDIO_GETINFO, &ai) < 0) {
255 PyErr_SetFromErrno(SunAudioError);
256 return NULL;
257 }
258 return PyInt_FromLong(ai.record.samples - self->x_icount);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000259}
260
Barry Warsaw8496d391996-12-13 00:11:04 +0000261static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000262sad_obufcount(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000263 sadobject *self;
264 PyObject *args;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000265{
Barry Warsaw8496d391996-12-13 00:11:04 +0000266 audio_info_t ai;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000267
Barry Warsaw8496d391996-12-13 00:11:04 +0000268 if (!PyArg_Parse(args, ""))
269 return NULL;
270 if (ioctl(self->x_fd, AUDIO_GETINFO, &ai) < 0) {
271 PyErr_SetFromErrno(SunAudioError);
272 return NULL;
273 }
Guido van Rossum1e0b19e1997-04-11 15:23:52 +0000274 /* x_ocount is in bytes, wheras play.samples is in frames */
275 /* we want frames */
276 return PyInt_FromLong(self->x_ocount / (ai.play.channels *
277 ai.play.precision / 8) -
278 ai.play.samples);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000279}
280
Barry Warsaw8496d391996-12-13 00:11:04 +0000281static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000282sad_drain(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000283 sadobject *self;
284 PyObject *args;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000285{
286
Barry Warsaw8496d391996-12-13 00:11:04 +0000287 if (!PyArg_Parse(args, ""))
288 return NULL;
289 if (ioctl(self->x_fd, AUDIO_DRAIN, 0) < 0) {
290 PyErr_SetFromErrno(SunAudioError);
291 return NULL;
292 }
293 Py_INCREF(Py_None);
294 return Py_None;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000295}
296
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000297#ifdef SOLARIS
Barry Warsaw8496d391996-12-13 00:11:04 +0000298static PyObject *
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000299sad_getdev(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000300 sadobject *self;
301 PyObject *args;
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000302{
Barry Warsaw8496d391996-12-13 00:11:04 +0000303 struct audio_device ad;
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000304
Barry Warsaw8496d391996-12-13 00:11:04 +0000305 if (!PyArg_Parse(args, ""))
306 return NULL;
307 if (ioctl(self->x_fd, AUDIO_GETDEV, &ad) < 0) {
308 PyErr_SetFromErrno(SunAudioError);
309 return NULL;
310 }
311 return Py_BuildValue("(sss)", ad.name, ad.version, ad.config);
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000312}
313#endif
314
Barry Warsaw8496d391996-12-13 00:11:04 +0000315static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000316sad_flush(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000317 sadobject *self;
318 PyObject *args;
Guido van Rossum234f9421993-06-17 12:35:49 +0000319{
320
Barry Warsaw8496d391996-12-13 00:11:04 +0000321 if (!PyArg_Parse(args, ""))
322 return NULL;
323 if (ioctl(self->x_fd, I_FLUSH, FLUSHW) < 0) {
324 PyErr_SetFromErrno(SunAudioError);
325 return NULL;
326 }
327 Py_INCREF(Py_None);
328 return Py_None;
Guido van Rossum234f9421993-06-17 12:35:49 +0000329}
330
Barry Warsaw8496d391996-12-13 00:11:04 +0000331static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000332sad_close(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000333 sadobject *self;
334 PyObject *args;
Guido van Rossum234f9421993-06-17 12:35:49 +0000335{
336
Barry Warsaw8496d391996-12-13 00:11:04 +0000337 if (!PyArg_Parse(args, ""))
338 return NULL;
339 if (self->x_fd >= 0) {
340 close(self->x_fd);
341 self->x_fd = -1;
342 }
343 Py_INCREF(Py_None);
344 return Py_None;
Guido van Rossum234f9421993-06-17 12:35:49 +0000345}
346
Barry Warsaw8496d391996-12-13 00:11:04 +0000347static PyMethodDef sad_methods[] = {
348 { "read", (PyCFunction)sad_read },
349 { "write", (PyCFunction)sad_write },
350 { "ibufcount", (PyCFunction)sad_ibufcount },
351 { "obufcount", (PyCFunction)sad_obufcount },
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000352#define CTL_METHODS 4
Barry Warsaw8496d391996-12-13 00:11:04 +0000353 { "getinfo", (PyCFunction)sad_getinfo },
354 { "setinfo", (PyCFunction)sad_setinfo },
355 { "drain", (PyCFunction)sad_drain },
356 { "flush", (PyCFunction)sad_flush },
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000357#ifdef SOLARIS
Barry Warsaw8496d391996-12-13 00:11:04 +0000358 { "getdev", (PyCFunction)sad_getdev },
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000359#endif
Barry Warsaw8496d391996-12-13 00:11:04 +0000360 { "close", (PyCFunction)sad_close },
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000361 {NULL, NULL} /* sentinel */
362};
363
Barry Warsaw8496d391996-12-13 00:11:04 +0000364static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000365sad_getattr(xp, name)
366 sadobject *xp;
367 char *name;
368{
Barry Warsaw8496d391996-12-13 00:11:04 +0000369 if (xp->x_isctl)
370 return Py_FindMethod(sad_methods+CTL_METHODS,
371 (PyObject *)xp, name);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000372 else
Barry Warsaw8496d391996-12-13 00:11:04 +0000373 return Py_FindMethod(sad_methods, (PyObject *)xp, name);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000374}
375
376/* ----------------------------------------------------------------- */
377
378static sadstatusobject *
379sads_alloc() {
Barry Warsaw8496d391996-12-13 00:11:04 +0000380 return PyObject_NEW(sadstatusobject, &Sadstatustype);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000381}
382
383static void
384sads_dealloc(xp)
Barry Warsaw8496d391996-12-13 00:11:04 +0000385 sadstatusobject *xp;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000386{
Barry Warsaw8496d391996-12-13 00:11:04 +0000387 PyMem_DEL(xp);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000388}
389
390#define OFF(x) offsetof(audio_info_t,x)
391static struct memberlist sads_ml[] = {
392 { "i_sample_rate", T_UINT, OFF(record.sample_rate) },
393 { "i_channels", T_UINT, OFF(record.channels) },
394 { "i_precision", T_UINT, OFF(record.precision) },
395 { "i_encoding", T_UINT, OFF(record.encoding) },
396 { "i_gain", T_UINT, OFF(record.gain) },
397 { "i_port", T_UINT, OFF(record.port) },
398 { "i_samples", T_UINT, OFF(record.samples) },
399 { "i_eof", T_UINT, OFF(record.eof) },
400 { "i_pause", T_UBYTE, OFF(record.pause) },
401 { "i_error", T_UBYTE, OFF(record.error) },
402 { "i_waiting", T_UBYTE, OFF(record.waiting) },
403 { "i_open", T_UBYTE, OFF(record.open) , RO},
404 { "i_active", T_UBYTE, OFF(record.active) , RO},
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000405#ifdef SOLARIS
406 { "i_buffer_size", T_UINT, OFF(record.buffer_size) },
407 { "i_balance", T_UBYTE, OFF(record.balance) },
408 { "i_avail_ports", T_UINT, OFF(record.avail_ports) },
409#endif
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000410
411 { "o_sample_rate", T_UINT, OFF(play.sample_rate) },
412 { "o_channels", T_UINT, OFF(play.channels) },
413 { "o_precision", T_UINT, OFF(play.precision) },
414 { "o_encoding", T_UINT, OFF(play.encoding) },
415 { "o_gain", T_UINT, OFF(play.gain) },
416 { "o_port", T_UINT, OFF(play.port) },
417 { "o_samples", T_UINT, OFF(play.samples) },
418 { "o_eof", T_UINT, OFF(play.eof) },
419 { "o_pause", T_UBYTE, OFF(play.pause) },
420 { "o_error", T_UBYTE, OFF(play.error) },
421 { "o_waiting", T_UBYTE, OFF(play.waiting) },
422 { "o_open", T_UBYTE, OFF(play.open) , RO},
423 { "o_active", T_UBYTE, OFF(play.active) , RO},
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000424#ifdef SOLARIS
425 { "o_buffer_size", T_UINT, OFF(play.buffer_size) },
426 { "o_balance", T_UBYTE, OFF(play.balance) },
427 { "o_avail_ports", T_UINT, OFF(play.avail_ports) },
428#endif
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000429
430 { "monitor_gain", T_UINT, OFF(monitor_gain) },
431 { NULL, 0, 0},
432};
433
Barry Warsaw8496d391996-12-13 00:11:04 +0000434static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000435sads_getattr(xp, name)
Barry Warsaw8496d391996-12-13 00:11:04 +0000436 sadstatusobject *xp;
437 char *name;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000438{
Barry Warsaw8496d391996-12-13 00:11:04 +0000439 return PyMember_Get((char *)&xp->ai, sads_ml, name);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000440}
441
442static int
443sads_setattr(xp, name, v)
Barry Warsaw8496d391996-12-13 00:11:04 +0000444 sadstatusobject *xp;
445 char *name;
446 PyObject *v;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000447{
Guido van Rossum94472a01992-09-04 09:45:18 +0000448
449 if (v == NULL) {
Barry Warsaw8496d391996-12-13 00:11:04 +0000450 PyErr_SetString(PyExc_TypeError,
451 "can't delete sun audio status attributes");
Guido van Rossumf156f501996-09-11 23:31:23 +0000452 return -1;
Guido van Rossum94472a01992-09-04 09:45:18 +0000453 }
Barry Warsaw8496d391996-12-13 00:11:04 +0000454 return PyMember_Set((char *)&xp->ai, sads_ml, name, v);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000455}
456
457/* ------------------------------------------------------------------- */
458
459
Barry Warsaw8496d391996-12-13 00:11:04 +0000460static PyTypeObject Sadtype = {
461 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000462 0, /*ob_size*/
463 "sun_audio_device", /*tp_name*/
464 sizeof(sadobject), /*tp_size*/
465 0, /*tp_itemsize*/
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000466 /* methods */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000467 (destructor)sad_dealloc, /*tp_dealloc*/
468 0, /*tp_print*/
469 (getattrfunc)sad_getattr, /*tp_getattr*/
470 0, /*tp_setattr*/
471 0, /*tp_compare*/
472 0, /*tp_repr*/
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000473};
474
Barry Warsaw8496d391996-12-13 00:11:04 +0000475static PyTypeObject Sadstatustype = {
476 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000477 0, /*ob_size*/
478 "sun_audio_device_status", /*tp_name*/
479 sizeof(sadstatusobject), /*tp_size*/
480 0, /*tp_itemsize*/
481 /* methods */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000482 (destructor)sads_dealloc, /*tp_dealloc*/
483 0, /*tp_print*/
484 (getattrfunc)sads_getattr, /*tp_getattr*/
485 (setattrfunc)sads_setattr, /*tp_setattr*/
486 0, /*tp_compare*/
487 0, /*tp_repr*/
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000488};
489/* ------------------------------------------------------------------- */
490
Barry Warsaw8496d391996-12-13 00:11:04 +0000491static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000492sadopen(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000493 PyObject *self;
494 PyObject *args;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000495{
Barry Warsaw8496d391996-12-13 00:11:04 +0000496 return (PyObject *)newsadobject(args);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000497}
498
Barry Warsaw8496d391996-12-13 00:11:04 +0000499static PyMethodDef sunaudiodev_methods[] = {
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000500 { "open", sadopen },
501 { 0, 0 },
502};
503
504void
Barry Warsaw8496d391996-12-13 00:11:04 +0000505initsunaudiodev()
506{
507 PyObject *m, *d;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000508
Barry Warsaw8496d391996-12-13 00:11:04 +0000509 m = Py_InitModule("sunaudiodev", sunaudiodev_methods);
510 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +0000511 SunAudioError = PyErr_NewException("sunaudiodev.error", NULL, NULL);
Barry Warsaw42185a21997-01-09 22:29:57 +0000512 if (SunAudioError)
513 PyDict_SetItemString(d, "error", SunAudioError);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000514}