blob: a587ac6aa18119377f16768e3e2e75082d37c322 [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 }
274 return PyInt_FromLong(self->x_ocount - ai.play.samples);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000275}
276
Barry Warsaw8496d391996-12-13 00:11:04 +0000277static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000278sad_drain(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000279 sadobject *self;
280 PyObject *args;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000281{
282
Barry Warsaw8496d391996-12-13 00:11:04 +0000283 if (!PyArg_Parse(args, ""))
284 return NULL;
285 if (ioctl(self->x_fd, AUDIO_DRAIN, 0) < 0) {
286 PyErr_SetFromErrno(SunAudioError);
287 return NULL;
288 }
289 Py_INCREF(Py_None);
290 return Py_None;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000291}
292
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000293#ifdef SOLARIS
Barry Warsaw8496d391996-12-13 00:11:04 +0000294static PyObject *
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000295sad_getdev(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000296 sadobject *self;
297 PyObject *args;
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000298{
Barry Warsaw8496d391996-12-13 00:11:04 +0000299 struct audio_device ad;
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000300
Barry Warsaw8496d391996-12-13 00:11:04 +0000301 if (!PyArg_Parse(args, ""))
302 return NULL;
303 if (ioctl(self->x_fd, AUDIO_GETDEV, &ad) < 0) {
304 PyErr_SetFromErrno(SunAudioError);
305 return NULL;
306 }
307 return Py_BuildValue("(sss)", ad.name, ad.version, ad.config);
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000308}
309#endif
310
Barry Warsaw8496d391996-12-13 00:11:04 +0000311static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000312sad_flush(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000313 sadobject *self;
314 PyObject *args;
Guido van Rossum234f9421993-06-17 12:35:49 +0000315{
316
Barry Warsaw8496d391996-12-13 00:11:04 +0000317 if (!PyArg_Parse(args, ""))
318 return NULL;
319 if (ioctl(self->x_fd, I_FLUSH, FLUSHW) < 0) {
320 PyErr_SetFromErrno(SunAudioError);
321 return NULL;
322 }
323 Py_INCREF(Py_None);
324 return Py_None;
Guido van Rossum234f9421993-06-17 12:35:49 +0000325}
326
Barry Warsaw8496d391996-12-13 00:11:04 +0000327static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000328sad_close(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000329 sadobject *self;
330 PyObject *args;
Guido van Rossum234f9421993-06-17 12:35:49 +0000331{
332
Barry Warsaw8496d391996-12-13 00:11:04 +0000333 if (!PyArg_Parse(args, ""))
334 return NULL;
335 if (self->x_fd >= 0) {
336 close(self->x_fd);
337 self->x_fd = -1;
338 }
339 Py_INCREF(Py_None);
340 return Py_None;
Guido van Rossum234f9421993-06-17 12:35:49 +0000341}
342
Barry Warsaw8496d391996-12-13 00:11:04 +0000343static PyMethodDef sad_methods[] = {
344 { "read", (PyCFunction)sad_read },
345 { "write", (PyCFunction)sad_write },
346 { "ibufcount", (PyCFunction)sad_ibufcount },
347 { "obufcount", (PyCFunction)sad_obufcount },
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000348#define CTL_METHODS 4
Barry Warsaw8496d391996-12-13 00:11:04 +0000349 { "getinfo", (PyCFunction)sad_getinfo },
350 { "setinfo", (PyCFunction)sad_setinfo },
351 { "drain", (PyCFunction)sad_drain },
352 { "flush", (PyCFunction)sad_flush },
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000353#ifdef SOLARIS
Barry Warsaw8496d391996-12-13 00:11:04 +0000354 { "getdev", (PyCFunction)sad_getdev },
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000355#endif
Barry Warsaw8496d391996-12-13 00:11:04 +0000356 { "close", (PyCFunction)sad_close },
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000357 {NULL, NULL} /* sentinel */
358};
359
Barry Warsaw8496d391996-12-13 00:11:04 +0000360static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000361sad_getattr(xp, name)
362 sadobject *xp;
363 char *name;
364{
Barry Warsaw8496d391996-12-13 00:11:04 +0000365 if (xp->x_isctl)
366 return Py_FindMethod(sad_methods+CTL_METHODS,
367 (PyObject *)xp, name);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000368 else
Barry Warsaw8496d391996-12-13 00:11:04 +0000369 return Py_FindMethod(sad_methods, (PyObject *)xp, name);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000370}
371
372/* ----------------------------------------------------------------- */
373
374static sadstatusobject *
375sads_alloc() {
Barry Warsaw8496d391996-12-13 00:11:04 +0000376 return PyObject_NEW(sadstatusobject, &Sadstatustype);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000377}
378
379static void
380sads_dealloc(xp)
Barry Warsaw8496d391996-12-13 00:11:04 +0000381 sadstatusobject *xp;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000382{
Barry Warsaw8496d391996-12-13 00:11:04 +0000383 PyMem_DEL(xp);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000384}
385
386#define OFF(x) offsetof(audio_info_t,x)
387static struct memberlist sads_ml[] = {
388 { "i_sample_rate", T_UINT, OFF(record.sample_rate) },
389 { "i_channels", T_UINT, OFF(record.channels) },
390 { "i_precision", T_UINT, OFF(record.precision) },
391 { "i_encoding", T_UINT, OFF(record.encoding) },
392 { "i_gain", T_UINT, OFF(record.gain) },
393 { "i_port", T_UINT, OFF(record.port) },
394 { "i_samples", T_UINT, OFF(record.samples) },
395 { "i_eof", T_UINT, OFF(record.eof) },
396 { "i_pause", T_UBYTE, OFF(record.pause) },
397 { "i_error", T_UBYTE, OFF(record.error) },
398 { "i_waiting", T_UBYTE, OFF(record.waiting) },
399 { "i_open", T_UBYTE, OFF(record.open) , RO},
400 { "i_active", T_UBYTE, OFF(record.active) , RO},
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000401#ifdef SOLARIS
402 { "i_buffer_size", T_UINT, OFF(record.buffer_size) },
403 { "i_balance", T_UBYTE, OFF(record.balance) },
404 { "i_avail_ports", T_UINT, OFF(record.avail_ports) },
405#endif
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000406
407 { "o_sample_rate", T_UINT, OFF(play.sample_rate) },
408 { "o_channels", T_UINT, OFF(play.channels) },
409 { "o_precision", T_UINT, OFF(play.precision) },
410 { "o_encoding", T_UINT, OFF(play.encoding) },
411 { "o_gain", T_UINT, OFF(play.gain) },
412 { "o_port", T_UINT, OFF(play.port) },
413 { "o_samples", T_UINT, OFF(play.samples) },
414 { "o_eof", T_UINT, OFF(play.eof) },
415 { "o_pause", T_UBYTE, OFF(play.pause) },
416 { "o_error", T_UBYTE, OFF(play.error) },
417 { "o_waiting", T_UBYTE, OFF(play.waiting) },
418 { "o_open", T_UBYTE, OFF(play.open) , RO},
419 { "o_active", T_UBYTE, OFF(play.active) , RO},
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000420#ifdef SOLARIS
421 { "o_buffer_size", T_UINT, OFF(play.buffer_size) },
422 { "o_balance", T_UBYTE, OFF(play.balance) },
423 { "o_avail_ports", T_UINT, OFF(play.avail_ports) },
424#endif
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000425
426 { "monitor_gain", T_UINT, OFF(monitor_gain) },
427 { NULL, 0, 0},
428};
429
Barry Warsaw8496d391996-12-13 00:11:04 +0000430static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000431sads_getattr(xp, name)
Barry Warsaw8496d391996-12-13 00:11:04 +0000432 sadstatusobject *xp;
433 char *name;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000434{
Barry Warsaw8496d391996-12-13 00:11:04 +0000435 return PyMember_Get((char *)&xp->ai, sads_ml, name);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000436}
437
438static int
439sads_setattr(xp, name, v)
Barry Warsaw8496d391996-12-13 00:11:04 +0000440 sadstatusobject *xp;
441 char *name;
442 PyObject *v;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000443{
Guido van Rossum94472a01992-09-04 09:45:18 +0000444
445 if (v == NULL) {
Barry Warsaw8496d391996-12-13 00:11:04 +0000446 PyErr_SetString(PyExc_TypeError,
447 "can't delete sun audio status attributes");
Guido van Rossumf156f501996-09-11 23:31:23 +0000448 return -1;
Guido van Rossum94472a01992-09-04 09:45:18 +0000449 }
Barry Warsaw8496d391996-12-13 00:11:04 +0000450 return PyMember_Set((char *)&xp->ai, sads_ml, name, v);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000451}
452
453/* ------------------------------------------------------------------- */
454
455
Barry Warsaw8496d391996-12-13 00:11:04 +0000456static PyTypeObject Sadtype = {
457 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000458 0, /*ob_size*/
459 "sun_audio_device", /*tp_name*/
460 sizeof(sadobject), /*tp_size*/
461 0, /*tp_itemsize*/
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000462 /* methods */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000463 (destructor)sad_dealloc, /*tp_dealloc*/
464 0, /*tp_print*/
465 (getattrfunc)sad_getattr, /*tp_getattr*/
466 0, /*tp_setattr*/
467 0, /*tp_compare*/
468 0, /*tp_repr*/
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000469};
470
Barry Warsaw8496d391996-12-13 00:11:04 +0000471static PyTypeObject Sadstatustype = {
472 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000473 0, /*ob_size*/
474 "sun_audio_device_status", /*tp_name*/
475 sizeof(sadstatusobject), /*tp_size*/
476 0, /*tp_itemsize*/
477 /* methods */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000478 (destructor)sads_dealloc, /*tp_dealloc*/
479 0, /*tp_print*/
480 (getattrfunc)sads_getattr, /*tp_getattr*/
481 (setattrfunc)sads_setattr, /*tp_setattr*/
482 0, /*tp_compare*/
483 0, /*tp_repr*/
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000484};
485/* ------------------------------------------------------------------- */
486
Barry Warsaw8496d391996-12-13 00:11:04 +0000487static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000488sadopen(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000489 PyObject *self;
490 PyObject *args;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000491{
Barry Warsaw8496d391996-12-13 00:11:04 +0000492 return (PyObject *)newsadobject(args);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000493}
494
Barry Warsaw8496d391996-12-13 00:11:04 +0000495static PyMethodDef sunaudiodev_methods[] = {
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000496 { "open", sadopen },
497 { 0, 0 },
498};
499
500void
Barry Warsaw8496d391996-12-13 00:11:04 +0000501initsunaudiodev()
502{
503 PyObject *m, *d;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000504
Barry Warsaw8496d391996-12-13 00:11:04 +0000505 m = Py_InitModule("sunaudiodev", sunaudiodev_methods);
506 d = PyModule_GetDict(m);
507 SunAudioError = PyString_FromString("sunaudiodev.error");
Barry Warsaw42185a21997-01-09 22:29:57 +0000508 if (SunAudioError)
509 PyDict_SetItemString(d, "error", SunAudioError);
510 if (PyErr_Occurred())
511 Py_FatalError("can't initialize sunaudiodev module");
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000512}