CVS: rdesktop configure.ac, 1.25, 1.26 rdpsnd_dsp.c, 1.9, 1.10

Michael Gernoth <[email protected]> Sun, 01 Oct 2006 06:57:37 -0700
Newsgroups gmane.network.rdesktop.cvs
Message-ID <[email protected]>
Update of /cvsroot/rdesktop/rdesktop
In directory sc8-pr-cvs9.sourceforge.net:/tmp/cvs-serv11007

Modified Files:
	configure.ac rdpsnd_dsp.c 
Log Message:
use libsamplerate for resampling when available


Index: configure.ac
===================================================================
RCS file: /cvsroot/rdesktop/rdesktop/configure.ac,v
retrieving revision 1.25
retrieving revision 1.26
diff -C2 -d -r1.25 -r1.26
*** configure.ac	17 Sep 2006 14:41:16 -0000	1.25
--- configure.ac	1 Oct 2006 13:57:34 -0000	1.26
***************
*** 150,153 ****
--- 150,170 ----
  )
  
+ AC_ARG_WITH(libsamplerate,
+     [  --with-libsamplerate=DIR look for libsamplerate at DIR/include, DIR/lib],
+     [
+     CFLAGS="$CFLAGS -I$withval/include"
+     CPPFLAGS="$CPPFLAGS -I$withval/include"
+     LDFLAGS="$LDFLAGS -L$withval/lib"
+     rpath="$rpath:$withval/lib"
+     ]
+ )
+ 
+ AC_CHECK_HEADER(samplerate.h,
+     [
+     LIBS="$LIBS -lsamplerate"
+     AC_DEFINE(HAVE_LIBSAMPLERATE)
+     ]
+ )
+ 
  sound="yes"
  AC_ARG_WITH(sound,

Index: rdpsnd_dsp.c
===================================================================
RCS file: /cvsroot/rdesktop/rdesktop/rdpsnd_dsp.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** rdpsnd_dsp.c	1 Oct 2006 12:26:01 -0000	1.9
--- rdpsnd_dsp.c	1 Oct 2006 13:57:34 -0000	1.10
***************
*** 23,26 ****
--- 23,32 ----
  #include "rdpsnd_dsp.h"
  
+ #ifdef HAVE_LIBSAMPLERATE
+ #include <samplerate.h>
+ 
+ #define SRC_CONVERTER SRC_SINC_MEDIUM_QUALITY
+ #endif
+ 
  #define MAX_VOLUME 65535
  
***************
*** 30,33 ****
--- 36,42 ----
  static uint16 resample_to_bitspersample = 16;
  static uint16 resample_to_channels = 2;
+ #ifdef HAVE_LIBSAMPLERATE
+ static SRC_STATE *src_converter = NULL;
+ #endif
  
  void
***************
*** 120,123 ****
--- 129,140 ----
  rdpsnd_dsp_resample_set(uint32 device_srate, uint16 device_bitspersample, uint16 device_channels)
  {
+ #ifdef HAVE_LIBSAMPLERATE
+ 	int err;
+ #endif
+ 
+ #ifdef HAVE_LIBSAMPLERATE
+ 	if (device_bitspersample != 16)
+ 		return False;
+ #else
  	if (device_srate != 44100 && device_srate != 22050)
  		return False;
***************
*** 125,128 ****
--- 142,146 ----
  	if (device_bitspersample != 16 && device_bitspersample != 8)
  		return False;
+ #endif
  
  	if (device_channels != 1 && device_channels != 2)
***************
*** 133,136 ****
--- 151,165 ----
  	resample_to_channels = device_channels;
  
+ #ifdef HAVE_LIBSAMPLERATE
+ 	if (src_converter != NULL)
+ 		src_converter = src_delete(src_converter);
+ 
+ 	if ((src_converter = src_new(SRC_CONVERTER, device_channels, &err)) == NULL)
+ 	{
+ 		warning("src_new failed: %d!\n", err);
+ 		return False;
+ 	}
+ #endif
+ 
  	return True;
  }
***************
*** 143,150 ****
--- 172,184 ----
  	if ((format->nChannels != 1) && (format->nChannels != 2))
  		return False;
+ #ifdef HAVE_LIBSAMPLERATE
+ 	if (format->wBitsPerSample != 16)
+ 		return False;
+ #else
  	if ((format->wBitsPerSample != 8) && (format->wBitsPerSample != 16))
  		return False;
  	if ((format->nSamplesPerSec != 44100) && (format->nSamplesPerSec != 22050))
  		return False;
+ #endif
  
  	return True;
***************
*** 153,162 ****
  uint32
  rdpsnd_dsp_resample(unsigned char **out, unsigned char *in, unsigned int size,
! 		    WAVEFORMATEX * format)
  {
  	static BOOL warned = False;
- 	int outsize, offset;
  	int samplewidth = format->wBitsPerSample / 8;
! 	int i;
  
  	if ((resample_to_bitspersample == format->wBitsPerSample) &&
--- 187,203 ----
  uint32
  rdpsnd_dsp_resample(unsigned char **out, unsigned char *in, unsigned int size,
! 		    WAVEFORMATEX * format, BOOL stream_be)
  {
+ #ifdef HAVE_LIBSAMPLERATE
+ 	SRC_DATA resample_data;
+ 	float *infloat, *outfloat;
+ 	int innum, outnum;
+ #else
+ 	int offset;
+ 	int i;
+ #endif
  	static BOOL warned = False;
  	int samplewidth = format->wBitsPerSample / 8;
! 	int outsize = 0;
  
  	if ((resample_to_bitspersample == format->wBitsPerSample) &&
***************
*** 165,175 ****
  		return 0;
  
! 	if ((resample_to_bitspersample != format->wBitsPerSample) ||
! 	    (resample_to_channels != format->nChannels) || (format->nSamplesPerSec != 22050))
  	{
  		if (!warned)
  		{
! 			warning("unsupported resample-settings (%u/%u/%u), not resampling!\n",
! 				format->nSamplesPerSec, format->wBitsPerSample, format->nChannels);
  			warned = True;
  		}
--- 206,258 ----
  		return 0;
  
! #ifdef B_ENDIAN
! 	if (!stream_be)
! 		rdpsnd_dsp_swapbytes(in, size, format)
! #endif
! 			if ((resample_to_channels != format->nChannels) ||
! 			    (resample_to_bitspersample != format->wBitsPerSample))
! 		{
! 			warning("unsupported resample-settings (%u -> %u/%u -> %u/%u -> %u), not resampling!\n", format->nSamplesPerSec, resample_to_srate, format->wBitsPerSample, resample_to_bitspersample, format->nChannels, resample_to_channels);
! 			warned = True;
! 		}
! 
! #ifdef HAVE_LIBSAMPLERATE
! 	if (src_converter == NULL)
! 	{
! 		warning("no samplerate converter available!!\n");
! 		return 0;
! 	}
! 
! 	innum = size / samplewidth;
! 	outnum = innum * (resample_to_srate / format->nSamplesPerSec);
! 
! 	infloat = xmalloc(sizeof(float) * innum);
! 	outfloat = xmalloc(sizeof(float) * outnum);
! 
! 	src_short_to_float_array((short *) in, infloat, innum);
! 
! 	bzero(&resample_data, sizeof(resample_data));
! 	resample_data.data_in = infloat;
! 	resample_data.data_out = outfloat;
! 	resample_data.input_frames = innum / resample_to_channels;
! 	resample_data.output_frames = outnum / resample_to_channels;
! 	resample_data.src_ratio = (double) resample_to_srate / (double) format->nSamplesPerSec;
! 	resample_data.end_of_input = 0;
! 
! 	src_process(src_converter, &resample_data);
! 	xfree(infloat);
! 
! 	outsize = outnum * samplewidth;
! 	*out = xmalloc(outsize);
! 	src_float_to_short_array(outfloat, (short *) *out, outnum);
! 	xfree(outfloat);
! 
! #else
! 	if (format->nSamplesPerSec != 22050)
  	{
  		if (!warned)
  		{
! 			warning("unsupported source samplerate (%u), not resampling!\n",
! 				format->nSamplesPerSec);
  			warned = True;
  		}
***************
*** 198,203 ****
  
  	}
  
! 	return outsize;
  }
  
--- 281,291 ----
  
  	}
+ #endif
  
! #ifdef B_ENDIAN
! 	if (!stream_be)
! 		rdpsnd_dsp_swapbytes(*out, outsize, format)
! #endif
! 			return outsize;
  }
  
***************
*** 206,209 ****
--- 294,298 ----
  {
  	static struct stream out;
+ 	BOOL stream_be = False;
  
  	/* softvol and byteswap do not change the amount of data they
***************
*** 214,218 ****
--- 303,310 ----
  #ifdef B_ENDIAN
  	if (current_driver->need_byteswap_on_be)
+ 	{
  		rdpsnd_dsp_swapbytes(s->data, s->size, format);
+ 		stream_be = True;
+ 	}
  #endif
  
***************
*** 220,224 ****
  
  	if (current_driver->wave_out_format_supported == rdpsnd_dsp_resample_supported)
! 		out.size = rdpsnd_dsp_resample(&out.data, s->data, s->size, format);
  
  	if (out.data == NULL)
--- 312,316 ----
  
  	if (current_driver->wave_out_format_supported == rdpsnd_dsp_resample_supported)
! 		out.size = rdpsnd_dsp_resample(&out.data, s->data, s->size, format, stream_be);
  
  	if (out.data == NULL)


-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV