[PD-cvs] pd/src s_audio_asio.cpp,1.1.4.11,1.1.4.12

Tim Blechmann timblech at users.sourceforge.net
Thu Nov 18 10:19:51 CET 2004


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

Modified Files:
      Tag: devel_0_38
	s_audio_asio.cpp 
Log Message:
dithering and (hopefully) reduced latency

Index: s_audio_asio.cpp
===================================================================
RCS file: /cvsroot/pure-data/pd/src/Attic/s_audio_asio.cpp,v
retrieving revision 1.1.4.11
retrieving revision 1.1.4.12
diff -C2 -d -r1.1.4.11 -r1.1.4.12
*** s_audio_asio.cpp	10 Nov 2004 22:37:31 -0000	1.1.4.11
--- s_audio_asio.cpp	18 Nov 2004 09:19:48 -0000	1.1.4.12
***************
*** 3,7 ****
   * WARRANTIES, see the file, "LICENSE.txt" in this distribution.  */
  
! /* native ASIO interface for windows and mac osx 
   * adapted from hostsample.cpp (ASIO SDK)
   */
--- 3,7 ----
   * WARRANTIES, see the file, "LICENSE.txt" in this distribution.  */
  
! /* native ASIO interface for windows
   * adapted from hostsample.cpp (ASIO SDK)
   */
***************
*** 397,400 ****
--- 397,401 ----
  
  bailout:
+ 	if(status) post("error: %s", asio_driver->errorMessage);
      post("ASIO: couldn't start");
      asio_close_audio();
***************
*** 550,555 ****
  	{
  		/* clipping here, we are sure, we can use simd instructions */
! 		t_int lo = -1;
! 		t_int hi = 1;
  		t_int clipargs[6];
  		clipargs[1] = (t_int)sp;
--- 551,556 ----
  	{
  		/* clipping here, we are sure, we can use simd instructions */
! 		t_float lo = -1.f;
! 		t_float hi = 1.f;
  		t_int clipargs[6];
  		clipargs[1] = (t_int)sp;
***************
*** 560,563 ****
--- 561,565 ----
  		
  		clipblock(clipargs);
+ 
         	zeroblock(sp);
          sp+=sys_dacblocksize;
***************
*** 569,581 ****
   	{
  		/* we should be able to read from the ringbuffer on a different position
! 		 * to reduce latency for asio buffer sizes that aren't multiples of 64...
! 		 * rethink this: */
! #if 0
!  		int offset = 2 * asio_bufsize;
!  		if (asio_ringbuffer_inoffset <=  offset )
! 			copyblock(sp, asio_ringbuffer[i+j] + asio_ringbuffer_length +
!  				   asio_ringbuffer_inoffset - offset);
!  		else
!  			copyblock(sp, asio_ringbuffer[i+j] + asio_ringbuffer_inoffset - offset);
  #else /* working but higher latency */
  		copyblock(sp, asio_ringbuffer[i+j] + asio_ringbuffer_inoffset);
--- 571,586 ----
   	{
  		/* we should be able to read from the ringbuffer on a different position
! 		 * to reduce latency for asio buffer sizes that aren't multiples of 64... */
! #if 1
! 		int offset = asio_bufsize + DEFDACBLKSIZE;
! 		offset += DEFDACBLKSIZE - offset % DEFDACBLKSIZE;
! 
!    		if (asio_ringbuffer_inoffset < offset)
! 		{
!  			memcpy(sp, asio_ringbuffer[i+j] + asio_ringbuffer_length +
!  				   asio_ringbuffer_inoffset - offset, 64 *sizeof(t_sample));
! 		}
!    		else
!  			memcpy(sp, asio_ringbuffer[i+j] + asio_ringbuffer_inoffset - offset, 64*sizeof(t_sample));
  #else /* working but higher latency */
  		copyblock(sp, asio_ringbuffer[i+j] + asio_ringbuffer_inoffset);
***************
*** 691,723 ****
  	long i, j;	
  
- 	// todo: store the timeInfo for later use
- 
- 
  	/* todo: i'm not sure if we'll have to synchronize with other media ...
  	 * probably yes ... */
  		
! 	/* 	sys_reftime = get_sys_reference_time(); */
  
! 	/* perform the processing 
! 	 * todo: improve input latency
! 	 */
  
  	for (i = 0; i < sys_outchannels + sys_inchannels; i++)
  	{
          if(asio_converter[i])
! 		if (asio_bufferinfo[i].isInput != ASIOTrue)
! 		{
! 			asio_converter[i](
!                 asio_ringbuffer[i]+asio_ringbuffer_outoffset,
! 				asio_bufferinfo[i].buffers[db_idx],
! 				asio_bufsize);
! 		}
! 		else /* these are the input channels */
! 		{
! 			asio_converter[i](
!                 asio_bufferinfo[i].buffers[db_idx],
! 				asio_ringbuffer[i]+asio_ringbuffer_outoffset,
! 				asio_bufsize);
! 		}
  	}
  
--- 696,721 ----
  	long i, j;	
  
  	/* todo: i'm not sure if we'll have to synchronize with other media ...
  	 * probably yes ... */
  		
! 	/* sys_reftime = get_sys_reference_time(); */
  
! 	/* perform the processing */ 
  
  	for (i = 0; i < sys_outchannels + sys_inchannels; i++)
  	{
          if(asio_converter[i])
! 			if (asio_bufferinfo[i].isInput != ASIOTrue)
! 			{
! 				asio_converter[i](asio_ringbuffer[i]+asio_ringbuffer_outoffset,
! 								  asio_bufferinfo[i].buffers[db_idx],
! 								  asio_bufsize);
! 			}
! 			else /* these are the input channels */
! 			{
! 				asio_converter[i](asio_bufferinfo[i].buffers[db_idx],
! 								  asio_ringbuffer[i]+asio_ringbuffer_outoffset,
! 								  asio_bufsize);
! 			}
  	}
  
***************
*** 933,936 ****
--- 931,936 ----
  }
  
+ /* todo: check dithering */
+ 
  static void float32tofloat32(void* inbuffer, void* outbuffer, long frames)
  {
***************
*** 969,986 ****
  	while (frames--)
  	{
!         // TODO: do some dithering!!
! 
! 		float o = *(in++) * SCALE_INT16;
  #ifdef __GNUC__
! 		__int16 srt = lrintf(o);
  #else
!         __int16 srt;
  		__asm
  		{
  			fld o
! 			fistp srt
  		}
  #endif
! 		*out++ = srt;
  	}
  }
--- 969,984 ----
  	while (frames--)
  	{
! 		float o = *(in++) * SCALE_INT16 + triangulardither() * DITHER_SCALE;
  #ifdef __GNUC__
! 		__int16 lng = lrintf(o);
  #else
!         __int16 lng;
  		__asm
  		{
  			fld o
! 			fistp lng
  		}
  #endif
! 		*out++ = lng ;
  	}
  }
***************
*** 1000,1004 ****
  	while (frames--)
  	{
!         float o = *(in++) * SCALE_INT24;
  #ifdef __GNUC__
  		__int32 intg = (__int32)lrintf(o);
--- 998,1002 ----
  	while (frames--)
  	{
!         float o = *(in++) * SCALE_INT24 + triangulardither() * DITHER_SCALE;
  #ifdef __GNUC__
  		__int32 intg = (__int32)lrintf(o);
***************
*** 1029,1033 ****
  	while (frames--)
  	{
!         float o = (float)*(in++) * SCALE_INT32;
  #ifdef __GNUC__
  		*out++ = lrintf(o);
--- 1027,1031 ----
  	while (frames--)
  	{
!         float o = (float)*(in++) * SCALE_INT32 + triangulardither() * DITHER_SCALE;
  #ifdef __GNUC__
  		*out++ = lrintf(o);
***************
*** 1058,1063 ****
  	while (frames--)
  	{
!         // TODO: do some dithering!!
! 		float o = (float)*(in++) * SCALE_INT16;
  #ifdef __GNUC__
  		__int16 reverse = (__int16)lrintf(o);
--- 1056,1060 ----
  	while (frames--)
  	{
! 		float o = (float)*(in++) * SCALE_INT16 + triangulardither() * DITHER_SCALE;
  #ifdef __GNUC__
  		__int16 reverse = (__int16)lrintf(o);
***************
*** 1088,1092 ****
  	while (frames--)
  	{
!         float o = (float)*(in++) * SCALE_INT24;
  #ifdef __GNUC__
  		__int32 reverse = (__int32)lrintf(o);
--- 1085,1089 ----
  	while (frames--)
  	{
!         float o = (float)*(in++) * SCALE_INT24 + triangulardither() * DITHER_SCALE;
  #ifdef __GNUC__
  		__int32 reverse = (__int32)lrintf(o);
***************
*** 1127,1131 ****
  	while (frames--)
  	{
!         float o = (float)*(in++) * SCALE_INT32;
  #ifdef __GNUC__
  		__int32 reverse = (__int32)lrintf(o);
--- 1124,1128 ----
  	while (frames--)
  	{
!         float o = (float)*(in++) * SCALE_INT32 + triangulardither() * DITHER_SCALE;
  #ifdef __GNUC__
  		__int32 reverse = (__int32)lrintf(o);





More information about the Pd-cvs mailing list