forked from speed-dreams/speed-dreams-code
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:
parent
0ebb48b7b5
commit
3d81f5fb84
4 changed files with 203 additions and 9 deletions
|
@ -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
|
||||
}
|
|
@ -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, ¤tVol);
|
||||
currentVol += FADESTEP;
|
||||
if(currentVol >= maxVolume){
|
||||
currentVol = maxVolume;
|
||||
fadestate = NONE;
|
||||
}
|
||||
alSourcef(source, AL_GAIN, currentVol);
|
||||
|
||||
break;
|
||||
case FADEOUT:
|
||||
alGetSourcef(source, AL_GAIN, ¤tVol);
|
||||
currentVol -= FADESTEP;
|
||||
if(currentVol <= 0.0){
|
||||
currentVol = 0.0;
|
||||
fadestate = NONE;
|
||||
}
|
||||
alSourcef(source, AL_GAIN, currentVol);
|
||||
break;
|
||||
case NONE:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
|
@ -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__
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue