[PD-cvs] pd/src s_audio_asio.cpp,1.1.4.5,1.1.4.6

Thomas Grill xovo at users.sourceforge.net
Mon Nov 8 14:23:50 CET 2004


Update of /cvsroot/pure-data/pd/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7175/src

Modified Files:
      Tag: devel_0_38
	s_audio_asio.cpp 
Log Message:
measures for handling hanging drivers

Index: s_audio_asio.cpp
===================================================================
RCS file: /cvsroot/pure-data/pd/src/Attic/s_audio_asio.cpp,v
retrieving revision 1.1.4.5
retrieving revision 1.1.4.6
diff -C2 -d -r1.1.4.5 -r1.1.4.6
*** s_audio_asio.cpp	7 Nov 2004 17:01:34 -0000	1.1.4.5
--- s_audio_asio.cpp	8 Nov 2004 13:23:47 -0000	1.1.4.6
***************
*** 32,35 ****
--- 32,38 ----
  #include "stdio.h" /* for sprintf */
  
+ #include <time.h>
+ #include <sys/timeb.h>
+ 
  #include "assert.h"
  #define ASSERT assert
***************
*** 43,46 ****
--- 46,52 ----
  #include "math.h"
  
+ // seconds to wait for driver to respond
+ #define DRIVERWAIT 3 
+ 
  #ifdef PD_DEBUG
  #define ASIODEBUG
***************
*** 396,439 ****
  void asio_close_audio(void)
  {
! 	ASIOError status;
! 	int channels = sys_inchannels + sys_outchannels;
! 	int i;
! 
! 	pthread_cond_broadcast(&asio_ringbuf_cond);
  
!     if(asio_useoutputready) 
!     {
!         // the DMA buffers would be played past ASIOStop
!         // -> clear output buffers and notify driver
! #if 0
!         // slow, blocking method
! 	    for(i = 0; i != sys_outchannels; ++i)
! 		    zerovec_simd(asio_ringbuffer[i], asio_ringbuffer_length);
!         // wait for bufferswitch to process silence (twice)
! 	    pthread_cond_wait(&asio_ringbuf_cond, &asio_ringbuf_mutex);  
! 	    for(i = 0; i != sys_outchannels; ++i)
! 		    memset(asio_ringbuffer[i], 0, asio_ringbuffer_length * sizeof (t_sample));
! 	    pthread_cond_wait(&asio_ringbuf_cond, &asio_ringbuf_mutex);  
! #else
!         // direct method - clear both hardware buffers
!         for(i = 0; i < sys_outchannels; ++i) {
!             long bytes = asio_bufsize*asio_out_samplewidth[i];
! 	        memset(asio_bufferinfo[i].buffers[0],0,bytes);
! 	        memset(asio_bufferinfo[i].buffers[1],0,bytes);
!         }
!         // notify driver
! 		ASIOOutputReady();
! #endif
!     }
  
! 	post("ASIO: close");
  
! 	status = ASIOStop();
!     ASSERT(status == ASE_OK);
  
- 	if (asio_driver)
- 	{
- 		ASIOStop();
- 		
  		for (i = 0; i != channels; i++)
  			freealignedbytes(asio_ringbuffer[i], 
--- 402,443 ----
  void asio_close_audio(void)
  {
! 	if (asio_driver)
! 	{
!     	post("ASIO: close");
  
!     	pthread_cond_broadcast(&asio_ringbuf_cond);
  
! 	    ASIOError status;
! 	    int channels = sys_inchannels + sys_outchannels;
! 	    int i;
  
!         if(asio_useoutputready) 
!         {
!             // the DMA buffers would be played past ASIOStop
!             // -> clear output buffers and notify driver
!     #if 0
!             // slow, blocking method
! 	        for(i = 0; i != sys_outchannels; ++i)
! 		        zerovec_simd(asio_ringbuffer[i], asio_ringbuffer_length);
!             // wait for bufferswitch to process silence (twice)
! 	        pthread_cond_wait(&asio_ringbuf_cond, &asio_ringbuf_mutex);  
! 	        for(i = 0; i != sys_outchannels; ++i)
! 		        memset(asio_ringbuffer[i], 0, asio_ringbuffer_length * sizeof (t_sample));
! 	        pthread_cond_wait(&asio_ringbuf_cond, &asio_ringbuf_mutex);  
!     #else
!             // direct method - clear both hardware buffers
!             for(i = 0; i < sys_outchannels; ++i) {
!                 long bytes = asio_bufsize*asio_out_samplewidth[i];
! 	            memset(asio_bufferinfo[i].buffers[0],0,bytes);
! 	            memset(asio_bufferinfo[i].buffers[1],0,bytes);
!             }
!             // notify driver
! 		    ASIOOutputReady();
!     #endif
!         }
!         
! 	    status = ASIOStop();
!         ASSERT(status == ASE_OK);
  
  		for (i = 0; i != channels; i++)
  			freealignedbytes(asio_ringbuffer[i], 
***************
*** 503,507 ****
  	if (!asio_driver)
  	{
! 		error("ASIO not running");
  		return SENDDACS_NO;
  	}
--- 507,513 ----
  	if (!asio_driver)
  	{
!         static int written = 0;
! 		if(written%100 == 0) error("ASIO not running");
!         written++;
  		return SENDDACS_NO;
  	}
***************
*** 541,545 ****
  	if (asio_ringbuffer_inoffset >= asio_ringbuffer_outoffset + asio_bufsize)
  	{
! 		pthread_cond_wait(&asio_ringbuf_cond, &asio_ringbuf_mutex);
  		if (asio_ringbuffer_inoffset == asio_ringbuffer_length)
  		{
--- 547,562 ----
  	if (asio_ringbuffer_inoffset >= asio_ringbuffer_outoffset + asio_bufsize)
  	{
!         struct timespec tm;
! 	    _timeb tmb;
! 	    _ftime(&tmb);
! 	    tm.tv_nsec = tmb.millitm*1000000;
! 	    tm.tv_sec = tmb.time+DRIVERWAIT; // delay
!         if(pthread_cond_timedwait(&asio_ringbuf_cond, &asio_ringbuf_mutex, &tm) == ETIMEDOUT) 
!         {
!             error("ASIO: ASIO driver non-responsive! - closing");
!             asio_close_audio();
!     		return SENDDACS_SLEPT;
!         }
! 
  		if (asio_ringbuffer_inoffset == asio_ringbuffer_length)
  		{
***************
*** 619,624 ****
  	long i, j;	
  
- 
- 
  	// todo: store the timeInfo for later use
  
--- 636,639 ----





More information about the Pd-cvs mailing list