From 74accec2754845bef981a82f220b8bf917e6e907 Mon Sep 17 00:00:00 2001 From: "wagic.the.homebrew@gmail.com" Date: Sat, 12 Dec 2009 15:10:32 +0000 Subject: [PATCH] Erwan - Fix issue 144 (Sound is either 0 or 100%), for PSP ONLY. The methods are now here for linux/windows, but only the music volume method will work currently, and it sets the volume globally. Patch by Yeshua with some cleanup by myself. --- JGE/include/JAudio.h | 175 +++++------ JGE/include/JSoundSystem.h | 405 +++++++++++++------------- JGE/lib/win/jge.lib | Bin 2255354 -> 2256842 bytes JGE/src/JAudio.cpp | 7 + JGE/src/JSfx.cpp | 19 +- JGE/src/linux/JSfx.cpp | 29 +- JGE/src/win/JSoundSystem_Win.cpp | 31 +- projects/mtg/src/Credits.cpp | 4 +- projects/mtg/src/GameApp.cpp | 6 +- projects/mtg/src/GameStateDuel.cpp | 2 +- projects/mtg/src/GameStateOptions.cpp | 3 + projects/mtg/src/OptionItem.cpp | 27 +- 12 files changed, 348 insertions(+), 360 deletions(-) diff --git a/JGE/include/JAudio.h b/JGE/include/JAudio.h index 4530b0c62..ebbb89d77 100644 --- a/JGE/include/JAudio.h +++ b/JGE/include/JAudio.h @@ -1,87 +1,88 @@ -//------------------------------------------------------------------------------------- -// -// JGE is a hardware accelerated 2D game SDK for PSP/Windows. -// -// Licensed under the BSD license, see LICENSE in JGE root for details. -// -// Copyright (c) 2007 James Hui (a.k.a. Dr.Watson) -// Copyright (c) 2007 Cooleyes -// Copyright (c) 2007 Mr.Cheese -// -//------------------------------------------------------------------------------------- - -#ifndef _JAUDIO_H_ -#define _JAUDIO_H_ - - -#include -#include -#include -#include - - -/////////////////////////////////////////////////////////////////// -#define PW_REPLAY 0x00000001 // -#define PW_DELAY 0x00000010 // -#define PW_FAST 0x00000100 // -#define PW_PAUSE 0x00001000 // - -#define NUMBER_WAV_CHANNELS 3 - -typedef struct _WAVDATA -{ - char fullName[256]; // filename - unsigned long fileSize; // size of file - short headSize; // size of head - unsigned short format; // - unsigned short channelCount; // - unsigned long samplePerSecond; // - unsigned long bytePerSecond; // - unsigned short bytePerSample; // - unsigned long soundSize; // - char* buffer; // sound data - SceUID fd; // file id for streaming - unsigned long bytePosition; // current read position - char nSample; // progress rate - unsigned long sizeStep; // - unsigned long flag; // playback flag - unsigned long delayTime; // delay time in (us) - -} WAVDATA; - - -/////////////////////////////////////////////////////////////////// -char loadWaveData(WAVDATA* p_wav, char* fileName, char memLoad); -void releaseWaveData(WAVDATA* p_wav); -void audioOutCallback(int channel, void* buf, unsigned int length); -void audioOutCallback_0(void* buf, unsigned int length, void *userdata); -void audioOutCallback_1(void* buf, unsigned int length, void *userdata); -void audioOutCallback_2(void* buf, unsigned int length, void *userdata); -//void audioOutCallback_3(void* buf, unsigned int length, void *userdata); -char playWaveFile(int channel, char* fullName, unsigned long flag); -void stopWaveFile(int channel); -int playWaveMem(WAVDATA* p_wav, unsigned long flag); -void stopWaveMem(int channel); -void audioInit(); -void audioDestroy(); -void setChannelFlag(int channel, int flag); - -////////////////////////////////////////////////////////////////////////// - - -#define DECODING_BUFFER_COUNT 2 -#define SAMPLE_PER_FRAME 1152 -#define MAX_MP3_FILE 2 - -class JMP3; - -void PlayMP3(JMP3 *mp3, bool looping = false); -void StopMP3(); -void ResumeMP3(JMP3 *mp3); - -void ReleaseMP3Decoder(); -void MP3AudioOutCallback(void* buf, unsigned int length, void *userdata); -int decodeThread2(SceSize args, void *argp); -extern bool g_MP3DecoderOK; - -#endif +//------------------------------------------------------------------------------------- +// +// JGE is a hardware accelerated 2D game SDK for PSP/Windows. +// +// Licensed under the BSD license, see LICENSE in JGE root for details. +// +// Copyright (c) 2007 James Hui (a.k.a. Dr.Watson) +// Copyright (c) 2007 Cooleyes +// Copyright (c) 2007 Mr.Cheese +// +//------------------------------------------------------------------------------------- + +#ifndef _JAUDIO_H_ +#define _JAUDIO_H_ + + +#include +#include +#include +#include + + +/////////////////////////////////////////////////////////////////// +#define PW_REPLAY 0x00000001 // +#define PW_DELAY 0x00000010 // +#define PW_FAST 0x00000100 // +#define PW_PAUSE 0x00001000 // + +#define NUMBER_WAV_CHANNELS 3 + +typedef struct _WAVDATA +{ + char fullName[256]; // filename + unsigned long fileSize; // size of file + short headSize; // size of head + unsigned short format; // + unsigned short channelCount; // + unsigned long samplePerSecond; // + unsigned long bytePerSecond; // + unsigned short bytePerSample; // + unsigned long soundSize; // + char* buffer; // sound data + SceUID fd; // file id for streaming + unsigned long bytePosition; // current read position + char nSample; // progress rate + unsigned long sizeStep; // + unsigned long flag; // playback flag + unsigned long delayTime; // delay time in (us) + +} WAVDATA; + + +/////////////////////////////////////////////////////////////////// +char loadWaveData(WAVDATA* p_wav, char* fileName, char memLoad); +void releaseWaveData(WAVDATA* p_wav); +void audioOutCallback(int channel, void* buf, unsigned int length); +void audioOutCallback_0(void* buf, unsigned int length, void *userdata); +void audioOutCallback_1(void* buf, unsigned int length, void *userdata); +void audioOutCallback_2(void* buf, unsigned int length, void *userdata); +//void audioOutCallback_3(void* buf, unsigned int length, void *userdata); +char playWaveFile(int channel, char* fullName, unsigned long flag); +void stopWaveFile(int channel); +int playWaveMem(WAVDATA* p_wav, unsigned long flag); +void stopWaveMem(int channel); +void audioInit(); +void audioDestroy(); +void setChannelFlag(int channel, int flag); +void setPspVolume(int volume); + +////////////////////////////////////////////////////////////////////////// + + +#define DECODING_BUFFER_COUNT 2 +#define SAMPLE_PER_FRAME 1152 +#define MAX_MP3_FILE 2 + +class JMP3; + +void PlayMP3(JMP3 *mp3, bool looping = false); +void StopMP3(); +void ResumeMP3(JMP3 *mp3); + +void ReleaseMP3Decoder(); +void MP3AudioOutCallback(void* buf, unsigned int length, void *userdata); +int decodeThread2(SceSize args, void *argp); +extern bool g_MP3DecoderOK; + +#endif diff --git a/JGE/include/JSoundSystem.h b/JGE/include/JSoundSystem.h index 5167132c7..1f522c14a 100644 --- a/JGE/include/JSoundSystem.h +++ b/JGE/include/JSoundSystem.h @@ -1,200 +1,205 @@ -//------------------------------------------------------------------------------------- -// -// JGE++ is a hardware accelerated 2D game SDK for PSP/Windows. -// -// Licensed under the BSD license, see LICENSE in JGE root for details. -// -// Copyright (c) 2007 James Hui (a.k.a. Dr.Watson) -// -//------------------------------------------------------------------------------------- - -#ifndef _JSOUNDSYSTEM_H_ -#define _JSOUNDSYSTEM_H_ - -#include -#include -#include -#include - -#include "JTypes.h" - - -#ifdef WIN32 - - #include -#elif defined (LINUX) -#else - - #include - #include - #include - #include - #include - #include - #include - #include - #include - - #include "JAudio.h" - #include "JMP3.h" - -#endif - - -//------------------------------------------------------------------------------------------------ -class JMusic -{ -public: - JMusic(); - ~JMusic(); - void Update(); - int getPlayTime(); - -#if defined (WIN32) || defined (LINUX) - FSOUND_SAMPLE *mTrack; // MP3 needed to be of "sample" type for FMOD, FMUSIC_MODULE is for MODs -#else - JMP3* mTrack; -#endif - -}; - - -//------------------------------------------------------------------------------------------------ -class JSample -{ -public: - JSample(); - ~JSample(); - - int mVoice; - -#if defined (WIN32) || defined (LINUX) - FSOUND_SAMPLE *mSample; -#else - WAVDATA *mSample; -#endif -}; - - -////////////////////////////////////////////////////////////////////////// -/// Sound engine for playing sound effects (WAV) and background -/// music (MP3). -/// -////////////////////////////////////////////////////////////////////////// -class JSoundSystem -{ - -public: - - ////////////////////////////////////////////////////////////////////////// - /// Get the singleton instance - /// - ////////////////////////////////////////////////////////////////////////// - static JSoundSystem* GetInstance(); - - static void Destroy(); - - - - ////////////////////////////////////////////////////////////////////////// - /// Load music. - /// - /// @note MP3 is the only supported format for the moment. - /// - /// @param filename - Name of the music file. - /// - ////////////////////////////////////////////////////////////////////////// - JMusic *LoadMusic(const char *fileName); - - ////////////////////////////////////////////////////////////////////////// - /// Delete music from memory. - /// - /// @param music - Music to be deleted. - /// - ////////////////////////////////////////////////////////////////////////// - //void FreeMusic(JMusic *music); - - ////////////////////////////////////////////////////////////////////////// - /// Play music. - /// - /// @param music - Music to be played. - /// @param looping - Play the music in a loop. - /// - ////////////////////////////////////////////////////////////////////////// - void PlayMusic(JMusic *music, bool looping = false); - - ////////////////////////////////////////////////////////////////////////// - /// Stop playing. - /// - /// @param music - Music to be stopped. - /// - ////////////////////////////////////////////////////////////////////////// - void StopMusic(JMusic *music); - - - ////////////////////////////////////////////////////////////////////////// - /// Resume playing. - /// - /// @param music - Music to be resumed. - /// - ////////////////////////////////////////////////////////////////////////// - void ResumeMusic(JMusic *music); - - ////////////////////////////////////////////////////////////////////////// - /// Load sound effect. - /// - /// @note WAV sound effect only. - /// - /// @param fileName - Sound effect for loading. - /// - ////////////////////////////////////////////////////////////////////////// - JSample *LoadSample(const char *fileName); - - ////////////////////////////////////////////////////////////////////////// - /// Delete sound effect from memory. - /// - /// @param sample - Sound to be deleted. - /// - ////////////////////////////////////////////////////////////////////////// - //void FreeSample(JSample *sample); - - ////////////////////////////////////////////////////////////////////////// - /// Play sound effect. - /// - /// @param sample - Sound for playing. - /// - ////////////////////////////////////////////////////////////////////////// - void PlaySample(JSample *sample); - - ////////////////////////////////////////////////////////////////////////// - /// Set volume for audio playback. - /// - /// @param volume - New volume. - /// - ////////////////////////////////////////////////////////////////////////// - void SetVolume(int volume); - - int mChannel; -protected: - JSoundSystem(); - ~JSoundSystem(); - - void InitSoundSystem(); - void DestroySoundSystem(); - -private: - -#ifdef WIN32 - - JMusic *mCurrentMusic; - -#endif - - int mVolume; - - - static JSoundSystem* mInstance; - -}; - -#endif +//------------------------------------------------------------------------------------- +// +// JGE++ is a hardware accelerated 2D game SDK for PSP/Windows. +// +// Licensed under the BSD license, see LICENSE in JGE root for details. +// +// Copyright (c) 2007 James Hui (a.k.a. Dr.Watson) +// +//------------------------------------------------------------------------------------- + +#ifndef _JSOUNDSYSTEM_H_ +#define _JSOUNDSYSTEM_H_ + +#include +#include +#include +#include + +#include "JTypes.h" + + +#ifdef WIN32 + + #include +#elif defined (LINUX) +#else + + #include + #include + #include + #include + #include + #include + #include + #include + #include + + #include "JAudio.h" + #include "JMP3.h" + +#endif + + +//------------------------------------------------------------------------------------------------ +class JMusic +{ +public: + JMusic(); + ~JMusic(); + void Update(); + int getPlayTime(); + +#if defined (WIN32) || defined (LINUX) + FSOUND_SAMPLE *mTrack; // MP3 needed to be of "sample" type for FMOD, FMUSIC_MODULE is for MODs +#else + JMP3* mTrack; +#endif + +}; + + +//------------------------------------------------------------------------------------------------ +class JSample +{ +public: + JSample(); + ~JSample(); + + int mVoice; + +#if defined (WIN32) || defined (LINUX) + FSOUND_SAMPLE *mSample; +#else + WAVDATA *mSample; +#endif +}; + + +////////////////////////////////////////////////////////////////////////// +/// Sound engine for playing sound effects (WAV) and background +/// music (MP3). +/// +////////////////////////////////////////////////////////////////////////// +class JSoundSystem +{ + +public: + + ////////////////////////////////////////////////////////////////////////// + /// Get the singleton instance + /// + ////////////////////////////////////////////////////////////////////////// + static JSoundSystem* GetInstance(); + + static void Destroy(); + + + + ////////////////////////////////////////////////////////////////////////// + /// Load music. + /// + /// @note MP3 is the only supported format for the moment. + /// + /// @param filename - Name of the music file. + /// + ////////////////////////////////////////////////////////////////////////// + JMusic *LoadMusic(const char *fileName); + + ////////////////////////////////////////////////////////////////////////// + /// Delete music from memory. + /// + /// @param music - Music to be deleted. + /// + ////////////////////////////////////////////////////////////////////////// + //void FreeMusic(JMusic *music); + + ////////////////////////////////////////////////////////////////////////// + /// Play music. + /// + /// @param music - Music to be played. + /// @param looping - Play the music in a loop. + /// + ////////////////////////////////////////////////////////////////////////// + void PlayMusic(JMusic *music, bool looping = false); + + ////////////////////////////////////////////////////////////////////////// + /// Stop playing. + /// + /// @param music - Music to be stopped. + /// + ////////////////////////////////////////////////////////////////////////// + void StopMusic(JMusic *music); + + + ////////////////////////////////////////////////////////////////////////// + /// Resume playing. + /// + /// @param music - Music to be resumed. + /// + ////////////////////////////////////////////////////////////////////////// + void ResumeMusic(JMusic *music); + + ////////////////////////////////////////////////////////////////////////// + /// Load sound effect. + /// + /// @note WAV sound effect only. + /// + /// @param fileName - Sound effect for loading. + /// + ////////////////////////////////////////////////////////////////////////// + JSample *LoadSample(const char *fileName); + + ////////////////////////////////////////////////////////////////////////// + /// Delete sound effect from memory. + /// + /// @param sample - Sound to be deleted. + /// + ////////////////////////////////////////////////////////////////////////// + //void FreeSample(JSample *sample); + + ////////////////////////////////////////////////////////////////////////// + /// Play sound effect. + /// + /// @param sample - Sound for playing. + /// + ////////////////////////////////////////////////////////////////////////// + void PlaySample(JSample *sample); + + ////////////////////////////////////////////////////////////////////////// + /// Set volume for audio playback. + /// + /// @param volume - New volume. + /// + ////////////////////////////////////////////////////////////////////////// + void SetVolume(int volume); + + void SetMusicVolume(int volume); + + void SetSfxVolume(int volume); + + int mChannel; +protected: + JSoundSystem(); + ~JSoundSystem(); + + void InitSoundSystem(); + void DestroySoundSystem(); + +private: + +#ifdef WIN32 + + JMusic *mCurrentMusic; + +#endif + + int mVolume; + int mMusicVolume; + + + static JSoundSystem* mInstance; + +}; + +#endif diff --git a/JGE/lib/win/jge.lib b/JGE/lib/win/jge.lib index 4f101ef2341293a7e4ea300f8fcbc48a0caf8ecc..98c6d66eaf134fd0f79aa0983f758881eeceef9b 100644 GIT binary patch delta 36974 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 PlayMP3(music->mTrack, looping); + JMP3 * mp3 = JMP3::mInstance; + if (mp3) mp3->setVolume((mMusicVolume * .01) *0x8000); + } @@ -157,11 +159,22 @@ void JSoundSystem::PlaySample(JSample *sample) playWaveMem(sample->mSample, 0); } +void JSoundSystem::SetVolume(int volume){ + SetMusicVolume(volume); + SetSfxVolume(volume); +} -void JSoundSystem::SetVolume(int volume) +void JSoundSystem::SetMusicVolume(int volume) { + mMusicVolume = volume; JMP3 * mp3 = JMP3::mInstance; - if (mp3) mp3->setVolume(volume); + if (mp3) mp3->setVolume((mMusicVolume * .01) *0x8000); +} + +void JSoundSystem::SetSfxVolume(int volume) +{ + setPspVolume((volume * .01) *0x8000); + } diff --git a/JGE/src/linux/JSfx.cpp b/JGE/src/linux/JSfx.cpp index 8d88deb37..06b47d161 100644 --- a/JGE/src/linux/JSfx.cpp +++ b/JGE/src/linux/JSfx.cpp @@ -129,23 +129,6 @@ JMusic *JSoundSystem::LoadMusic(const char *fileName) return music; } -// void JSoundSystem::FreeMusic(JMusic *music) -// { -// if (music) -// { -// // if (music->mTrack) -// // FMUSIC_FreeSong(music->mTrack); -// // delete music; -// // music = NULL; -// -// if (music->mTrack) -// FSOUND_Sample_Free(music->mTrack); -// -// //delete music; -// //music = NULL; -// } -// } - void JSoundSystem::PlayMusic(JMusic *music, bool looping) { // if (music && music->mTrack) @@ -176,14 +159,22 @@ void JSoundSystem::StopMusic(JMusic *music __attribute__((unused))) } -void JSoundSystem::SetVolume(int volume) +void JSoundSystem::SetVolume(int volume){ + SetMusicVolume(volume); + SetSfxVolume(volume); +} + +void JSoundSystem::SetMusicVolume(int volume) { + //TODO Fix to affect only mp3 playback... FSOUND_SetSFXMasterVolume(volume); mVolume = volume; } - +void JSoundSystem::SetSfxVolume(int volume){ + //TODO +} JSample *JSoundSystem::LoadSample(const char *fileName) diff --git a/JGE/src/win/JSoundSystem_Win.cpp b/JGE/src/win/JSoundSystem_Win.cpp index a7c01a2e6..4e5b2131b 100644 --- a/JGE/src/win/JSoundSystem_Win.cpp +++ b/JGE/src/win/JSoundSystem_Win.cpp @@ -136,22 +136,6 @@ JMusic *JSoundSystem::LoadMusic(const char *fileName) return music; } -// void JSoundSystem::FreeMusic(JMusic *music) -// { -// if (music) -// { -// // if (music->mTrack) -// // FMUSIC_FreeSong(music->mTrack); -// // delete music; -// // music = NULL; -// -// if (music->mTrack) -// FSOUND_Sample_Free(music->mTrack); -// -// //delete music; -// //music = NULL; -// } -// } void JSoundSystem::PlayMusic(JMusic *music, bool looping) { @@ -171,22 +155,27 @@ void JSoundSystem::PlayMusic(JMusic *music, bool looping) void JSoundSystem::StopMusic(JMusic *music) { - // if (music && music->mTrack) - // FMUSIC_StopSong(music->mTrack); - FSOUND_StopSound(mChannel); } void JSoundSystem::SetVolume(int volume) { + SetMusicVolume(volume); + SetSfxVolume(volume); +} + +void JSoundSystem::SetMusicVolume(int volume) +{ + //TODO This function needs to be redone FSOUND_SetSFXMasterVolume(volume); mVolume = volume; } - - +void JSoundSystem::SetSfxVolume(int volume){ + //TODO +} JSample *JSoundSystem::LoadSample(const char *fileName) { diff --git a/projects/mtg/src/Credits.cpp b/projects/mtg/src/Credits.cpp index e0b9a8cb7..187777974 100644 --- a/projects/mtg/src/Credits.cpp +++ b/projects/mtg/src/Credits.cpp @@ -116,7 +116,9 @@ void Credits::compute(Player * _p1, Player * _p2, GameApp * _app){ } if (unlocked && options[Options::SFXVOLUME].number > 0){ JSample * sample = resources.RetrieveSample("bonus.wav"); - if (sample) JSoundSystem::GetInstance()->PlaySample(sample); + if (sample){ + JSoundSystem::GetInstance()->PlaySample(sample); + } } } diff --git a/projects/mtg/src/GameApp.cpp b/projects/mtg/src/GameApp.cpp index f38fcab0a..98dd44cc6 100644 --- a/projects/mtg/src/GameApp.cpp +++ b/projects/mtg/src/GameApp.cpp @@ -181,7 +181,9 @@ void GameApp::Create() mCurrentState = NULL; mNextState = mGameStates[GAME_STATE_MENU]; - // effect = NEW CardEffect(); + //Set Audio volume + JSoundSystem::GetInstance()->SetSfxVolume(options[Options::SFXVOLUME].number); + JSoundSystem::GetInstance()->SetMusicVolume(options[Options::MUSICVOLUME].number); char buf[512]; sprintf(buf, "size of MTGCard : %i\n" , sizeof(MTGCard)); @@ -246,7 +248,7 @@ void GameApp::Update() return; } - //Restart Rendering engine when START and TRIANGLE ARE PRESSED SIMULTANEOUSLY + //Restart Rendering engine when START and SQUARE ARE PRESSED SIMULTANEOUSLY if (mEngine->GetButtonState(PSP_CTRL_START) && mEngine->GetButtonState(PSP_CTRL_SQUARE)){ JRenderer::Destroy(); } diff --git a/projects/mtg/src/GameStateDuel.cpp b/projects/mtg/src/GameStateDuel.cpp index 76b5aa172..11d46f824 100644 --- a/projects/mtg/src/GameStateDuel.cpp +++ b/projects/mtg/src/GameStateDuel.cpp @@ -327,7 +327,7 @@ void GameStateDuel::Update(float dt) if (MusicExist(musictrack)){ GameApp::music = resources.ssLoadMusic(musictrack.c_str()); - JSoundSystem::GetInstance()->PlayMusic(GameApp::music, true); + JSoundSystem::GetInstance()->PlayMusic(GameApp::music, true); } } //end of music code diff --git a/projects/mtg/src/GameStateOptions.cpp b/projects/mtg/src/GameStateOptions.cpp index 185272f3a..f0ea6b4c2 100644 --- a/projects/mtg/src/GameStateOptions.cpp +++ b/projects/mtg/src/GameStateOptions.cpp @@ -195,6 +195,9 @@ void GameStateOptions::ButtonPressed(int controllerId, int controlId) switch (controlId){ case 1: optionsTabs->save(); + //Set Audio volume + JSoundSystem::GetInstance()->SetSfxVolume(options[Options::SFXVOLUME].number); + JSoundSystem::GetInstance()->SetMusicVolume(options[Options::MUSICVOLUME].number); case 2: mParent->SetNextState(GAME_STATE_MENU); break; diff --git a/projects/mtg/src/OptionItem.cpp b/projects/mtg/src/OptionItem.cpp index f560e8392..304b7451e 100644 --- a/projects/mtg/src/OptionItem.cpp +++ b/projects/mtg/src/OptionItem.cpp @@ -1090,31 +1090,6 @@ void WGuiMenu::Add(WGuiBase * it){ items.push_back(it); } -//WGuiMenu -/* -void WGuiMenu::Update(float dt){ - JGE * mEngine = JGE::GetInstance(); - - WGuiBase * c = Current(); - if(c && !c->isModal()){ - if (mEngine->GetButtonClick(buttonPrev)){ - if (currentItem > 0 && c->Leaving(buttonPrev)){ - currentItem--; - c = Current(); - c->Entering(buttonPrev); - } - } - else if (mEngine->GetButtonClick(buttonNext)){ - if (currentItem < (int)items.size()-1 && c->Leaving(buttonNext)){ - currentItem++; - c = Current(); - c->Entering(buttonNext); - } - } - } - if(c) - c->Update(dt); -}*/ void WGuiMenu::Update(float dt){ @@ -1238,7 +1213,7 @@ void WGuiTabMenu::Render(){ void WGuiTabMenu::save(){ confirmChange(true); - setData(); + setData(); ::options.save(); }