diff options
Diffstat (limited to 'Modules/linuxaudiodev.c')
-rw-r--r-- | Modules/linuxaudiodev.c | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/Modules/linuxaudiodev.c b/Modules/linuxaudiodev.c index a0661c5..37ad5ff 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; |