#define is_sadobject(v) ((v)->ob_type == &Sadtype)
#define is_sadstatusobject(v) ((v)->ob_type == &Sadstatustype)
+
static sadobject *
newsadobject(arg)
PyObject *arg;
int fd;
char *mode;
int imode;
+ char* basedev;
+ char* ctldev;
+ char* opendev;
/* Check arg for r/w/rw */
if (!PyArg_Parse(arg, "s", &mode))
return NULL;
}
- /* Open the correct device */
- if (imode < 0)
- /* XXXX Check that this works */
- fd = open("/dev/audioctl", 2);
- else
- fd = open("/dev/audio", imode);
+ /* Open the correct device. The base device name comes from the
+ * AUDIODEV environment variable first, then /dev/audio. The
+ * control device tacks "ctl" onto the base device name.
+ */
+ basedev = getenv("AUDIODEV");
+ if (!basedev)
+ basedev = "/dev/audio";
+ ctldev = PyMem_NEW(char, strlen(basedev) + 4);
+ if (!ctldev) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+ strcpy(ctldev, basedev);
+ strcat(ctldev, "ctl");
+
+ if (imode < 0) {
+ opendev = ctldev;
+ fd = open(ctldev, 2);
+ }
+ else {
+ opendev = basedev;
+ fd = open(basedev, imode);
+ }
if (fd < 0) {
- PyErr_SetFromErrno(SunAudioError);
+ PyErr_SetFromErrnoWithFilename(SunAudioError, opendev);
return NULL;
}
+ PyMem_DEL(ctldev);
/* Create and initialize the object */
xp = PyObject_NEW(sadobject, &Sadtype);
return Py_None;
}
+static PyObject *
+sad_fileno(self, args)
+ sadobject *self;
+ PyObject *args;
+{
+ if (!PyArg_Parse(args, ""))
+ return NULL;
+
+ return PyInt_FromLong(self->x_fd);
+}
+
+
static PyMethodDef sad_methods[] = {
{ "read", (PyCFunction)sad_read },
{ "write", (PyCFunction)sad_write },
{ "getdev", (PyCFunction)sad_getdev },
#endif
{ "close", (PyCFunction)sad_close },
+ { "fileno", (PyCFunction)sad_fileno },
{NULL, NULL} /* sentinel */
};