blob: bae17d5e3092bc04fca25bf19428a2b1be19572f [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);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000121 if (xp == NULL)
122 return NULL;
123 xp->x_fd = fd;
124 xp->x_icount = xp->x_ocount = 0;
125 xp->x_isctl = (imode < 0);
126
127 return xp;
128}
129
130/* Sad methods */
131
132static void
133sad_dealloc(xp)
134 sadobject *xp;
135{
136 close(xp->x_fd);
Barry Warsaw8496d391996-12-13 00:11:04 +0000137 PyMem_DEL(xp);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000138}
139
Barry Warsaw8496d391996-12-13 00:11:04 +0000140static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000141sad_read(self, args)
142 sadobject *self;
Barry Warsaw8496d391996-12-13 00:11:04 +0000143 PyObject *args;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000144{
145 int size, count;
146 char *cp;
Barry Warsaw8496d391996-12-13 00:11:04 +0000147 PyObject *rv;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000148
Barry Warsaw8496d391996-12-13 00:11:04 +0000149 if (!PyArg_Parse(args, "i", &size))
150 return NULL;
151 rv = PyString_FromStringAndSize(NULL, size);
152 if (rv == NULL)
153 return NULL;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000154
Barry Warsaw8496d391996-12-13 00:11:04 +0000155 if (!(cp = PyString_AsString(rv)))
156 goto finally;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000157
158 count = read(self->x_fd, cp, size);
Barry Warsaw8496d391996-12-13 00:11:04 +0000159 if (count < 0) {
160 PyErr_SetFromErrno(SunAudioError);
161 goto finally;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000162 }
Barry Warsaw8496d391996-12-13 00:11:04 +0000163#if 0
164 /* TBD: why print this message if you can handle the condition?
165 assume it's debugging info which we can just as well get rid
166 of. in any case this message should *not* be using printf!
167 */
168 if (count != size)
169 printf("sunaudio: funny read rv %d wtd %d\n", count, size);
170#endif
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000171 self->x_icount += count;
172 return rv;
Barry Warsaw8496d391996-12-13 00:11:04 +0000173
174 finally:
175 Py_DECREF(rv);
176 return NULL;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000177}
178
Barry Warsaw8496d391996-12-13 00:11:04 +0000179static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000180sad_write(self, args)
181 sadobject *self;
Barry Warsaw8496d391996-12-13 00:11:04 +0000182 PyObject *args;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000183{
184 char *cp;
185 int count, size;
186
Barry Warsaw8496d391996-12-13 00:11:04 +0000187 if (!PyArg_Parse(args, "s#", &cp, &size))
188 return NULL;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000189
190 count = write(self->x_fd, cp, size);
Barry Warsaw8496d391996-12-13 00:11:04 +0000191 if (count < 0) {
192 PyErr_SetFromErrno(SunAudioError);
193 return NULL;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000194 }
Barry Warsaw8496d391996-12-13 00:11:04 +0000195#if 0
196 if (count != size)
197 printf("sunaudio: funny write rv %d wanted %d\n", count, size);
198#endif
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000199 self->x_ocount += count;
200
Barry Warsaw8496d391996-12-13 00:11:04 +0000201 Py_INCREF(Py_None);
202 return Py_None;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000203}
204
Barry Warsaw8496d391996-12-13 00:11:04 +0000205static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000206sad_getinfo(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000207 sadobject *self;
208 PyObject *args;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000209{
210 sadstatusobject *rv;
211
Barry Warsaw8496d391996-12-13 00:11:04 +0000212 if (!PyArg_Parse(args, ""))
213 return NULL;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000214 rv = sads_alloc();
Barry Warsaw8496d391996-12-13 00:11:04 +0000215 if (ioctl(self->x_fd, AUDIO_GETINFO, &rv->ai) < 0) {
216 PyErr_SetFromErrno(SunAudioError);
217 Py_DECREF(rv);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000218 return NULL;
219 }
Barry Warsaw8496d391996-12-13 00:11:04 +0000220 return (PyObject *)rv;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000221}
222
Barry Warsaw8496d391996-12-13 00:11:04 +0000223static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000224sad_setinfo(self, arg)
Barry Warsaw8496d391996-12-13 00:11:04 +0000225 sadobject *self;
226 sadstatusobject *arg;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000227{
Barry Warsaw8496d391996-12-13 00:11:04 +0000228 if (!is_sadstatusobject(arg)) {
229 PyErr_SetString(PyExc_TypeError,
230 "Must be sun audio status object");
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000231 return NULL;
232 }
Barry Warsaw8496d391996-12-13 00:11:04 +0000233 if (ioctl(self->x_fd, AUDIO_SETINFO, &arg->ai) < 0) {
234 PyErr_SetFromErrno(SunAudioError);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000235 return NULL;
236 }
Barry Warsaw8496d391996-12-13 00:11:04 +0000237 Py_INCREF(Py_None);
238 return Py_None;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000239}
240
Barry Warsaw8496d391996-12-13 00:11:04 +0000241static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000242sad_ibufcount(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000243 sadobject *self;
244 PyObject *args;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000245{
Barry Warsaw8496d391996-12-13 00:11:04 +0000246 audio_info_t ai;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000247
Barry Warsaw8496d391996-12-13 00:11:04 +0000248 if (!PyArg_Parse(args, ""))
249 return NULL;
250 if (ioctl(self->x_fd, AUDIO_GETINFO, &ai) < 0) {
251 PyErr_SetFromErrno(SunAudioError);
252 return NULL;
253 }
254 return PyInt_FromLong(ai.record.samples - self->x_icount);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000255}
256
Barry Warsaw8496d391996-12-13 00:11:04 +0000257static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000258sad_obufcount(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000259 sadobject *self;
260 PyObject *args;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000261{
Barry Warsaw8496d391996-12-13 00:11:04 +0000262 audio_info_t ai;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000263
Barry Warsaw8496d391996-12-13 00:11:04 +0000264 if (!PyArg_Parse(args, ""))
265 return NULL;
266 if (ioctl(self->x_fd, AUDIO_GETINFO, &ai) < 0) {
267 PyErr_SetFromErrno(SunAudioError);
268 return NULL;
269 }
270 return PyInt_FromLong(self->x_ocount - ai.play.samples);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000271}
272
Barry Warsaw8496d391996-12-13 00:11:04 +0000273static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000274sad_drain(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000275 sadobject *self;
276 PyObject *args;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000277{
278
Barry Warsaw8496d391996-12-13 00:11:04 +0000279 if (!PyArg_Parse(args, ""))
280 return NULL;
281 if (ioctl(self->x_fd, AUDIO_DRAIN, 0) < 0) {
282 PyErr_SetFromErrno(SunAudioError);
283 return NULL;
284 }
285 Py_INCREF(Py_None);
286 return Py_None;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000287}
288
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000289#ifdef SOLARIS
Barry Warsaw8496d391996-12-13 00:11:04 +0000290static PyObject *
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000291sad_getdev(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000292 sadobject *self;
293 PyObject *args;
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000294{
Barry Warsaw8496d391996-12-13 00:11:04 +0000295 struct audio_device ad;
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000296
Barry Warsaw8496d391996-12-13 00:11:04 +0000297 if (!PyArg_Parse(args, ""))
298 return NULL;
299 if (ioctl(self->x_fd, AUDIO_GETDEV, &ad) < 0) {
300 PyErr_SetFromErrno(SunAudioError);
301 return NULL;
302 }
303 return Py_BuildValue("(sss)", ad.name, ad.version, ad.config);
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000304}
305#endif
306
Barry Warsaw8496d391996-12-13 00:11:04 +0000307static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000308sad_flush(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000309 sadobject *self;
310 PyObject *args;
Guido van Rossum234f9421993-06-17 12:35:49 +0000311{
312
Barry Warsaw8496d391996-12-13 00:11:04 +0000313 if (!PyArg_Parse(args, ""))
314 return NULL;
315 if (ioctl(self->x_fd, I_FLUSH, FLUSHW) < 0) {
316 PyErr_SetFromErrno(SunAudioError);
317 return NULL;
318 }
319 Py_INCREF(Py_None);
320 return Py_None;
Guido van Rossum234f9421993-06-17 12:35:49 +0000321}
322
Barry Warsaw8496d391996-12-13 00:11:04 +0000323static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000324sad_close(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000325 sadobject *self;
326 PyObject *args;
Guido van Rossum234f9421993-06-17 12:35:49 +0000327{
328
Barry Warsaw8496d391996-12-13 00:11:04 +0000329 if (!PyArg_Parse(args, ""))
330 return NULL;
331 if (self->x_fd >= 0) {
332 close(self->x_fd);
333 self->x_fd = -1;
334 }
335 Py_INCREF(Py_None);
336 return Py_None;
Guido van Rossum234f9421993-06-17 12:35:49 +0000337}
338
Barry Warsaw8496d391996-12-13 00:11:04 +0000339static PyMethodDef sad_methods[] = {
340 { "read", (PyCFunction)sad_read },
341 { "write", (PyCFunction)sad_write },
342 { "ibufcount", (PyCFunction)sad_ibufcount },
343 { "obufcount", (PyCFunction)sad_obufcount },
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000344#define CTL_METHODS 4
Barry Warsaw8496d391996-12-13 00:11:04 +0000345 { "getinfo", (PyCFunction)sad_getinfo },
346 { "setinfo", (PyCFunction)sad_setinfo },
347 { "drain", (PyCFunction)sad_drain },
348 { "flush", (PyCFunction)sad_flush },
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000349#ifdef SOLARIS
Barry Warsaw8496d391996-12-13 00:11:04 +0000350 { "getdev", (PyCFunction)sad_getdev },
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000351#endif
Barry Warsaw8496d391996-12-13 00:11:04 +0000352 { "close", (PyCFunction)sad_close },
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000353 {NULL, NULL} /* sentinel */
354};
355
Barry Warsaw8496d391996-12-13 00:11:04 +0000356static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000357sad_getattr(xp, name)
358 sadobject *xp;
359 char *name;
360{
Barry Warsaw8496d391996-12-13 00:11:04 +0000361 if (xp->x_isctl)
362 return Py_FindMethod(sad_methods+CTL_METHODS,
363 (PyObject *)xp, name);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000364 else
Barry Warsaw8496d391996-12-13 00:11:04 +0000365 return Py_FindMethod(sad_methods, (PyObject *)xp, name);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000366}
367
368/* ----------------------------------------------------------------- */
369
370static sadstatusobject *
371sads_alloc() {
Barry Warsaw8496d391996-12-13 00:11:04 +0000372 return PyObject_NEW(sadstatusobject, &Sadstatustype);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000373}
374
375static void
376sads_dealloc(xp)
Barry Warsaw8496d391996-12-13 00:11:04 +0000377 sadstatusobject *xp;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000378{
Barry Warsaw8496d391996-12-13 00:11:04 +0000379 PyMem_DEL(xp);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000380}
381
382#define OFF(x) offsetof(audio_info_t,x)
383static struct memberlist sads_ml[] = {
384 { "i_sample_rate", T_UINT, OFF(record.sample_rate) },
385 { "i_channels", T_UINT, OFF(record.channels) },
386 { "i_precision", T_UINT, OFF(record.precision) },
387 { "i_encoding", T_UINT, OFF(record.encoding) },
388 { "i_gain", T_UINT, OFF(record.gain) },
389 { "i_port", T_UINT, OFF(record.port) },
390 { "i_samples", T_UINT, OFF(record.samples) },
391 { "i_eof", T_UINT, OFF(record.eof) },
392 { "i_pause", T_UBYTE, OFF(record.pause) },
393 { "i_error", T_UBYTE, OFF(record.error) },
394 { "i_waiting", T_UBYTE, OFF(record.waiting) },
395 { "i_open", T_UBYTE, OFF(record.open) , RO},
396 { "i_active", T_UBYTE, OFF(record.active) , RO},
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000397#ifdef SOLARIS
398 { "i_buffer_size", T_UINT, OFF(record.buffer_size) },
399 { "i_balance", T_UBYTE, OFF(record.balance) },
400 { "i_avail_ports", T_UINT, OFF(record.avail_ports) },
401#endif
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000402
403 { "o_sample_rate", T_UINT, OFF(play.sample_rate) },
404 { "o_channels", T_UINT, OFF(play.channels) },
405 { "o_precision", T_UINT, OFF(play.precision) },
406 { "o_encoding", T_UINT, OFF(play.encoding) },
407 { "o_gain", T_UINT, OFF(play.gain) },
408 { "o_port", T_UINT, OFF(play.port) },
409 { "o_samples", T_UINT, OFF(play.samples) },
410 { "o_eof", T_UINT, OFF(play.eof) },
411 { "o_pause", T_UBYTE, OFF(play.pause) },
412 { "o_error", T_UBYTE, OFF(play.error) },
413 { "o_waiting", T_UBYTE, OFF(play.waiting) },
414 { "o_open", T_UBYTE, OFF(play.open) , RO},
415 { "o_active", T_UBYTE, OFF(play.active) , RO},
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000416#ifdef SOLARIS
417 { "o_buffer_size", T_UINT, OFF(play.buffer_size) },
418 { "o_balance", T_UBYTE, OFF(play.balance) },
419 { "o_avail_ports", T_UINT, OFF(play.avail_ports) },
420#endif
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000421
422 { "monitor_gain", T_UINT, OFF(monitor_gain) },
423 { NULL, 0, 0},
424};
425
Barry Warsaw8496d391996-12-13 00:11:04 +0000426static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000427sads_getattr(xp, name)
Barry Warsaw8496d391996-12-13 00:11:04 +0000428 sadstatusobject *xp;
429 char *name;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000430{
Barry Warsaw8496d391996-12-13 00:11:04 +0000431 return PyMember_Get((char *)&xp->ai, sads_ml, name);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000432}
433
434static int
435sads_setattr(xp, name, v)
Barry Warsaw8496d391996-12-13 00:11:04 +0000436 sadstatusobject *xp;
437 char *name;
438 PyObject *v;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000439{
Guido van Rossum94472a01992-09-04 09:45:18 +0000440
441 if (v == NULL) {
Barry Warsaw8496d391996-12-13 00:11:04 +0000442 PyErr_SetString(PyExc_TypeError,
443 "can't delete sun audio status attributes");
Guido van Rossumf156f501996-09-11 23:31:23 +0000444 return -1;
Guido van Rossum94472a01992-09-04 09:45:18 +0000445 }
Barry Warsaw8496d391996-12-13 00:11:04 +0000446 return PyMember_Set((char *)&xp->ai, sads_ml, name, v);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000447}
448
449/* ------------------------------------------------------------------- */
450
451
Barry Warsaw8496d391996-12-13 00:11:04 +0000452static PyTypeObject Sadtype = {
453 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000454 0, /*ob_size*/
455 "sun_audio_device", /*tp_name*/
456 sizeof(sadobject), /*tp_size*/
457 0, /*tp_itemsize*/
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000458 /* methods */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000459 (destructor)sad_dealloc, /*tp_dealloc*/
460 0, /*tp_print*/
461 (getattrfunc)sad_getattr, /*tp_getattr*/
462 0, /*tp_setattr*/
463 0, /*tp_compare*/
464 0, /*tp_repr*/
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000465};
466
Barry Warsaw8496d391996-12-13 00:11:04 +0000467static PyTypeObject Sadstatustype = {
468 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000469 0, /*ob_size*/
470 "sun_audio_device_status", /*tp_name*/
471 sizeof(sadstatusobject), /*tp_size*/
472 0, /*tp_itemsize*/
473 /* methods */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000474 (destructor)sads_dealloc, /*tp_dealloc*/
475 0, /*tp_print*/
476 (getattrfunc)sads_getattr, /*tp_getattr*/
477 (setattrfunc)sads_setattr, /*tp_setattr*/
478 0, /*tp_compare*/
479 0, /*tp_repr*/
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000480};
481/* ------------------------------------------------------------------- */
482
Barry Warsaw8496d391996-12-13 00:11:04 +0000483static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000484sadopen(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000485 PyObject *self;
486 PyObject *args;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000487{
Barry Warsaw8496d391996-12-13 00:11:04 +0000488 return (PyObject *)newsadobject(args);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000489}
490
Barry Warsaw8496d391996-12-13 00:11:04 +0000491static PyMethodDef sunaudiodev_methods[] = {
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000492 { "open", sadopen },
493 { 0, 0 },
494};
495
496void
Barry Warsaw8496d391996-12-13 00:11:04 +0000497initsunaudiodev()
498{
499 PyObject *m, *d;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000500
Barry Warsaw8496d391996-12-13 00:11:04 +0000501 m = Py_InitModule("sunaudiodev", sunaudiodev_methods);
502 d = PyModule_GetDict(m);
503 SunAudioError = PyString_FromString("sunaudiodev.error");
504 if ( SunAudioError == NULL ||
505 PyDict_SetItemString(d, "error", SunAudioError) )
506 Py_FatalError("can't define sunaudiodev.error");
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000507}