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