[Python-checkins] CVS: python/dist/src/Modules linuxaudiodev.c,2.13,2.14

Guido van Rossum gvanrossum@users.sourceforge.net
Mon, 02 Apr 2001 10:59:04 -0700


Update of /cvsroot/python/python/dist/src/Modules
In directory usw-pr-cvs1:/tmp/cvs-serv13825

Modified Files:
	linuxaudiodev.c 
Log Message:
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.


Index: linuxaudiodev.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/linuxaudiodev.c,v
retrieving revision 2.13
retrieving revision 2.14
diff -C2 -r2.13 -r2.14
*** linuxaudiodev.c	2001/01/17 19:31:29	2.13
--- linuxaudiodev.c	2001/04/02 17:59:02	2.14
***************
*** 5,10 ****
   * 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!
   * 
--- 5,8 ----
***************
*** 175,190 ****
      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);
--- 173,210 ----
      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);