summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBarry Warsaw <barry@python.org>1998-10-31 22:52:54 (GMT)
committerBarry Warsaw <barry@python.org>1998-10-31 22:52:54 (GMT)
commitb0d1b068d92f405cea053a199ae259260ff151d0 (patch)
treed3c0b21dc7c7483463dea649b9f23c63a0158c97
parent2c8b35bdd25b0946d4ea35e74a1e20ccd4679325 (diff)
downloadcpython-b0d1b068d92f405cea053a199ae259260ff151d0.zip
cpython-b0d1b068d92f405cea053a199ae259260ff151d0.tar.gz
cpython-b0d1b068d92f405cea053a199ae259260ff151d0.tar.bz2
audio(7I) suggests that applications do the following to get the
device and control pseudo-device: - first look for the device filename in the environment variable AUDIODEV. - if not found, use /dev/audio - calculate the control device by tacking "ctl" onto the base device name. We now do this. Also, if the open fails, we call PyErr_SetFromErrnoWithFilename() to give a more informative error message. Added a fileno() method to the audio object returned from open(). This returns the file descriptor which can be used by applications to set up SIGPOLL notification, as per the manpage.
-rw-r--r--Modules/sunaudiodev.c49
1 files changed, 42 insertions, 7 deletions
diff --git a/Modules/sunaudiodev.c b/Modules/sunaudiodev.c
index d0edea6..71c152e 100644
--- a/Modules/sunaudiodev.c
+++ b/Modules/sunaudiodev.c
@@ -79,6 +79,7 @@ static PyObject *SunAudioError;
#define is_sadobject(v) ((v)->ob_type == &Sadtype)
#define is_sadstatusobject(v) ((v)->ob_type == &Sadstatustype)
+
static sadobject *
newsadobject(arg)
PyObject *arg;
@@ -87,6 +88,9 @@ newsadobject(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))
@@ -105,16 +109,34 @@ newsadobject(arg)
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);
@@ -344,6 +366,18 @@ sad_close(self, args)
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 },
@@ -358,6 +392,7 @@ static PyMethodDef sad_methods[] = {
{ "getdev", (PyCFunction)sad_getdev },
#endif
{ "close", (PyCFunction)sad_close },
+ { "fileno", (PyCFunction)sad_fileno },
{NULL, NULL} /* sentinel */
};