From f5bd6843377a4f4433700282f5c4bddb3d6333ae Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 2 Apr 2001 17:59:02 +0000 Subject: [PATCH] Applying SF patch #412553 by Christopher Lee: fix linuxaudiodev handling of EAGAIN. This may or may not fix the problem for me (Mandrake 7.2 on a Dell Optiplex GX110 desktop): I can't hear the output, but it does pass the test now. It doesn't fix the problem for Fred (Mandrake 7.2 on a Dell Inspiron 7500 which has the Maestro sound drivers). Fred suspects that it's the kernel version in combination with the driver. --- Modules/linuxaudiodev.c | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/Modules/linuxaudiodev.c b/Modules/linuxaudiodev.c index a0661c5ac7f..37ad5ff4c61 100644 --- a/Modules/linuxaudiodev.c +++ b/Modules/linuxaudiodev.c @@ -4,8 +4,6 @@ * * Author : Peter Bosch * Created On : Thu Mar 2 21:10:33 2000 - * Last Modified By: Peter Bosch - * Last Modified On: Fri Mar 24 11:27:00 2000 * Status : Unknown, Use with caution! * * Unless other notices are present in any part of this file @@ -174,18 +172,40 @@ lad_write(lad_t *self, PyObject *args) { char *cp; int rv, size; - + fd_set write_set_fds; + struct timeval tv; + int select_retval; + if (!PyArg_ParseTuple(args, "s#:write", &cp, &size)) return NULL; + /* use select to wait for audio device to be available */ + FD_ZERO(&write_set_fds); + FD_SET(self->x_fd, &write_set_fds); + tv.tv_sec = 4; /* timeout values */ + tv.tv_usec = 0; + while (size > 0) { + select_retval = select(self->x_fd+1, NULL, &write_set_fds, NULL, &tv); + tv.tv_sec = 1; tv.tv_usec = 0; /* willing to wait this long next time*/ + if (select_retval) { if ((rv = write(self->x_fd, cp, size)) == -1) { - PyErr_SetFromErrno(LinuxAudioError); - return NULL; - } - self->x_ocount += rv; - size -= rv; - cp += rv; + if (errno != EAGAIN) { + PyErr_SetFromErrno(LinuxAudioError); + return NULL; + } else { + errno = 0; /* EAGAIN: buffer is full, try again */ + } + } else { + self->x_ocount += rv; + size -= rv; + cp += rv; + } + } else { + /* printf("Not able to write to linux audio device within %ld seconds\n", tv.tv_sec); */ + PyErr_SetFromErrno(LinuxAudioError); + return NULL; + } } Py_INCREF(Py_None); return Py_None;