Index: linuxaudiodev.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Modules/linuxaudiodev.c,v retrieving revision 2.13 diff -c -c -r2.13 linuxaudiodev.c *** linuxaudiodev.c 2001/01/17 19:31:29 2.13 --- linuxaudiodev.c 2001/03/31 14:41:33 *************** *** 174,191 **** { char *cp; int rv, size; ! if (!PyArg_ParseTuple(args, "s#:write", &cp, &size)) return NULL; while (size > 0) { if ((rv = write(self->x_fd, cp, size)) == -1) { ! PyErr_SetFromErrno(LinuxAudioError); ! return NULL; ! } ! self->x_ocount += rv; ! size -= rv; ! cp += rv; } Py_INCREF(Py_None); return Py_None; --- 174,213 ---- { 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) { ! 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;