From 9ef090065694d47983925864ff9c25516e0876c8 Mon Sep 17 00:00:00 2001 From: bgk Date: Sat, 13 Sep 2008 17:36:54 +0000 Subject: [PATCH] SDL : Add Gb sound effects support (patch by chrono) git-svn-id: https://svn.code.sf.net/p/vbam/code/trunk@725 a31d4220-a93d-0410-bf67-fe4944624d44 --- src/sdl/SDL.cpp | 82 +++++++++++++++++++++++++++++++++++----- src/sdl/vbam.cfg-example | 14 ++++++- 2 files changed, 85 insertions(+), 11 deletions(-) diff --git a/src/sdl/SDL.cpp b/src/sdl/SDL.cpp index dee8a518..59e19d8d 100644 --- a/src/sdl/SDL.cpp +++ b/src/sdl/SDL.cpp @@ -46,6 +46,7 @@ #include "../dmg/gb.h" #include "../dmg/gbGlobals.h" #include "../dmg/gbCheats.h" +#include "../dmg/gbSound.h" #include "../Cheats.h" #include "debugger.h" @@ -239,6 +240,10 @@ int sdlPreparedCheats = 0; #define MAX_CHEATS 100 const char * sdlPreparedCheatCodes[MAX_CHEATS]; +#define SDL_SOUND_MAX_VOLUME 2.0 +#define SDL_SOUND_ECHO 0.2 +#define SDL_SOUND_STEREO 0.15 + struct option sdlOptions[] = { { "agb-print", no_argument, &sdlAgbPrint, 1 }, { "auto-frameskip", no_argument, &autoFrameSkip, 1 }, @@ -291,12 +296,11 @@ static void sdlChangeVolume(float d) float newVolume = oldVolume + d; if (newVolume < 0.0) newVolume = 0.0; - if (newVolume > 2.0) newVolume = 2.0; + if (newVolume > SDL_SOUND_MAX_VOLUME) newVolume = SDL_SOUND_MAX_VOLUME; if (fabs(newVolume - oldVolume) > 0.001) { char tmp[32]; - if (newVolume < oldVolume) sprintf(tmp, "Sound volume decreased (%i%%)", (int)(newVolume*100.0+0.5)); - else sprintf(tmp, "Sound volume increased (%i%%)", (int)(newVolume*100.0+0.5)); + sprintf(tmp, "Volume: %i%%", (int)(newVolume*100.0+0.5)); systemScreenMessage(tmp); soundSetVolume(newVolume); } @@ -361,7 +365,7 @@ u32 sdlFromHex(char *s) u32 sdlFromDec(char *s) { - u32 value; + u32 value = 0; sscanf(s, "%u", &value); return value; } @@ -728,14 +732,28 @@ void sdlReadPreferences(FILE *f) } else if(!strcmp(key, "soundEnable")) { int res = sdlFromHex(value) & 0x30f; soundSetEnable(res); + } else if(!strcmp(key, "soundStereo")) { + if (sdlFromHex(value)) { + gb_effects_config.stereo = SDL_SOUND_STEREO; + gb_effects_config.enabled = true; + } } else if(!strcmp(key, "soundEcho")) { - /* TODO */ - /* soundEcho = sdlFromHex(value) ? true : false; */ + if (sdlFromHex(value)) { + gb_effects_config.echo = SDL_SOUND_ECHO; + gb_effects_config.enabled = true; + } + } else if(!strcmp(key, "soundSurround")) { + if (sdlFromHex(value)) { + gb_effects_config.surround = true; + gb_effects_config.enabled = true; + } + } else if(!strcmp(key, "declicking")) { + gbSoundSetDeclicking(sdlFromHex(value) != 0); } else if(!strcmp(key, "soundVolume")) { - int volume = sdlFromDec(value); - if (volume < 0 || volume > 200) - volume = 100; - soundSetVolume((float)(volume / 100.0f )); + float volume = sdlFromDec(value) / 100.0; + if (volume < 0.0 || volume > SDL_SOUND_MAX_VOLUME) + volume = 1.0; + soundSetVolume(volume); } else if(!strcmp(key, "saveType")) { cpuSaveType = sdlFromHex(value); if(cpuSaveType < 0 || cpuSaveType > 5) @@ -1428,6 +1446,45 @@ void sdlPollEvents() case SDLK_KP_MULTIPLY: sdlChangeVolume(0.1); break; + case SDLK_KP_MINUS: + if (gb_effects_config.stereo > 0.0) { + gb_effects_config.stereo = 0.0; + if (gb_effects_config.echo == 0.0 && !gb_effects_config.surround) { + gb_effects_config.enabled = 0; + } + systemScreenMessage("Stereo off"); + } else { + gb_effects_config.stereo = SDL_SOUND_STEREO; + gb_effects_config.enabled = true; + systemScreenMessage("Stereo on"); + } + break; + case SDLK_KP_PLUS: + if (gb_effects_config.echo > 0.0) { + gb_effects_config.echo = 0.0; + if (gb_effects_config.stereo == 0.0 && !gb_effects_config.surround) { + gb_effects_config.enabled = false; + } + systemScreenMessage("Echo off"); + } else { + gb_effects_config.echo = SDL_SOUND_ECHO; + gb_effects_config.enabled = true; + systemScreenMessage("Echo on"); + } + break; + case SDLK_KP_ENTER: + if (gb_effects_config.surround) { + gb_effects_config.surround = false; + if (gb_effects_config.stereo == 0.0 && gb_effects_config.echo == 0.0) { + gb_effects_config.enabled = false; + } + systemScreenMessage("Surround off"); + } else { + gb_effects_config.surround =true; + gb_effects_config.enabled = true; + systemScreenMessage("Surround on"); + } + break; case SDLK_p: if(!(event.key.keysym.mod & MOD_NOCTRL) && @@ -1800,6 +1857,11 @@ int main(int argc, char **argv) parseDebug = true; + gb_effects_config.stereo = 0.0; + gb_effects_config.echo = 0.0; + gb_effects_config.surround = false; + gb_effects_config.enabled = false; + char buf[1024]; struct stat s; diff --git a/src/sdl/vbam.cfg-example b/src/sdl/vbam.cfg-example index bf070a4c..5e9a5dd6 100644 --- a/src/sdl/vbam.cfg-example +++ b/src/sdl/vbam.cfg-example @@ -138,10 +138,22 @@ captureFormat=0 # 1=44 Khz, 2=22Khz, 4=11Khz soundQuality=2 -# Sound Echo +# GB Sound Stereo +# 0=false, anything else for true +soundStereo=0 + +# GB Sound Echo # 0=false, anything else for true soundEcho=0 +# GB Sound Surround +# 0=false, anything else for true +soundSurround=0 + +# GB Sound Declicking +# 0=false, anything else for true +declicking=1 + # Save Type # 0=automatic, 1=EEPROM, 2=SRAM, 3=Flash, 4=EEPROM+Sensor, 5=NONE saveType=0