soundconfig apply patch 5113 by Joe #755

git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@5141 30fe4595-0a0c-4342-8851-515496e4dcbd

Former-commit-id: bcc8c516bbc1894e7b0aeb9bb79bb59e18c1be22
Former-commit-id: 71dca13aca621cd4e57ee613e07e6981a6d5a55f
This commit is contained in:
torcs-ng 2013-02-15 20:24:24 +00:00
parent 0ebb48b7b5
commit 3d81f5fb84
4 changed files with 203 additions and 9 deletions

View file

@ -39,6 +39,7 @@ static bool enabled = true;
static char currentMusicfile[MAX_MUSIC_PATH] = {0};
//static char nextMusicfile[MAX_MUSIC_PATH] = {0};
static char defaultMusic[MAX_MUSIC_PATH] = {0}; //"data/music/main.ogg";
static float maxMusicVolume = 1.0;
#define NOMUSIC "None"
std::map<std::string,OpenALMusicPlayer*> mapOpenAlPlayers;
@ -74,6 +75,8 @@ static OpenALMusicPlayer* getMusicPlayer(char* oggFilePath)
if (itPlayers == mapOpenAlPlayers.end()) {
player = new OpenALMusicPlayer(getMenuSoundStream(oggFilePath));
mapOpenAlPlayers[oggFilePath] = player;
player->setvolume(maxMusicVolume);
//player->fadein();
player->start(); // Fade in
} else {
player = mapOpenAlPlayers[oggFilePath];
@ -93,7 +96,7 @@ static Uint32 sdlTimerFunc(Uint32 interval, void* /* pEvLoopPriv */)
SDL_TimerID timerId = 0;
static void playMenuMusic(int /* value */)
{
const int nextcallinms = 200;
const int nextcallinms = 100;
SDL_LockMutex(mapMutex);
std::map<std::string, OpenALMusicPlayer*>::const_iterator itPlayers = mapOpenAlPlayers.begin();
while(itPlayers != mapOpenAlPlayers.end()) {
@ -180,24 +183,27 @@ void playMusic(char* filename)
OpenALMusicPlayer* player = NULL;
if(filename != NULL) {
if(0 == strcmp(NOMUSIC,filename)){
strcpy(currentMusicfile,filename);
pauseMenuMusic();
return;
}
if(0 != strcmp(currentMusicfile,filename)){
player = getMusicPlayer(currentMusicfile);
player->pause();
player->fadeout();
strcpy(currentMusicfile,filename);
GfLogInfo("Music changing to: %s \n", filename);
player = getMusicPlayer(filename);
player->fadein();
}
player = getMusicPlayer(filename);
} else {
if(0 != strcmp(currentMusicfile,defaultMusic)){
player = getMusicPlayer(currentMusicfile);
player->pause();
player->fadeout();
strcpy(currentMusicfile,defaultMusic);
GfLogInfo("Music changing to: %s \n", defaultMusic);
player = getMusicPlayer(defaultMusic);
player->fadein();
}
player = getMusicPlayer(defaultMusic);
}
if(player) {
player->resume(0);
@ -236,7 +242,15 @@ static void readConfig()
void *paramHandle = GfParmReadFile(fnbuf, GFPARM_RMODE_REREAD | GFPARM_RMODE_CREAT);
const char *musicenabled = GfParmGetStr(paramHandle, SND_SCT_MUSIC, SND_ATT_MUSIC_STATE, musicDisabledStr);
//float music_volume = GfParmGetNum(paramHandle, GR_SCT_SOUND, SND_ATT_MUSIC_VOLUME, "%", 100.0f);
float music_volume = GfParmGetNum(paramHandle, SND_SCT_MUSIC, SND_ATT_MUSIC_VOLUME, "%", 100.0f);
if (music_volume>100.0f) {
music_volume = 100.0f;
}
else if (music_volume < 0.0f) {
music_volume = 0.0f;
}
maxMusicVolume = music_volume/100.0f;
if (0 == strcmp(musicenabled, SND_VAL_MUSIC_STATE_ENABLED)) {
enabled = true;
} else {
@ -259,3 +273,17 @@ static void readConfig()
paramHandle = NULL;
}
#endif
void setMusicVolume(float vol)
{
#if MENU_MUSIC
if (vol < 0)
vol = 0.0f;
else if (vol > 1.0f)
vol = 1.0f;
maxMusicVolume = vol;
GfLogInfo("Music maximum volume set to %.2f\n", maxMusicVolume);
#endif
}

View file

@ -22,6 +22,7 @@
#include "openalmusicplayer.h"
const int OpenALMusicPlayer::BUFFERSIZE = 4096*64;
const ALfloat OpenALMusicPlayer::FADESTEP = 0.01;
OpenALMusicPlayer::OpenALMusicPlayer(SoundStream* soundStream):
device(NULL),
@ -29,7 +30,9 @@ OpenALMusicPlayer::OpenALMusicPlayer(SoundStream* soundStream):
originalcontext(NULL),
source(0),
stream(soundStream),
ready(false)
ready(false),
maxVolume(1.0),
fadestate(FADEIN)
{
buffers[0] = 0;
buffers[1] = 0;
@ -244,6 +247,8 @@ bool OpenALMusicPlayer::playAndManageBuffer()
int processed = 0;
bool active = true;
doFade();
alGetSourcei(source, AL_BUFFERS_PROCESSED, &processed);
while(processed--) {
@ -287,4 +292,54 @@ bool OpenALMusicPlayer::startPlayback()
alSourcePlay(source);
return true;
}
void OpenALMusicPlayer::fadeout()
{
fadestate = FADEOUT;
}
void OpenALMusicPlayer::fadein()
{
fadestate = FADEIN;
alSourcef(source, AL_GAIN, 0.0f);
}
void OpenALMusicPlayer::setvolume(float volume)
{
maxVolume = volume;
}
float OpenALMusicPlayer::getvolume()
{
return maxVolume;
}
void OpenALMusicPlayer::doFade()
{
ALfloat currentVol = 0.0;
switch(fadestate){
case FADEIN:
alGetSourcef(source, AL_GAIN, &currentVol);
currentVol += FADESTEP;
if(currentVol >= maxVolume){
currentVol = maxVolume;
fadestate = NONE;
}
alSourcef(source, AL_GAIN, currentVol);
break;
case FADEOUT:
alGetSourcef(source, AL_GAIN, &currentVol);
currentVol -= FADESTEP;
if(currentVol <= 0.0){
currentVol = 0.0;
fadestate = NONE;
}
alSourcef(source, AL_GAIN, currentVol);
break;
case NONE:
break;
}
}

View file

@ -32,10 +32,14 @@ class OpenALMusicPlayer
virtual void start();
virtual void stop();
virtual void pause();
virtual void resume(int flag);
virtual void pause();
virtual void resume(int flag);
virtual void rewind();
virtual bool playAndManageBuffer();
virtual void setvolume(float volume);
virtual float getvolume();
virtual void fadeout();
virtual void fadein();
protected:
virtual bool initContext();
@ -45,15 +49,22 @@ class OpenALMusicPlayer
virtual bool startPlayback();
virtual bool isPlaying();
virtual bool streamBuffer(ALuint buffer);
virtual void doFade();
ALCdevice* device;
ALCcontext* context;
ALCcontext* originalcontext;
ALuint source; // audio source
ALuint buffers[2]; // front and back buffers
ALfloat maxVolume;
typedef enum { NONE, FADEIN, FADEOUT } eFadeState;
eFadeState fadestate;
SoundStream* stream;
bool ready; // initialization sucessful
static const int BUFFERSIZE;
static const ALfloat FADESTEP;
};
#endif // __OpenALMusicPlayer_h__

View file

@ -31,6 +31,9 @@
#include "soundconfig.h"
#if MENU_MUSIC
#include "legacymenu.h"
#endif
// list of options.
static const char *soundOptionList[] = {SND_ATT_SOUND_STATE_OPENAL,
@ -46,6 +49,22 @@ static int SoundOptionId;
static float VolumeValue = 100.0f;
static int VolumeValueId;
#if MENU_MUSIC
// list of music states.
static const char *musicStateList[] = {SND_VAL_MUSIC_STATE_ENABLED,
SND_VAL_MUSIC_STATE_DISABLED};
static const int nbMusicStates = sizeof(musicStateList) / sizeof(musicStateList[0]);
static int curMusicState = 0;
// gui label id.
static int MusicStateId;
// volume
static float MusicVolumeValue = 100.0f;
static int MusicVolumeValueId;
#endif
// gui screen handles.
static void *scrHandle = NULL;
static void *prevHandle = NULL;
@ -84,6 +103,32 @@ static void readSoundCfg(void)
sprintf(buf, "%g", VolumeValue);
GfuiEditboxSetString(scrHandle, VolumeValueId, buf);
#if MENU_MUSIC
optionName = GfParmGetStr(paramHandle, SND_SCT_MUSIC, SND_ATT_MUSIC_STATE, musicStateList[0]);
for (i = 0; i < nbMusicStates; i++) {
if (strcmp(optionName, musicStateList[i]) == 0) {
curMusicState = i;
break;
}
}
GfuiLabelSetText(scrHandle, MusicStateId, musicStateList[curMusicState]);
// Music volume.
MusicVolumeValue = GfParmGetNum(paramHandle, SND_SCT_MUSIC, SND_ATT_MUSIC_VOLUME, "%", 100.0f);
if (MusicVolumeValue>100.0f) {
MusicVolumeValue = 100.0f;
}
else if (MusicVolumeValue < 0.0f) {
MusicVolumeValue = 0.0f;
}
sprintf(buf, "%g", MusicVolumeValue);
GfuiEditboxSetString(scrHandle, MusicVolumeValueId, buf);
#endif
GfParmReleaseHandle(paramHandle);
}
@ -99,9 +144,23 @@ static void saveSoundOption(void *)
void *paramHandle = GfParmReadFile(buf, GFPARM_RMODE_REREAD | GFPARM_RMODE_CREAT);
GfParmSetStr(paramHandle, SND_SCT_SOUND, SND_ATT_SOUND_STATE, soundOptionList[curOption]);
GfParmSetNum(paramHandle, SND_SCT_SOUND, SND_ATT_SOUND_VOLUME, "%", VolumeValue);
#if MENU_MUSIC
GfParmSetStr(paramHandle, SND_SCT_MUSIC, SND_ATT_MUSIC_STATE, musicStateList[curMusicState]);
GfParmSetNum(paramHandle, SND_SCT_MUSIC, SND_ATT_MUSIC_VOLUME, "%", MusicVolumeValue);
#endif
GfParmWriteFile(NULL, paramHandle, "sound");
GfParmReleaseHandle(paramHandle);
#if MENU_MUSIC
// Shutdown the user interface.
LegacyMenu::self().shutdown();
// Restart the game.
GfuiApp().restart();
#endif
// Return to previous screen.
GfuiScreenActivate(prevHandle);
}
@ -130,6 +189,30 @@ static void changeVolume(void * )
GfuiEditboxSetString(scrHandle, VolumeValueId, buf);
}
#if MENU_MUSIC
// Toggle music state enabled/disabled.
static void changeMusicState(void *vp)
{
curMusicState = (curMusicState + (int)(long)vp + nbMusicStates) % nbMusicStates;
GfuiLabelSetText(scrHandle, MusicStateId, musicStateList[curMusicState]);
}
// Music Volume
static void changeMusicVolume(void * )
{
char* val = GfuiEditboxGetString(scrHandle, MusicVolumeValueId);
sscanf(val, "%g", &MusicVolumeValue);
if (MusicVolumeValue > 100.0f)
MusicVolumeValue = 100.0f;
else if (MusicVolumeValue < 0.0f)
MusicVolumeValue = 0.0f;
char buf[32];
sprintf(buf, "%g", MusicVolumeValue);
GfuiEditboxSetString(scrHandle, MusicVolumeValueId, buf);
}
#endif
static void onActivate(void * /* dummy */)
{
readSoundCfg();
@ -160,6 +243,23 @@ void* SoundMenuInit(void *prevMenu)
VolumeValueId = GfuiMenuCreateEditControl(scrHandle,param,"volumeedit",NULL,NULL,changeVolume);
#if MENU_MUSIC
// TODO remove this and uncomment the static controls in 'soundconfigmenu.xml'
// if/when Music is officially included
// HACK to allow CMake option 'OPTION_MENU_MUSIC' to show/hide these menu music labels
GfuiMenuCreateLabelControl(scrHandle,param,"musicstaticlabel");
GfuiMenuCreateLabelControl(scrHandle,param,"musicstaticvolume");
// end of code to remove
GfuiMenuCreateButtonControl(scrHandle,param,"musicleftarrow",(void*)-1,changeMusicState);
GfuiMenuCreateButtonControl(scrHandle,param,"musicrightarrow",(void*)1,changeMusicState);
MusicStateId = GfuiMenuCreateLabelControl(scrHandle,param,"musiclabel");
MusicVolumeValueId = GfuiMenuCreateEditControl(scrHandle,param,"musicvolumeedit",NULL,NULL,changeMusicVolume);
#endif
GfParmReleaseHandle(param);
GfuiAddKey(scrHandle, GFUIK_RETURN, "Apply", NULL, saveSoundOption, NULL);