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
This commit is contained in:
bgk 2008-09-13 17:36:54 +00:00
parent a159851cc5
commit 9ef0900656
2 changed files with 85 additions and 11 deletions

View File

@ -46,6 +46,7 @@
#include "../dmg/gb.h" #include "../dmg/gb.h"
#include "../dmg/gbGlobals.h" #include "../dmg/gbGlobals.h"
#include "../dmg/gbCheats.h" #include "../dmg/gbCheats.h"
#include "../dmg/gbSound.h"
#include "../Cheats.h" #include "../Cheats.h"
#include "debugger.h" #include "debugger.h"
@ -239,6 +240,10 @@ int sdlPreparedCheats = 0;
#define MAX_CHEATS 100 #define MAX_CHEATS 100
const char * sdlPreparedCheatCodes[MAX_CHEATS]; 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[] = { struct option sdlOptions[] = {
{ "agb-print", no_argument, &sdlAgbPrint, 1 }, { "agb-print", no_argument, &sdlAgbPrint, 1 },
{ "auto-frameskip", no_argument, &autoFrameSkip, 1 }, { "auto-frameskip", no_argument, &autoFrameSkip, 1 },
@ -291,12 +296,11 @@ static void sdlChangeVolume(float d)
float newVolume = oldVolume + d; float newVolume = oldVolume + d;
if (newVolume < 0.0) newVolume = 0.0; 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) { if (fabs(newVolume - oldVolume) > 0.001) {
char tmp[32]; char tmp[32];
if (newVolume < oldVolume) sprintf(tmp, "Sound volume decreased (%i%%)", (int)(newVolume*100.0+0.5)); sprintf(tmp, "Volume: %i%%", (int)(newVolume*100.0+0.5));
else sprintf(tmp, "Sound volume increased (%i%%)", (int)(newVolume*100.0+0.5));
systemScreenMessage(tmp); systemScreenMessage(tmp);
soundSetVolume(newVolume); soundSetVolume(newVolume);
} }
@ -361,7 +365,7 @@ u32 sdlFromHex(char *s)
u32 sdlFromDec(char *s) u32 sdlFromDec(char *s)
{ {
u32 value; u32 value = 0;
sscanf(s, "%u", &value); sscanf(s, "%u", &value);
return value; return value;
} }
@ -728,14 +732,28 @@ void sdlReadPreferences(FILE *f)
} else if(!strcmp(key, "soundEnable")) { } else if(!strcmp(key, "soundEnable")) {
int res = sdlFromHex(value) & 0x30f; int res = sdlFromHex(value) & 0x30f;
soundSetEnable(res); 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")) { } else if(!strcmp(key, "soundEcho")) {
/* TODO */ if (sdlFromHex(value)) {
/* soundEcho = sdlFromHex(value) ? true : false; */ 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")) { } else if(!strcmp(key, "soundVolume")) {
int volume = sdlFromDec(value); float volume = sdlFromDec(value) / 100.0;
if (volume < 0 || volume > 200) if (volume < 0.0 || volume > SDL_SOUND_MAX_VOLUME)
volume = 100; volume = 1.0;
soundSetVolume((float)(volume / 100.0f )); soundSetVolume(volume);
} else if(!strcmp(key, "saveType")) { } else if(!strcmp(key, "saveType")) {
cpuSaveType = sdlFromHex(value); cpuSaveType = sdlFromHex(value);
if(cpuSaveType < 0 || cpuSaveType > 5) if(cpuSaveType < 0 || cpuSaveType > 5)
@ -1428,6 +1446,45 @@ void sdlPollEvents()
case SDLK_KP_MULTIPLY: case SDLK_KP_MULTIPLY:
sdlChangeVolume(0.1); sdlChangeVolume(0.1);
break; 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: case SDLK_p:
if(!(event.key.keysym.mod & MOD_NOCTRL) && if(!(event.key.keysym.mod & MOD_NOCTRL) &&
@ -1800,6 +1857,11 @@ int main(int argc, char **argv)
parseDebug = true; 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]; char buf[1024];
struct stat s; struct stat s;

View File

@ -138,10 +138,22 @@ captureFormat=0
# 1=44 Khz, 2=22Khz, 4=11Khz # 1=44 Khz, 2=22Khz, 4=11Khz
soundQuality=2 soundQuality=2
# Sound Echo # GB Sound Stereo
# 0=false, anything else for true
soundStereo=0
# GB Sound Echo
# 0=false, anything else for true # 0=false, anything else for true
soundEcho=0 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 # Save Type
# 0=automatic, 1=EEPROM, 2=SRAM, 3=Flash, 4=EEPROM+Sensor, 5=NONE # 0=automatic, 1=EEPROM, 2=SRAM, 3=Flash, 4=EEPROM+Sensor, 5=NONE
saveType=0 saveType=0