This is an automated email from the git hooks/post-receive script. ecsv-guest pushed a commit to branch armhf_test in repository mupen64plus-audio-sdl.
commit 18cbf6874d280596a337e8fc371544728736cf45 Author: Sven Eckelmann <[email protected]> Date: Mon Oct 29 22:40:33 2012 +0100 Imported Upstream version 1.99.5+7+d483528be393 --- projects/unix/Makefile | 19 ++++++-- src/main.c | 129 ++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 138 insertions(+), 10 deletions(-) diff --git a/projects/unix/Makefile b/projects/unix/Makefile index 7f270da..05645ca 100644 --- a/projects/unix/Makefile +++ b/projects/unix/Makefile @@ -166,16 +166,28 @@ ifeq ($(OS),LINUX) LDLIBS += $(shell sdl-config --libs) endif +# test for presence of speexdsp +ifneq ($(strip $(shell pkg-config speexdsp --modversion 2> /dev/null)),) + ifneq ($(NO_SPEEX), 1) + # set speexdsp flags and libraries + CFLAGS += $(shell pkg-config speexdsp --cflags) -DUSE_SPEEX + LDLIBS += $(shell pkg-config speexdsp --libs) + endif +else + # warn user + $(warning No libspeexdsp development libraries found. Mupen64plus-sdl-audio will be built without speex-* resampler.) +endif + # test for presence of libsamplerate ifneq ($(strip $(shell pkg-config samplerate --modversion 2> /dev/null)),) - ifneq ($(NO_RESAMP), 1) + ifneq ($(NO_SRC), 1) # set libsamplerate flags and libraries CFLAGS += $(shell pkg-config samplerate --cflags) -DUSE_SRC LDLIBS += $(shell pkg-config samplerate --libs) endif else # warn user - $(warning No libsamplerate development libraries found. Mupen64plus-sdl-audio will be built without Best Quality SINC resampler.) + $(warning No libsamplerate development libraries found. Mupen64plus-sdl-audio will be built without src-* resampler.) endif # test for the presence of OSS @@ -274,7 +286,8 @@ targets: @echo " APIDIR=path == path to find Mupen64Plus Core headers" @echo " OPTFLAGS=flag == compiler optimization (default: -O3)" @echo " PIC=(1|0) == Force enable/disable of position independent code" - @echo " NO_RESAMP=1 == build without libsamplerate; disables high-quality audio resampling" + @echo " NO_SRC=1 == build without libsamplerate; disables src-* high-quality audio resampling" + @echo " NO_SPEEX=1 == build without libspeexdsp; disables speex-* high-quality audio resampling" @echo " Install Options:" @echo " PREFIX=path == install/uninstall prefix (default: /usr/local)" @echo " LIBDIR=path == library prefix (default: PREFIX/lib)" diff --git a/src/main.c b/src/main.c index 0f8bce5..c23c660 100644 --- a/src/main.c +++ b/src/main.c @@ -32,6 +32,9 @@ #ifdef USE_SRC #include <samplerate.h> #endif +#ifdef USE_SPEEX +#include <speex/speex_resampler.h> +#endif #define M64P_PLUGIN_PROTOTYPES 1 #include "m64p_types.h" @@ -82,6 +85,16 @@ static int l_PluginInit = 0; static int l_PausedForSync = 1; /* Audio is started in paused state after SDL initialization */ static m64p_handle l_ConfigAudio; +enum resampler_type { + RESAMPLER_TRIVIAL, +#ifdef USE_SRC + RESAMPLER_SRC, +#endif +#ifdef USE_SPEEX + RESAMPLER_SPEEX, +#endif +}; + /* Read header for type definition */ static AUDIO_INFO AudioInfo; /* The hardware specifications we are using */ @@ -107,8 +120,10 @@ static unsigned int PrimaryBufferSize = PRIMARY_BUFFER_SIZE; static unsigned int PrimaryBufferTarget = PRIMARY_BUFFER_TARGET; // Size of Secondary audio buffer in output samples static unsigned int SecondaryBufferSize = SECONDARY_BUFFER_SIZE; -// Resample or not -static unsigned char Resample = 1; +// Resample type +static enum resampler_type Resample = RESAMPLER_TRIVIAL; +// Resampler specific quality +static int ResampleQuality = 3; // volume to scale the audio by, range of 0..100 // if muted, this holds the volume when not muted static int VolPercent = 80; @@ -259,7 +274,7 @@ EXPORT m64p_error CALL PluginStartup(m64p_dynlib_handle CoreLibHandle, void *Con ConfigSetDefaultInt(l_ConfigAudio, "PRIMARY_BUFFER_SIZE", PRIMARY_BUFFER_SIZE, "Size of primary buffer in output samples. This is where audio is loaded after it's extracted from n64's memory."); ConfigSetDefaultInt(l_ConfigAudio, "PRIMARY_BUFFER_TARGET", PRIMARY_BUFFER_TARGET, "Fullness level target for Primary audio buffer, in equivalent output samples"); ConfigSetDefaultInt(l_ConfigAudio, "SECONDARY_BUFFER_SIZE", SECONDARY_BUFFER_SIZE, "Size of secondary buffer in output samples. This is SDL's hardware buffer."); - ConfigSetDefaultInt(l_ConfigAudio, "RESAMPLE", 1, "Audio resampling algorithm. 1 = unfiltered, 2 = SINC resampling (Best Quality, requires libsamplerate)"); + ConfigSetDefaultString(l_ConfigAudio, "RESAMPLE", "trivial", "Audio resampling algorithm. src-sinc-best-quality, src-sinc-medium-quality, src-sinc-fastest, src-zero-order-hold, src-linear, speex-fixed-{10-0}, trivial"); ConfigSetDefaultInt(l_ConfigAudio, "VOLUME_CONTROL_TYPE", VOLUME_TYPE_SDL, "Volume control type: 1 = SDL (only affects Mupen64Plus output) 2 = OSS mixer (adjusts master PC volume)"); ConfigSetDefaultInt(l_ConfigAudio, "VOLUME_ADJUST", 5, "Percentage change each time the volume is increased or decreased"); ConfigSetDefaultInt(l_ConfigAudio, "VOLUME_DEFAULT", 80, "Default volume when a game is started. Only used if VOLUME_CONTROL_TYPE is 1"); @@ -448,14 +463,44 @@ static int error; static SRC_STATE *src_state; static SRC_DATA src_data; #endif +#ifdef USE_SPEEX +SpeexResamplerState* spx_state = NULL; +static int error; +#endif static int resample(unsigned char *input, int input_avail, int oldsamplerate, unsigned char *output, int output_needed, int newsamplerate) { int *psrc = (int*)input; int *pdest = (int*)output; int i = 0, j = 0; + +#ifdef USE_SPEEX + spx_uint32_t in_len, out_len; + if(Resample == RESAMPLER_SPEEX) + { + if(spx_state == NULL) + { + spx_state = speex_resampler_init(2, oldsamplerate, newsamplerate, ResampleQuality, &error); + if(spx_state == NULL) + { + memset(output, 0, output_needed); + return 0; + } + } + speex_resampler_set_rate(spx_state, oldsamplerate, newsamplerate); + in_len = input_avail / 4; + out_len = output_needed / 4; + + if ((error = speex_resampler_process_interleaved_int(spx_state, (const spx_int16_t *)input, &in_len, (spx_int16_t *)output, &out_len))) + { + memset(output, 0, output_needed); + return input_avail; // number of bytes consumed + } + return in_len * 4; + } +#endif #ifdef USE_SRC - if(Resample == 2) + if(Resample == RESAMPLER_SRC) { // the high quality resampler needs more input than the samplerate ratio would indicate to work properly if (input_avail > output_needed * 3 / 2) @@ -476,7 +521,7 @@ static int resample(unsigned char *input, int input_avail, int oldsamplerate, un memset(_dest,0,_dest_len); if(src_state == NULL) { - src_state = src_new (SRC_SINC_BEST_QUALITY, 2, &error); + src_state = src_new (ResampleQuality, 2, &error); if(src_state == NULL) { memset(output, 0, output_needed); @@ -499,7 +544,7 @@ static int resample(unsigned char *input, int input_avail, int oldsamplerate, un return src_data.input_frames_used * 4; } #endif - // RESAMPLE == 1 + // RESAMPLE == TRIVIAL if (newsamplerate >= oldsamplerate) { int sldf = oldsamplerate; @@ -776,16 +821,86 @@ EXPORT void CALL SetSpeedFactor(int percentage) static void ReadConfig(void) { + const char *resampler_id; + /* read the configuration values into our static variables */ GameFreq = ConfigGetParamInt(l_ConfigAudio, "DEFAULT_FREQUENCY"); SwapChannels = ConfigGetParamBool(l_ConfigAudio, "SWAP_CHANNELS"); PrimaryBufferSize = ConfigGetParamInt(l_ConfigAudio, "PRIMARY_BUFFER_SIZE"); PrimaryBufferTarget = ConfigGetParamInt(l_ConfigAudio, "PRIMARY_BUFFER_TARGET"); SecondaryBufferSize = ConfigGetParamInt(l_ConfigAudio, "SECONDARY_BUFFER_SIZE"); - Resample = ConfigGetParamInt(l_ConfigAudio, "RESAMPLE"); + resampler_id = ConfigGetParamString(l_ConfigAudio, "RESAMPLE"); VolumeControlType = ConfigGetParamInt(l_ConfigAudio, "VOLUME_CONTROL_TYPE"); VolDelta = ConfigGetParamInt(l_ConfigAudio, "VOLUME_ADJUST"); VolPercent = ConfigGetParamInt(l_ConfigAudio, "VOLUME_DEFAULT"); + + if (!resampler_id) { + Resample = RESAMPLER_TRIVIAL; + DebugMessage(M64MSG_WARNING, "Could not find RESAMPLE configuration; use trivial resampler"); + return; + } + if (strcmp(resampler_id, "trivial") == 0) { + Resample = RESAMPLER_TRIVIAL; + return; + } +#ifdef USE_SPEEX + if (strncmp(resampler_id, "speex-fixed-", strlen("speex-fixed-")) == 0) { + int i; + static const char *speex_quality[] = { + "speex-fixed-0", + "speex-fixed-1", + "speex-fixed-2", + "speex-fixed-3", + "speex-fixed-4", + "speex-fixed-5", + "speex-fixed-6", + "speex-fixed-7", + "speex-fixed-8", + "speex-fixed-9", + "speex-fixed-10", + }; + Resample = RESAMPLER_SPEEX; + for (i = 0; i < sizeof(speex_quality) / sizeof(*speex_quality); i++) { + if (strcmp(speex_quality[i], resampler_id) == 0) { + ResampleQuality = i; + return; + } + } + DebugMessage(M64MSG_WARNING, "Unknown RESAMPLE configuration %s; use speex-fixed-4 resampler", resampler_id); + ResampleQuality = 4; + return; + } +#endif +#ifdef USE_SRC + if (strncmp(resampler_id, "src-", strlen("src-")) == 0) { + Resample = RESAMPLER_SRC; + if (strcmp(resampler_id, "src-sinc-best-quality") == 0) { + ResampleQuality = SRC_SINC_BEST_QUALITY; + return; + } + if (strcmp(resampler_id, "src-sinc-medium-quality") == 0) { + ResampleQuality = SRC_SINC_MEDIUM_QUALITY; + return; + } + if (strcmp(resampler_id, "src-sinc-fastest") == 0) { + ResampleQuality = SRC_SINC_FASTEST; + return; + } + if (strcmp(resampler_id, "src-zero-order-hold") == 0) { + ResampleQuality = SRC_ZERO_ORDER_HOLD; + return; + } + if (strcmp(resampler_id, "src-linear") == 0) { + ResampleQuality = SRC_LINEAR; + return; + } + DebugMessage(M64MSG_WARNING, "Unknown RESAMPLE configuration %s; use src-sinc-medium-quality resampler", resampler_id); + ResampleQuality = SRC_SINC_MEDIUM_QUALITY; + return; + } +#endif + DebugMessage(M64MSG_WARNING, "Unknown RESAMPLE configuration %s; use trivial resampler", resampler_id); + Resample = RESAMPLER_TRIVIAL; } // Returns the most recent ummuted volume level. -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/mupen64plus-audio-sdl.git _______________________________________________ Pkg-games-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-games-commits

