blob: e9ffd1f31dbfc94c05e65422badfe646beb46480 [file] [log] [blame]
Guido van Rossum9c52e0f1992-06-03 17:06:14 +00001
2/* Sad objects */
3
Barry Warsaw8496d391996-12-13 00:11:04 +00004#include "Python.h"
Guido van Rossum9c52e0f1992-06-03 17:06:14 +00005#include "structmember.h"
6
Guido van Rossumb6775db1994-08-01 11:34:53 +00007#ifdef HAVE_SYS_AUDIOIO_H
8#define SOLARIS
9#endif
10
Guido van Rossume29ed8f1996-12-10 15:21:30 +000011#ifdef HAVE_UNISTD_H
12#include <unistd.h>
13#endif
14
15#ifdef HAVE_FCNTL_H
16#include <fcntl.h>
17#endif
18
Guido van Rossum234f9421993-06-17 12:35:49 +000019#include <stropts.h>
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000020#include <sys/ioctl.h>
Sjoerd Mullender66bca321993-12-03 16:54:45 +000021#ifdef SOLARIS
Guido van Rossumb6775db1994-08-01 11:34:53 +000022#include <sys/audioio.h>
Sjoerd Mullender66bca321993-12-03 16:54:45 +000023#else
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000024#include <sun/audioio.h>
Sjoerd Mullender66bca321993-12-03 16:54:45 +000025#endif
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000026
27/* #define offsetof(str,mem) ((int)(((str *)0)->mem)) */
28
29typedef struct {
Barry Warsaw8496d391996-12-13 00:11:04 +000030 PyObject_HEAD
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000031 int x_fd; /* The open file */
32 int x_icount; /* # samples read */
33 int x_ocount; /* # samples written */
34 int x_isctl; /* True if control device */
35
36} sadobject;
37
38typedef struct {
Barry Warsaw8496d391996-12-13 00:11:04 +000039 PyObject_HEAD
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000040 audio_info_t ai;
41} sadstatusobject;
42
Barry Warsaw8496d391996-12-13 00:11:04 +000043staticforward PyTypeObject Sadtype;
44staticforward PyTypeObject Sadstatustype;
Thomas Wouters58d05102000-07-24 14:43:35 +000045static sadstatusobject *sads_alloc(void); /* Forward */
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000046
Barry Warsaw8496d391996-12-13 00:11:04 +000047static PyObject *SunAudioError;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000048
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000049#define is_sadobject(v) ((v)->ob_type == &Sadtype)
50#define is_sadstatusobject(v) ((v)->ob_type == &Sadstatustype)
51
Barry Warsawb0d1b061998-10-31 22:52:54 +000052
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000053static sadobject *
Peter Schneider-Kamp3e3175b2000-07-10 17:25:37 +000054newsadobject(PyObject *args)
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000055{
56 sadobject *xp;
57 int fd;
58 char *mode;
59 int imode;
Barry Warsawb0d1b061998-10-31 22:52:54 +000060 char* basedev;
61 char* ctldev;
62 char* opendev;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000063
64 /* Check arg for r/w/rw */
Peter Schneider-Kamp3e3175b2000-07-10 17:25:37 +000065 if (!PyArg_Parse(args, "s", &mode))
Barry Warsaw8496d391996-12-13 00:11:04 +000066 return NULL;
67 if (strcmp(mode, "r") == 0)
68 imode = 0;
69 else if (strcmp(mode, "w") == 0)
70 imode = 1;
71 else if (strcmp(mode, "rw") == 0)
72 imode = 2;
73 else if (strcmp(mode, "control") == 0)
74 imode = -1;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000075 else {
Barry Warsaw8496d391996-12-13 00:11:04 +000076 PyErr_SetString(SunAudioError,
77 "Mode should be one of 'r', 'w', 'rw' or 'control'");
78 return NULL;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000079 }
80
Barry Warsawb0d1b061998-10-31 22:52:54 +000081 /* Open the correct device. The base device name comes from the
82 * AUDIODEV environment variable first, then /dev/audio. The
83 * control device tacks "ctl" onto the base device name.
84 */
85 basedev = getenv("AUDIODEV");
86 if (!basedev)
87 basedev = "/dev/audio";
88 ctldev = PyMem_NEW(char, strlen(basedev) + 4);
89 if (!ctldev) {
90 PyErr_NoMemory();
Barry Warsaw8496d391996-12-13 00:11:04 +000091 return NULL;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000092 }
Barry Warsawb0d1b061998-10-31 22:52:54 +000093 strcpy(ctldev, basedev);
94 strcat(ctldev, "ctl");
95
96 if (imode < 0) {
97 opendev = ctldev;
98 fd = open(ctldev, 2);
99 }
100 else {
101 opendev = basedev;
102 fd = open(basedev, imode);
103 }
104 if (fd < 0) {
105 PyErr_SetFromErrnoWithFilename(SunAudioError, opendev);
Fred Drake03459a52001-11-09 16:00:41 +0000106 PyMem_DEL(ctldev);
Barry Warsawb0d1b061998-10-31 22:52:54 +0000107 return NULL;
108 }
109 PyMem_DEL(ctldev);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000110
111 /* Create and initialize the object */
Guido van Rossumb18618d2000-05-03 23:44:39 +0000112 xp = PyObject_New(sadobject, &Sadtype);
Barry Warsaw42185a21997-01-09 22:29:57 +0000113 if (xp == NULL) {
114 close(fd);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000115 return NULL;
Barry Warsaw42185a21997-01-09 22:29:57 +0000116 }
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000117 xp->x_fd = fd;
118 xp->x_icount = xp->x_ocount = 0;
119 xp->x_isctl = (imode < 0);
120
121 return xp;
122}
123
124/* Sad methods */
125
126static void
Peter Schneider-Kamp3e3175b2000-07-10 17:25:37 +0000127sad_dealloc(sadobject *xp)
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000128{
129 close(xp->x_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000130 PyObject_Del(xp);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000131}
132
Barry Warsaw8496d391996-12-13 00:11:04 +0000133static PyObject *
Peter Schneider-Kamp3e3175b2000-07-10 17:25:37 +0000134sad_read(sadobject *self, PyObject *args)
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000135{
136 int size, count;
137 char *cp;
Barry Warsaw8496d391996-12-13 00:11:04 +0000138 PyObject *rv;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000139
Barry Warsaw8496d391996-12-13 00:11:04 +0000140 if (!PyArg_Parse(args, "i", &size))
141 return NULL;
142 rv = PyString_FromStringAndSize(NULL, size);
143 if (rv == NULL)
144 return NULL;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000145
Barry Warsaw8496d391996-12-13 00:11:04 +0000146 if (!(cp = PyString_AsString(rv)))
147 goto finally;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000148
149 count = read(self->x_fd, cp, size);
Barry Warsaw8496d391996-12-13 00:11:04 +0000150 if (count < 0) {
151 PyErr_SetFromErrno(SunAudioError);
152 goto finally;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000153 }
Barry Warsaw8496d391996-12-13 00:11:04 +0000154#if 0
155 /* TBD: why print this message if you can handle the condition?
Barry Warsaw42185a21997-01-09 22:29:57 +0000156 * assume it's debugging info which we can just as well get rid
157 * of. in any case this message should *not* be using printf!
158 */
Barry Warsaw8496d391996-12-13 00:11:04 +0000159 if (count != size)
160 printf("sunaudio: funny read rv %d wtd %d\n", count, size);
161#endif
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000162 self->x_icount += count;
163 return rv;
Barry Warsaw8496d391996-12-13 00:11:04 +0000164
165 finally:
166 Py_DECREF(rv);
167 return NULL;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000168}
169
Barry Warsaw8496d391996-12-13 00:11:04 +0000170static PyObject *
Peter Schneider-Kamp3e3175b2000-07-10 17:25:37 +0000171sad_write(sadobject *self, PyObject *args)
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000172{
173 char *cp;
174 int count, size;
175
Barry Warsaw8496d391996-12-13 00:11:04 +0000176 if (!PyArg_Parse(args, "s#", &cp, &size))
177 return NULL;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000178
179 count = write(self->x_fd, cp, size);
Barry Warsaw8496d391996-12-13 00:11:04 +0000180 if (count < 0) {
181 PyErr_SetFromErrno(SunAudioError);
182 return NULL;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000183 }
Barry Warsaw8496d391996-12-13 00:11:04 +0000184#if 0
185 if (count != size)
186 printf("sunaudio: funny write rv %d wanted %d\n", count, size);
187#endif
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000188 self->x_ocount += count;
189
Barry Warsaw8496d391996-12-13 00:11:04 +0000190 Py_INCREF(Py_None);
191 return Py_None;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000192}
193
Barry Warsaw8496d391996-12-13 00:11:04 +0000194static PyObject *
Peter Schneider-Kamp3e3175b2000-07-10 17:25:37 +0000195sad_getinfo(sadobject *self, PyObject *args)
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000196{
197 sadstatusobject *rv;
198
Barry Warsaw8496d391996-12-13 00:11:04 +0000199 if (!PyArg_Parse(args, ""))
200 return NULL;
Barry Warsaw42185a21997-01-09 22:29:57 +0000201 if (!(rv = sads_alloc()))
202 return NULL;
203
Barry Warsaw8496d391996-12-13 00:11:04 +0000204 if (ioctl(self->x_fd, AUDIO_GETINFO, &rv->ai) < 0) {
205 PyErr_SetFromErrno(SunAudioError);
206 Py_DECREF(rv);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000207 return NULL;
208 }
Barry Warsaw8496d391996-12-13 00:11:04 +0000209 return (PyObject *)rv;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000210}
211
Barry Warsaw8496d391996-12-13 00:11:04 +0000212static PyObject *
Peter Schneider-Kamp3e3175b2000-07-10 17:25:37 +0000213sad_setinfo(sadobject *self, sadstatusobject *arg)
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000214{
Barry Warsaw8496d391996-12-13 00:11:04 +0000215 if (!is_sadstatusobject(arg)) {
216 PyErr_SetString(PyExc_TypeError,
217 "Must be sun audio status object");
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000218 return NULL;
219 }
Barry Warsaw8496d391996-12-13 00:11:04 +0000220 if (ioctl(self->x_fd, AUDIO_SETINFO, &arg->ai) < 0) {
221 PyErr_SetFromErrno(SunAudioError);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000222 return NULL;
223 }
Barry Warsaw8496d391996-12-13 00:11:04 +0000224 Py_INCREF(Py_None);
225 return Py_None;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000226}
227
Barry Warsaw8496d391996-12-13 00:11:04 +0000228static PyObject *
Peter Schneider-Kamp3e3175b2000-07-10 17:25:37 +0000229sad_ibufcount(sadobject *self, PyObject *args)
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000230{
Barry Warsaw8496d391996-12-13 00:11:04 +0000231 audio_info_t ai;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000232
Barry Warsaw8496d391996-12-13 00:11:04 +0000233 if (!PyArg_Parse(args, ""))
234 return NULL;
235 if (ioctl(self->x_fd, AUDIO_GETINFO, &ai) < 0) {
236 PyErr_SetFromErrno(SunAudioError);
237 return NULL;
238 }
239 return PyInt_FromLong(ai.record.samples - self->x_icount);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000240}
241
Barry Warsaw8496d391996-12-13 00:11:04 +0000242static PyObject *
Peter Schneider-Kamp3e3175b2000-07-10 17:25:37 +0000243sad_obufcount(sadobject *self, PyObject *args)
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000244{
Barry Warsaw8496d391996-12-13 00:11:04 +0000245 audio_info_t ai;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000246
Barry Warsaw8496d391996-12-13 00:11:04 +0000247 if (!PyArg_Parse(args, ""))
248 return NULL;
249 if (ioctl(self->x_fd, AUDIO_GETINFO, &ai) < 0) {
250 PyErr_SetFromErrno(SunAudioError);
251 return NULL;
252 }
Thomas Wouters7e474022000-07-16 12:04:32 +0000253 /* x_ocount is in bytes, whereas play.samples is in frames */
Guido van Rossum1e0b19e1997-04-11 15:23:52 +0000254 /* we want frames */
255 return PyInt_FromLong(self->x_ocount / (ai.play.channels *
256 ai.play.precision / 8) -
257 ai.play.samples);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000258}
259
Barry Warsaw8496d391996-12-13 00:11:04 +0000260static PyObject *
Peter Schneider-Kamp3e3175b2000-07-10 17:25:37 +0000261sad_drain(sadobject *self, PyObject *args)
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000262{
263
Barry Warsaw8496d391996-12-13 00:11:04 +0000264 if (!PyArg_Parse(args, ""))
265 return NULL;
266 if (ioctl(self->x_fd, AUDIO_DRAIN, 0) < 0) {
267 PyErr_SetFromErrno(SunAudioError);
268 return NULL;
269 }
270 Py_INCREF(Py_None);
271 return Py_None;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000272}
273
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000274#ifdef SOLARIS
Barry Warsaw8496d391996-12-13 00:11:04 +0000275static PyObject *
Peter Schneider-Kamp3e3175b2000-07-10 17:25:37 +0000276sad_getdev(sadobject *self, PyObject *args)
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000277{
Barry Warsaw8496d391996-12-13 00:11:04 +0000278 struct audio_device ad;
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000279
Barry Warsaw8496d391996-12-13 00:11:04 +0000280 if (!PyArg_Parse(args, ""))
281 return NULL;
282 if (ioctl(self->x_fd, AUDIO_GETDEV, &ad) < 0) {
283 PyErr_SetFromErrno(SunAudioError);
284 return NULL;
285 }
286 return Py_BuildValue("(sss)", ad.name, ad.version, ad.config);
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000287}
288#endif
289
Barry Warsaw8496d391996-12-13 00:11:04 +0000290static PyObject *
Peter Schneider-Kamp3e3175b2000-07-10 17:25:37 +0000291sad_flush(sadobject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000292{
293
Barry Warsaw8496d391996-12-13 00:11:04 +0000294 if (!PyArg_Parse(args, ""))
295 return NULL;
296 if (ioctl(self->x_fd, I_FLUSH, FLUSHW) < 0) {
297 PyErr_SetFromErrno(SunAudioError);
298 return NULL;
299 }
300 Py_INCREF(Py_None);
301 return Py_None;
Guido van Rossum234f9421993-06-17 12:35:49 +0000302}
303
Barry Warsaw8496d391996-12-13 00:11:04 +0000304static PyObject *
Peter Schneider-Kamp3e3175b2000-07-10 17:25:37 +0000305sad_close(sadobject *self, PyObject *args)
Guido van Rossum234f9421993-06-17 12:35:49 +0000306{
307
Barry Warsaw8496d391996-12-13 00:11:04 +0000308 if (!PyArg_Parse(args, ""))
309 return NULL;
310 if (self->x_fd >= 0) {
311 close(self->x_fd);
312 self->x_fd = -1;
313 }
314 Py_INCREF(Py_None);
315 return Py_None;
Guido van Rossum234f9421993-06-17 12:35:49 +0000316}
317
Barry Warsawb0d1b061998-10-31 22:52:54 +0000318static PyObject *
Peter Schneider-Kamp3e3175b2000-07-10 17:25:37 +0000319sad_fileno(sadobject *self, PyObject *args)
Barry Warsawb0d1b061998-10-31 22:52:54 +0000320{
321 if (!PyArg_Parse(args, ""))
322 return NULL;
323
324 return PyInt_FromLong(self->x_fd);
325}
326
327
Barry Warsaw8496d391996-12-13 00:11:04 +0000328static PyMethodDef sad_methods[] = {
329 { "read", (PyCFunction)sad_read },
330 { "write", (PyCFunction)sad_write },
331 { "ibufcount", (PyCFunction)sad_ibufcount },
332 { "obufcount", (PyCFunction)sad_obufcount },
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000333#define CTL_METHODS 4
Barry Warsaw8496d391996-12-13 00:11:04 +0000334 { "getinfo", (PyCFunction)sad_getinfo },
335 { "setinfo", (PyCFunction)sad_setinfo },
336 { "drain", (PyCFunction)sad_drain },
337 { "flush", (PyCFunction)sad_flush },
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000338#ifdef SOLARIS
Barry Warsaw8496d391996-12-13 00:11:04 +0000339 { "getdev", (PyCFunction)sad_getdev },
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000340#endif
Barry Warsaw8496d391996-12-13 00:11:04 +0000341 { "close", (PyCFunction)sad_close },
Barry Warsawb0d1b061998-10-31 22:52:54 +0000342 { "fileno", (PyCFunction)sad_fileno },
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000343 {NULL, NULL} /* sentinel */
344};
345
Barry Warsaw8496d391996-12-13 00:11:04 +0000346static PyObject *
Peter Schneider-Kamp3e3175b2000-07-10 17:25:37 +0000347sad_getattr(sadobject *xp, char *name)
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000348{
Barry Warsaw8496d391996-12-13 00:11:04 +0000349 if (xp->x_isctl)
350 return Py_FindMethod(sad_methods+CTL_METHODS,
351 (PyObject *)xp, name);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000352 else
Barry Warsaw8496d391996-12-13 00:11:04 +0000353 return Py_FindMethod(sad_methods, (PyObject *)xp, name);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000354}
355
356/* ----------------------------------------------------------------- */
357
358static sadstatusobject *
Thomas Wouters58d05102000-07-24 14:43:35 +0000359sads_alloc(void) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000360 return PyObject_New(sadstatusobject, &Sadstatustype);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000361}
362
363static void
Peter Schneider-Kamp3e3175b2000-07-10 17:25:37 +0000364sads_dealloc(sadstatusobject *xp)
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000365{
Barry Warsaw8496d391996-12-13 00:11:04 +0000366 PyMem_DEL(xp);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000367}
368
369#define OFF(x) offsetof(audio_info_t,x)
370static struct memberlist sads_ml[] = {
371 { "i_sample_rate", T_UINT, OFF(record.sample_rate) },
372 { "i_channels", T_UINT, OFF(record.channels) },
373 { "i_precision", T_UINT, OFF(record.precision) },
374 { "i_encoding", T_UINT, OFF(record.encoding) },
375 { "i_gain", T_UINT, OFF(record.gain) },
376 { "i_port", T_UINT, OFF(record.port) },
377 { "i_samples", T_UINT, OFF(record.samples) },
378 { "i_eof", T_UINT, OFF(record.eof) },
379 { "i_pause", T_UBYTE, OFF(record.pause) },
380 { "i_error", T_UBYTE, OFF(record.error) },
381 { "i_waiting", T_UBYTE, OFF(record.waiting) },
382 { "i_open", T_UBYTE, OFF(record.open) , RO},
383 { "i_active", T_UBYTE, OFF(record.active) , RO},
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000384#ifdef SOLARIS
385 { "i_buffer_size", T_UINT, OFF(record.buffer_size) },
386 { "i_balance", T_UBYTE, OFF(record.balance) },
387 { "i_avail_ports", T_UINT, OFF(record.avail_ports) },
388#endif
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000389
390 { "o_sample_rate", T_UINT, OFF(play.sample_rate) },
391 { "o_channels", T_UINT, OFF(play.channels) },
392 { "o_precision", T_UINT, OFF(play.precision) },
393 { "o_encoding", T_UINT, OFF(play.encoding) },
394 { "o_gain", T_UINT, OFF(play.gain) },
395 { "o_port", T_UINT, OFF(play.port) },
396 { "o_samples", T_UINT, OFF(play.samples) },
397 { "o_eof", T_UINT, OFF(play.eof) },
398 { "o_pause", T_UBYTE, OFF(play.pause) },
399 { "o_error", T_UBYTE, OFF(play.error) },
400 { "o_waiting", T_UBYTE, OFF(play.waiting) },
401 { "o_open", T_UBYTE, OFF(play.open) , RO},
402 { "o_active", T_UBYTE, OFF(play.active) , RO},
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000403#ifdef SOLARIS
404 { "o_buffer_size", T_UINT, OFF(play.buffer_size) },
405 { "o_balance", T_UBYTE, OFF(play.balance) },
406 { "o_avail_ports", T_UINT, OFF(play.avail_ports) },
407#endif
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000408
409 { "monitor_gain", T_UINT, OFF(monitor_gain) },
410 { NULL, 0, 0},
411};
412
Barry Warsaw8496d391996-12-13 00:11:04 +0000413static PyObject *
Peter Schneider-Kamp3e3175b2000-07-10 17:25:37 +0000414sads_getattr(sadstatusobject *xp, char *name)
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000415{
Barry Warsaw8496d391996-12-13 00:11:04 +0000416 return PyMember_Get((char *)&xp->ai, sads_ml, name);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000417}
418
419static int
Peter Schneider-Kamp3e3175b2000-07-10 17:25:37 +0000420sads_setattr(sadstatusobject *xp, char *name, PyObject *v)
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000421{
Guido van Rossum94472a01992-09-04 09:45:18 +0000422
423 if (v == NULL) {
Barry Warsaw8496d391996-12-13 00:11:04 +0000424 PyErr_SetString(PyExc_TypeError,
425 "can't delete sun audio status attributes");
Guido van Rossumf156f501996-09-11 23:31:23 +0000426 return -1;
Guido van Rossum94472a01992-09-04 09:45:18 +0000427 }
Barry Warsaw8496d391996-12-13 00:11:04 +0000428 return PyMember_Set((char *)&xp->ai, sads_ml, name, v);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000429}
430
431/* ------------------------------------------------------------------- */
432
433
Barry Warsaw8496d391996-12-13 00:11:04 +0000434static PyTypeObject Sadtype = {
435 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000436 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +0000437 "sunaudiodev.sun_audio_device", /*tp_name*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000438 sizeof(sadobject), /*tp_size*/
439 0, /*tp_itemsize*/
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000440 /* methods */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000441 (destructor)sad_dealloc, /*tp_dealloc*/
442 0, /*tp_print*/
443 (getattrfunc)sad_getattr, /*tp_getattr*/
444 0, /*tp_setattr*/
445 0, /*tp_compare*/
446 0, /*tp_repr*/
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000447};
448
Barry Warsaw8496d391996-12-13 00:11:04 +0000449static PyTypeObject Sadstatustype = {
450 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000451 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +0000452 "sunaudiodev.sun_audio_device_status", /*tp_name*/
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000453 sizeof(sadstatusobject), /*tp_size*/
454 0, /*tp_itemsize*/
455 /* methods */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000456 (destructor)sads_dealloc, /*tp_dealloc*/
457 0, /*tp_print*/
458 (getattrfunc)sads_getattr, /*tp_getattr*/
459 (setattrfunc)sads_setattr, /*tp_setattr*/
460 0, /*tp_compare*/
461 0, /*tp_repr*/
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000462};
463/* ------------------------------------------------------------------- */
464
Barry Warsaw8496d391996-12-13 00:11:04 +0000465static PyObject *
Peter Schneider-Kamp3e3175b2000-07-10 17:25:37 +0000466sadopen(PyObject *self, PyObject *args)
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000467{
Barry Warsaw8496d391996-12-13 00:11:04 +0000468 return (PyObject *)newsadobject(args);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000469}
470
Barry Warsaw8496d391996-12-13 00:11:04 +0000471static PyMethodDef sunaudiodev_methods[] = {
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000472 { "open", sadopen },
473 { 0, 0 },
474};
475
476void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000477initsunaudiodev(void)
Barry Warsaw8496d391996-12-13 00:11:04 +0000478{
479 PyObject *m, *d;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000480
Barry Warsaw8496d391996-12-13 00:11:04 +0000481 m = Py_InitModule("sunaudiodev", sunaudiodev_methods);
482 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +0000483 SunAudioError = PyErr_NewException("sunaudiodev.error", NULL, NULL);
Barry Warsaw42185a21997-01-09 22:29:57 +0000484 if (SunAudioError)
485 PyDict_SetItemString(d, "error", SunAudioError);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000486}