mirror of
https://github.com/python/cpython.git
synced 2024-11-23 18:04:37 +08:00
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.
This commit is contained in:
parent
cb67ea1d6e
commit
f5bd684337
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user