blob: b41ca8bb4b04e3537edcd32e858397de3848a92b [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 Rossumfd71b9e2000-06-30 23:50:40 +00007Copyright (c) 2000, BeOpen.com.
8Copyright (c) 1995-2000, Corporation for National Research Initiatives.
9Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
10All rights reserved.
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000011
Guido van Rossumfd71b9e2000-06-30 23:50:40 +000012See the file "Misc/COPYRIGHT" for information on usage and
13redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000014
15******************************************************************/
16
17/* Sad objects */
18
Barry Warsaw8496d391996-12-13 00:11:04 +000019#include "Python.h"
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000020#include "structmember.h"
21
Guido van Rossumb6775db1994-08-01 11:34:53 +000022#ifdef HAVE_SYS_AUDIOIO_H
23#define SOLARIS
24#endif
25
Guido van Rossume29ed8f1996-12-10 15:21:30 +000026#ifdef HAVE_UNISTD_H
27#include <unistd.h>
28#endif
29
30#ifdef HAVE_FCNTL_H
31#include <fcntl.h>
32#endif
33
Guido van Rossum234f9421993-06-17 12:35:49 +000034#include <stropts.h>
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000035#include <sys/ioctl.h>
Sjoerd Mullender66bca321993-12-03 16:54:45 +000036#ifdef SOLARIS
Guido van Rossumb6775db1994-08-01 11:34:53 +000037#include <sys/audioio.h>
Sjoerd Mullender66bca321993-12-03 16:54:45 +000038#else
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000039#include <sun/audioio.h>
Sjoerd Mullender66bca321993-12-03 16:54:45 +000040#endif
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000041
42/* #define offsetof(str,mem) ((int)(((str *)0)->mem)) */
43
44typedef struct {
Barry Warsaw8496d391996-12-13 00:11:04 +000045 PyObject_HEAD
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000046 int x_fd; /* The open file */
47 int x_icount; /* # samples read */
48 int x_ocount; /* # samples written */
49 int x_isctl; /* True if control device */
50
51} sadobject;
52
53typedef struct {
Barry Warsaw8496d391996-12-13 00:11:04 +000054 PyObject_HEAD
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000055 audio_info_t ai;
56} sadstatusobject;
57
Barry Warsaw8496d391996-12-13 00:11:04 +000058staticforward PyTypeObject Sadtype;
59staticforward PyTypeObject Sadstatustype;
Sjoerd Mullender66bca321993-12-03 16:54:45 +000060static sadstatusobject *sads_alloc(); /* Forward */
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000061
Barry Warsaw8496d391996-12-13 00:11:04 +000062static PyObject *SunAudioError;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000063
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000064#define is_sadobject(v) ((v)->ob_type == &Sadtype)
65#define is_sadstatusobject(v) ((v)->ob_type == &Sadstatustype)
66
Barry Warsawb0d1b061998-10-31 22:52:54 +000067
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000068static sadobject *
69newsadobject(arg)
Barry Warsaw8496d391996-12-13 00:11:04 +000070 PyObject *arg;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000071{
72 sadobject *xp;
73 int fd;
74 char *mode;
75 int imode;
Barry Warsawb0d1b061998-10-31 22:52:54 +000076 char* basedev;
77 char* ctldev;
78 char* opendev;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000079
80 /* Check arg for r/w/rw */
Barry Warsaw8496d391996-12-13 00:11:04 +000081 if (!PyArg_Parse(arg, "s", &mode))
82 return NULL;
83 if (strcmp(mode, "r") == 0)
84 imode = 0;
85 else if (strcmp(mode, "w") == 0)
86 imode = 1;
87 else if (strcmp(mode, "rw") == 0)
88 imode = 2;
89 else if (strcmp(mode, "control") == 0)
90 imode = -1;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000091 else {
Barry Warsaw8496d391996-12-13 00:11:04 +000092 PyErr_SetString(SunAudioError,
93 "Mode should be one of 'r', 'w', 'rw' or 'control'");
94 return NULL;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +000095 }
96
Barry Warsawb0d1b061998-10-31 22:52:54 +000097 /* Open the correct device. The base device name comes from the
98 * AUDIODEV environment variable first, then /dev/audio. The
99 * control device tacks "ctl" onto the base device name.
100 */
101 basedev = getenv("AUDIODEV");
102 if (!basedev)
103 basedev = "/dev/audio";
104 ctldev = PyMem_NEW(char, strlen(basedev) + 4);
105 if (!ctldev) {
106 PyErr_NoMemory();
Barry Warsaw8496d391996-12-13 00:11:04 +0000107 return NULL;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000108 }
Barry Warsawb0d1b061998-10-31 22:52:54 +0000109 strcpy(ctldev, basedev);
110 strcat(ctldev, "ctl");
111
112 if (imode < 0) {
113 opendev = ctldev;
114 fd = open(ctldev, 2);
115 }
116 else {
117 opendev = basedev;
118 fd = open(basedev, imode);
119 }
120 if (fd < 0) {
121 PyErr_SetFromErrnoWithFilename(SunAudioError, opendev);
122 return NULL;
123 }
124 PyMem_DEL(ctldev);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000125
126 /* Create and initialize the object */
Guido van Rossumb18618d2000-05-03 23:44:39 +0000127 xp = PyObject_New(sadobject, &Sadtype);
Barry Warsaw42185a21997-01-09 22:29:57 +0000128 if (xp == NULL) {
129 close(fd);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000130 return NULL;
Barry Warsaw42185a21997-01-09 22:29:57 +0000131 }
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000132 xp->x_fd = fd;
133 xp->x_icount = xp->x_ocount = 0;
134 xp->x_isctl = (imode < 0);
135
136 return xp;
137}
138
139/* Sad methods */
140
141static void
142sad_dealloc(xp)
143 sadobject *xp;
144{
145 close(xp->x_fd);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000146 PyObject_Del(xp);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000147}
148
Barry Warsaw8496d391996-12-13 00:11:04 +0000149static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000150sad_read(self, args)
151 sadobject *self;
Barry Warsaw8496d391996-12-13 00:11:04 +0000152 PyObject *args;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000153{
154 int size, count;
155 char *cp;
Barry Warsaw8496d391996-12-13 00:11:04 +0000156 PyObject *rv;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000157
Barry Warsaw8496d391996-12-13 00:11:04 +0000158 if (!PyArg_Parse(args, "i", &size))
159 return NULL;
160 rv = PyString_FromStringAndSize(NULL, size);
161 if (rv == NULL)
162 return NULL;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000163
Barry Warsaw8496d391996-12-13 00:11:04 +0000164 if (!(cp = PyString_AsString(rv)))
165 goto finally;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000166
167 count = read(self->x_fd, cp, size);
Barry Warsaw8496d391996-12-13 00:11:04 +0000168 if (count < 0) {
169 PyErr_SetFromErrno(SunAudioError);
170 goto finally;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000171 }
Barry Warsaw8496d391996-12-13 00:11:04 +0000172#if 0
173 /* TBD: why print this message if you can handle the condition?
Barry Warsaw42185a21997-01-09 22:29:57 +0000174 * assume it's debugging info which we can just as well get rid
175 * of. in any case this message should *not* be using printf!
176 */
Barry Warsaw8496d391996-12-13 00:11:04 +0000177 if (count != size)
178 printf("sunaudio: funny read rv %d wtd %d\n", count, size);
179#endif
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000180 self->x_icount += count;
181 return rv;
Barry Warsaw8496d391996-12-13 00:11:04 +0000182
183 finally:
184 Py_DECREF(rv);
185 return NULL;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000186}
187
Barry Warsaw8496d391996-12-13 00:11:04 +0000188static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000189sad_write(self, args)
190 sadobject *self;
Barry Warsaw8496d391996-12-13 00:11:04 +0000191 PyObject *args;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000192{
193 char *cp;
194 int count, size;
195
Barry Warsaw8496d391996-12-13 00:11:04 +0000196 if (!PyArg_Parse(args, "s#", &cp, &size))
197 return NULL;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000198
199 count = write(self->x_fd, cp, size);
Barry Warsaw8496d391996-12-13 00:11:04 +0000200 if (count < 0) {
201 PyErr_SetFromErrno(SunAudioError);
202 return NULL;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000203 }
Barry Warsaw8496d391996-12-13 00:11:04 +0000204#if 0
205 if (count != size)
206 printf("sunaudio: funny write rv %d wanted %d\n", count, size);
207#endif
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000208 self->x_ocount += count;
209
Barry Warsaw8496d391996-12-13 00:11:04 +0000210 Py_INCREF(Py_None);
211 return Py_None;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000212}
213
Barry Warsaw8496d391996-12-13 00:11:04 +0000214static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000215sad_getinfo(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000216 sadobject *self;
217 PyObject *args;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000218{
219 sadstatusobject *rv;
220
Barry Warsaw8496d391996-12-13 00:11:04 +0000221 if (!PyArg_Parse(args, ""))
222 return NULL;
Barry Warsaw42185a21997-01-09 22:29:57 +0000223 if (!(rv = sads_alloc()))
224 return NULL;
225
Barry Warsaw8496d391996-12-13 00:11:04 +0000226 if (ioctl(self->x_fd, AUDIO_GETINFO, &rv->ai) < 0) {
227 PyErr_SetFromErrno(SunAudioError);
228 Py_DECREF(rv);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000229 return NULL;
230 }
Barry Warsaw8496d391996-12-13 00:11:04 +0000231 return (PyObject *)rv;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000232}
233
Barry Warsaw8496d391996-12-13 00:11:04 +0000234static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000235sad_setinfo(self, arg)
Barry Warsaw8496d391996-12-13 00:11:04 +0000236 sadobject *self;
237 sadstatusobject *arg;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000238{
Barry Warsaw8496d391996-12-13 00:11:04 +0000239 if (!is_sadstatusobject(arg)) {
240 PyErr_SetString(PyExc_TypeError,
241 "Must be sun audio status object");
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000242 return NULL;
243 }
Barry Warsaw8496d391996-12-13 00:11:04 +0000244 if (ioctl(self->x_fd, AUDIO_SETINFO, &arg->ai) < 0) {
245 PyErr_SetFromErrno(SunAudioError);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000246 return NULL;
247 }
Barry Warsaw8496d391996-12-13 00:11:04 +0000248 Py_INCREF(Py_None);
249 return Py_None;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000250}
251
Barry Warsaw8496d391996-12-13 00:11:04 +0000252static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000253sad_ibufcount(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000254 sadobject *self;
255 PyObject *args;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000256{
Barry Warsaw8496d391996-12-13 00:11:04 +0000257 audio_info_t ai;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000258
Barry Warsaw8496d391996-12-13 00:11:04 +0000259 if (!PyArg_Parse(args, ""))
260 return NULL;
261 if (ioctl(self->x_fd, AUDIO_GETINFO, &ai) < 0) {
262 PyErr_SetFromErrno(SunAudioError);
263 return NULL;
264 }
265 return PyInt_FromLong(ai.record.samples - self->x_icount);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000266}
267
Barry Warsaw8496d391996-12-13 00:11:04 +0000268static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000269sad_obufcount(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000270 sadobject *self;
271 PyObject *args;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000272{
Barry Warsaw8496d391996-12-13 00:11:04 +0000273 audio_info_t ai;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000274
Barry Warsaw8496d391996-12-13 00:11:04 +0000275 if (!PyArg_Parse(args, ""))
276 return NULL;
277 if (ioctl(self->x_fd, AUDIO_GETINFO, &ai) < 0) {
278 PyErr_SetFromErrno(SunAudioError);
279 return NULL;
280 }
Guido van Rossum1e0b19e1997-04-11 15:23:52 +0000281 /* x_ocount is in bytes, wheras play.samples is in frames */
282 /* we want frames */
283 return PyInt_FromLong(self->x_ocount / (ai.play.channels *
284 ai.play.precision / 8) -
285 ai.play.samples);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000286}
287
Barry Warsaw8496d391996-12-13 00:11:04 +0000288static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000289sad_drain(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000290 sadobject *self;
291 PyObject *args;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000292{
293
Barry Warsaw8496d391996-12-13 00:11:04 +0000294 if (!PyArg_Parse(args, ""))
295 return NULL;
296 if (ioctl(self->x_fd, AUDIO_DRAIN, 0) < 0) {
297 PyErr_SetFromErrno(SunAudioError);
298 return NULL;
299 }
300 Py_INCREF(Py_None);
301 return Py_None;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000302}
303
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000304#ifdef SOLARIS
Barry Warsaw8496d391996-12-13 00:11:04 +0000305static PyObject *
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000306sad_getdev(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000307 sadobject *self;
308 PyObject *args;
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000309{
Barry Warsaw8496d391996-12-13 00:11:04 +0000310 struct audio_device ad;
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000311
Barry Warsaw8496d391996-12-13 00:11:04 +0000312 if (!PyArg_Parse(args, ""))
313 return NULL;
314 if (ioctl(self->x_fd, AUDIO_GETDEV, &ad) < 0) {
315 PyErr_SetFromErrno(SunAudioError);
316 return NULL;
317 }
318 return Py_BuildValue("(sss)", ad.name, ad.version, ad.config);
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000319}
320#endif
321
Barry Warsaw8496d391996-12-13 00:11:04 +0000322static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000323sad_flush(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000324 sadobject *self;
325 PyObject *args;
Guido van Rossum234f9421993-06-17 12:35:49 +0000326{
327
Barry Warsaw8496d391996-12-13 00:11:04 +0000328 if (!PyArg_Parse(args, ""))
329 return NULL;
330 if (ioctl(self->x_fd, I_FLUSH, FLUSHW) < 0) {
331 PyErr_SetFromErrno(SunAudioError);
332 return NULL;
333 }
334 Py_INCREF(Py_None);
335 return Py_None;
Guido van Rossum234f9421993-06-17 12:35:49 +0000336}
337
Barry Warsaw8496d391996-12-13 00:11:04 +0000338static PyObject *
Guido van Rossum234f9421993-06-17 12:35:49 +0000339sad_close(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000340 sadobject *self;
341 PyObject *args;
Guido van Rossum234f9421993-06-17 12:35:49 +0000342{
343
Barry Warsaw8496d391996-12-13 00:11:04 +0000344 if (!PyArg_Parse(args, ""))
345 return NULL;
346 if (self->x_fd >= 0) {
347 close(self->x_fd);
348 self->x_fd = -1;
349 }
350 Py_INCREF(Py_None);
351 return Py_None;
Guido van Rossum234f9421993-06-17 12:35:49 +0000352}
353
Barry Warsawb0d1b061998-10-31 22:52:54 +0000354static PyObject *
355sad_fileno(self, args)
356 sadobject *self;
357 PyObject *args;
358{
359 if (!PyArg_Parse(args, ""))
360 return NULL;
361
362 return PyInt_FromLong(self->x_fd);
363}
364
365
Barry Warsaw8496d391996-12-13 00:11:04 +0000366static PyMethodDef sad_methods[] = {
367 { "read", (PyCFunction)sad_read },
368 { "write", (PyCFunction)sad_write },
369 { "ibufcount", (PyCFunction)sad_ibufcount },
370 { "obufcount", (PyCFunction)sad_obufcount },
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000371#define CTL_METHODS 4
Barry Warsaw8496d391996-12-13 00:11:04 +0000372 { "getinfo", (PyCFunction)sad_getinfo },
373 { "setinfo", (PyCFunction)sad_setinfo },
374 { "drain", (PyCFunction)sad_drain },
375 { "flush", (PyCFunction)sad_flush },
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000376#ifdef SOLARIS
Barry Warsaw8496d391996-12-13 00:11:04 +0000377 { "getdev", (PyCFunction)sad_getdev },
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000378#endif
Barry Warsaw8496d391996-12-13 00:11:04 +0000379 { "close", (PyCFunction)sad_close },
Barry Warsawb0d1b061998-10-31 22:52:54 +0000380 { "fileno", (PyCFunction)sad_fileno },
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000381 {NULL, NULL} /* sentinel */
382};
383
Barry Warsaw8496d391996-12-13 00:11:04 +0000384static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000385sad_getattr(xp, name)
386 sadobject *xp;
387 char *name;
388{
Barry Warsaw8496d391996-12-13 00:11:04 +0000389 if (xp->x_isctl)
390 return Py_FindMethod(sad_methods+CTL_METHODS,
391 (PyObject *)xp, name);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000392 else
Barry Warsaw8496d391996-12-13 00:11:04 +0000393 return Py_FindMethod(sad_methods, (PyObject *)xp, name);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000394}
395
396/* ----------------------------------------------------------------- */
397
398static sadstatusobject *
399sads_alloc() {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000400 return PyObject_New(sadstatusobject, &Sadstatustype);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000401}
402
403static void
404sads_dealloc(xp)
Barry Warsaw8496d391996-12-13 00:11:04 +0000405 sadstatusobject *xp;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000406{
Barry Warsaw8496d391996-12-13 00:11:04 +0000407 PyMem_DEL(xp);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000408}
409
410#define OFF(x) offsetof(audio_info_t,x)
411static struct memberlist sads_ml[] = {
412 { "i_sample_rate", T_UINT, OFF(record.sample_rate) },
413 { "i_channels", T_UINT, OFF(record.channels) },
414 { "i_precision", T_UINT, OFF(record.precision) },
415 { "i_encoding", T_UINT, OFF(record.encoding) },
416 { "i_gain", T_UINT, OFF(record.gain) },
417 { "i_port", T_UINT, OFF(record.port) },
418 { "i_samples", T_UINT, OFF(record.samples) },
419 { "i_eof", T_UINT, OFF(record.eof) },
420 { "i_pause", T_UBYTE, OFF(record.pause) },
421 { "i_error", T_UBYTE, OFF(record.error) },
422 { "i_waiting", T_UBYTE, OFF(record.waiting) },
423 { "i_open", T_UBYTE, OFF(record.open) , RO},
424 { "i_active", T_UBYTE, OFF(record.active) , RO},
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000425#ifdef SOLARIS
426 { "i_buffer_size", T_UINT, OFF(record.buffer_size) },
427 { "i_balance", T_UBYTE, OFF(record.balance) },
428 { "i_avail_ports", T_UINT, OFF(record.avail_ports) },
429#endif
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000430
431 { "o_sample_rate", T_UINT, OFF(play.sample_rate) },
432 { "o_channels", T_UINT, OFF(play.channels) },
433 { "o_precision", T_UINT, OFF(play.precision) },
434 { "o_encoding", T_UINT, OFF(play.encoding) },
435 { "o_gain", T_UINT, OFF(play.gain) },
436 { "o_port", T_UINT, OFF(play.port) },
437 { "o_samples", T_UINT, OFF(play.samples) },
438 { "o_eof", T_UINT, OFF(play.eof) },
439 { "o_pause", T_UBYTE, OFF(play.pause) },
440 { "o_error", T_UBYTE, OFF(play.error) },
441 { "o_waiting", T_UBYTE, OFF(play.waiting) },
442 { "o_open", T_UBYTE, OFF(play.open) , RO},
443 { "o_active", T_UBYTE, OFF(play.active) , RO},
Sjoerd Mullender66bca321993-12-03 16:54:45 +0000444#ifdef SOLARIS
445 { "o_buffer_size", T_UINT, OFF(play.buffer_size) },
446 { "o_balance", T_UBYTE, OFF(play.balance) },
447 { "o_avail_ports", T_UINT, OFF(play.avail_ports) },
448#endif
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000449
450 { "monitor_gain", T_UINT, OFF(monitor_gain) },
451 { NULL, 0, 0},
452};
453
Barry Warsaw8496d391996-12-13 00:11:04 +0000454static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000455sads_getattr(xp, name)
Barry Warsaw8496d391996-12-13 00:11:04 +0000456 sadstatusobject *xp;
457 char *name;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000458{
Barry Warsaw8496d391996-12-13 00:11:04 +0000459 return PyMember_Get((char *)&xp->ai, sads_ml, name);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000460}
461
462static int
463sads_setattr(xp, name, v)
Barry Warsaw8496d391996-12-13 00:11:04 +0000464 sadstatusobject *xp;
465 char *name;
466 PyObject *v;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000467{
Guido van Rossum94472a01992-09-04 09:45:18 +0000468
469 if (v == NULL) {
Barry Warsaw8496d391996-12-13 00:11:04 +0000470 PyErr_SetString(PyExc_TypeError,
471 "can't delete sun audio status attributes");
Guido van Rossumf156f501996-09-11 23:31:23 +0000472 return -1;
Guido van Rossum94472a01992-09-04 09:45:18 +0000473 }
Barry Warsaw8496d391996-12-13 00:11:04 +0000474 return PyMember_Set((char *)&xp->ai, sads_ml, name, v);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000475}
476
477/* ------------------------------------------------------------------- */
478
479
Barry Warsaw8496d391996-12-13 00:11:04 +0000480static PyTypeObject Sadtype = {
481 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000482 0, /*ob_size*/
483 "sun_audio_device", /*tp_name*/
484 sizeof(sadobject), /*tp_size*/
485 0, /*tp_itemsize*/
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000486 /* methods */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000487 (destructor)sad_dealloc, /*tp_dealloc*/
488 0, /*tp_print*/
489 (getattrfunc)sad_getattr, /*tp_getattr*/
490 0, /*tp_setattr*/
491 0, /*tp_compare*/
492 0, /*tp_repr*/
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000493};
494
Barry Warsaw8496d391996-12-13 00:11:04 +0000495static PyTypeObject Sadstatustype = {
496 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000497 0, /*ob_size*/
498 "sun_audio_device_status", /*tp_name*/
499 sizeof(sadstatusobject), /*tp_size*/
500 0, /*tp_itemsize*/
501 /* methods */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000502 (destructor)sads_dealloc, /*tp_dealloc*/
503 0, /*tp_print*/
504 (getattrfunc)sads_getattr, /*tp_getattr*/
505 (setattrfunc)sads_setattr, /*tp_setattr*/
506 0, /*tp_compare*/
507 0, /*tp_repr*/
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000508};
509/* ------------------------------------------------------------------- */
510
Barry Warsaw8496d391996-12-13 00:11:04 +0000511static PyObject *
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000512sadopen(self, args)
Barry Warsaw8496d391996-12-13 00:11:04 +0000513 PyObject *self;
514 PyObject *args;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000515{
Barry Warsaw8496d391996-12-13 00:11:04 +0000516 return (PyObject *)newsadobject(args);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000517}
518
Barry Warsaw8496d391996-12-13 00:11:04 +0000519static PyMethodDef sunaudiodev_methods[] = {
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000520 { "open", sadopen },
521 { 0, 0 },
522};
523
524void
Barry Warsaw8496d391996-12-13 00:11:04 +0000525initsunaudiodev()
526{
527 PyObject *m, *d;
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000528
Barry Warsaw8496d391996-12-13 00:11:04 +0000529 m = Py_InitModule("sunaudiodev", sunaudiodev_methods);
530 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +0000531 SunAudioError = PyErr_NewException("sunaudiodev.error", NULL, NULL);
Barry Warsaw42185a21997-01-09 22:29:57 +0000532 if (SunAudioError)
533 PyDict_SetItemString(d, "error", SunAudioError);
Guido van Rossum9c52e0f1992-06-03 17:06:14 +0000534}