1
1
forked from 0ad/0ad

add UI sound channel, clean up external interface and javascript calls

This was SVN commit r13467.
This commit is contained in:
stwf 2013-06-10 13:58:43 +00:00
parent 29549561e1
commit ada7702bec
12 changed files with 220 additions and 238 deletions

View File

@ -120,8 +120,7 @@ sound.mastergain = 0.9
sound.musicgain = 0.2
sound.ambientgain = 0.6
sound.actiongain = 0.7
sound.bufferCount = 50
sound.bufferSize = 98304
sound.uigain = 0.7
; Camera control settings
view.scroll.speed = 120.0

View File

@ -152,18 +152,12 @@ Music.prototype.startPlayList = function(tracks, fadeInPeriod, isLooping)
Engine.AddPlaylistItem( this.RELATIVE_MUSIC_PATH + tracks[i] );
}
if (isLooping)
Engine.LoopPlaylist();
else
Engine.PlayPlaylist();
Engine.StartPlaylist(isLooping);
};
Music.prototype.switchMusic = function(track, fadeInPeriod, isLooping)
{
if (isLooping)
Engine.LoopMusic(this.RELATIVE_MUSIC_PATH + track);
else
Engine.PlayMusic(this.RELATIVE_MUSIC_PATH + track);
Engine.PlayMusic(this.RELATIVE_MUSIC_PATH + track, isLooping);
};
Music.prototype.isPlaying = function()

View File

@ -636,7 +636,7 @@ function playRandomAmbient(type)
// currentAmbient = newRandomSound("ambient", "temperate_", "dayscape");
const AMBIENT = "audio/ambient/dayscape/day_temperate_gen_03.ogg";
Engine.LoopAmbientSound( AMBIENT );
Engine.PlayAmbientSound( AMBIENT, true );
break;
default:

View File

@ -111,25 +111,17 @@ static void LoadGlobals()
float musicGain = 0.5f;
float ambientGain = 0.5f;
float actionGain = 0.5f;
int bufferCount = 50;
unsigned long bufferSize = 65536;
float uiGain = 0.5f;
CFG_GET_VAL("sound.mastergain", Float, gain);
CFG_GET_VAL("sound.musicgain", Float, musicGain);
CFG_GET_VAL("sound.ambientgain", Float, ambientGain);
CFG_GET_VAL("sound.actiongain", Float, actionGain);
CFG_GET_VAL("sound.uigain", Float, uiGain);
CFG_GET_VAL("sound.bufferCount", Int, bufferCount);
CFG_GET_VAL("sound.bufferSize", UnsignedLong, bufferSize);
if (g_SoundManager)
g_SoundManager->SetGains(gain, musicGain, ambientGain, actionGain, uiGain);
if (g_SoundManager) {
g_SoundManager->SetMasterGain(gain);
g_SoundManager->SetMusicGain(musicGain);
g_SoundManager->SetAmbientGain(ambientGain);
g_SoundManager->SetActionGain(actionGain);
g_SoundManager->SetMemoryUsage(bufferSize, bufferCount);
}
#endif // CONFIG2_AUDIO
CFG_GET_VAL("jsdebugger.enable", Bool, g_JSDebuggerEnabled);

View File

@ -19,31 +19,30 @@
#define INCLUDED_ISOUNDMANAGER_H
#include "lib/config2.h"
#include "lib/file/vfs/vfs_path.h"
#if CONFIG2_AUDIO
class CSoundManagerWorker;
class ISoundManager
{
public:
virtual ~ISoundManager() {};
virtual void IdleTask() = 0;
virtual void Pause(bool pauseIt) = 0;
virtual void SetMemoryUsage(long bufferSize, int bufferCount) = 0;
virtual void SetMasterGain(float gain) = 0;
virtual void SetMusicGain(float gain) = 0;
virtual void SetAmbientGain(float gain) = 0;
virtual void SetActionGain(float gain) = 0;
static void CreateSoundManager();
static void SetEnabled(bool doEnable);
virtual void IdleTask() = 0;
virtual void Pause(bool pauseIt) = 0;
virtual void SetGains(float masterG, float musicG, float ambientG, float actionG, float uiG ) = 0;
virtual void PlayAsUI(const VfsPath& itemPath, bool looping) = 0;
virtual void PlayAsMusic(const VfsPath& itemPath, bool looping) = 0;
virtual void PlayAsAmbient(const VfsPath& itemPath, bool looping) = 0;
virtual bool InDistress() = 0;
virtual long GetBufferCount() = 0;
virtual long GetBufferSize() = 0;
};
#else // !CONFIG2_AUDIO

View File

@ -248,8 +248,9 @@ CSoundManager::CSoundManager()
m_MusicGain = 1;
m_AmbientGain = 1;
m_ActionGain = 1;
m_UIGain = 1;
m_BufferCount = 50;
m_BufferSize = 65536;
m_BufferSize = 98304;
m_SoundEnabled = true;
m_MusicEnabled = true;
m_MusicPaused = false;
@ -434,11 +435,6 @@ void CSoundManager::ReleaseALSource(ALuint theSource)
}
}
void CSoundManager::SetMemoryUsage(long bufferSize, int bufferCount)
{
m_BufferCount = bufferCount;
m_BufferSize = bufferSize;
}
long CSoundManager::GetBufferCount()
{
return m_BufferCount;
@ -487,6 +483,16 @@ void CSoundManager::StartPlayList( bool doLoop )
}
void CSoundManager::SetGains(float masterG, float musicG, float ambientG, float actionG, float uiG )
{
SetMasterGain( masterG );
SetMusicGain( musicG );
SetAmbientGain( ambientG );
SetActionGain( actionG );
SetUIGain( uiG );
}
void CSoundManager::SetMasterGain(float gain)
{
if ( m_Enabled )
@ -509,6 +515,10 @@ void CSoundManager::SetActionGain(float gain)
{
m_ActionGain = gain;
}
void CSoundManager::SetUIGain(float gain)
{
m_UIGain = gain;
}
ISoundItem* CSoundManager::LoadItem(const VfsPath& itemPath)
@ -624,19 +634,6 @@ void CSoundManager::InitListener()
alDistanceModel(AL_LINEAR_DISTANCE);
}
void CSoundManager::PlayActionItem(ISoundItem* anItem)
{
if (anItem)
{
if (m_Enabled && (m_ActionGain > 0))
{
anItem->SetGain( m_ActionGain );
anItem->Play();
AL_CHECK
}
}
}
void CSoundManager::PlayGroupItem(ISoundItem* anItem, ALfloat groupGain )
{
if (anItem)
@ -659,6 +656,78 @@ void CSoundManager::SetMusicEnabled (bool isEnabled)
m_MusicEnabled = isEnabled;
}
void CSoundManager::PlayAsMusic( const VfsPath& itemPath, bool looping )
{
UNUSED2( looping );
ISoundItem* aSnd = LoadItem(itemPath);
if (aSnd != NULL)
SetMusicItem( aSnd );
}
void CSoundManager::PlayAsAmbient( const VfsPath& itemPath, bool looping )
{
UNUSED2( looping );
ISoundItem* aSnd = LoadItem(itemPath);
if (aSnd != NULL)
SetAmbientItem( aSnd );
}
void CSoundManager::PlayAsUI(const VfsPath& itemPath, bool looping)
{
IdleTask();
if ( ISoundItem* anItem = LoadItem(itemPath) )
{
if (m_Enabled && (m_UIGain > 0))
{
anItem->SetGain(m_UIGain);
anItem->SetLooping( looping );
anItem->PlayAndDelete();
}
}
AL_CHECK
}
void CSoundManager::Pause(bool pauseIt)
{
PauseMusic(pauseIt);
PauseAmbient(pauseIt);
PauseAction(pauseIt);
}
void CSoundManager::PauseMusic (bool pauseIt)
{
if (m_CurrentTune && pauseIt && !m_MusicPaused )
{
m_CurrentTune->FadeAndPause( 1.0 );
}
else if ( m_CurrentTune && m_MusicPaused && !pauseIt && m_MusicEnabled )
{
m_CurrentTune->SetGain(0);
m_CurrentTune->Resume();
m_CurrentTune->FadeToIn( m_MusicGain, 1.0);
}
m_MusicPaused = pauseIt;
}
void CSoundManager::PauseAmbient (bool pauseIt)
{
if (m_CurrentEnvirons && pauseIt)
m_CurrentEnvirons->Pause();
else if ( m_CurrentEnvirons )
m_CurrentEnvirons->Resume();
m_AmbientPaused = pauseIt;
}
void CSoundManager::PauseAction (bool pauseIt)
{
m_ActionPaused = pauseIt;
}
void CSoundManager::SetMusicItem(ISoundItem* anItem)
{
AL_CHECK
@ -717,44 +786,5 @@ void CSoundManager::SetAmbientItem(ISoundItem* anItem)
AL_CHECK
}
void CSoundManager::Pause(bool pauseIt)
{
PauseMusic(pauseIt);
PauseAmbient(pauseIt);
PauseAction(pauseIt);
}
void CSoundManager::PauseMusic (bool pauseIt)
{
if (m_CurrentTune && pauseIt && !m_MusicPaused )
{
m_CurrentTune->FadeAndPause( 1.0 );
}
else if ( m_CurrentTune && m_MusicPaused && !pauseIt && m_MusicEnabled )
{
m_CurrentTune->SetGain(0);
m_CurrentTune->Resume();
m_CurrentTune->FadeToIn( m_MusicGain, 1.0);
}
m_MusicPaused = pauseIt;
}
void CSoundManager::PauseAmbient (bool pauseIt)
{
if (m_CurrentEnvirons && pauseIt)
m_CurrentEnvirons->Pause();
else if ( m_CurrentEnvirons )
m_CurrentEnvirons->Resume();
m_AmbientPaused = pauseIt;
}
void CSoundManager::PauseAction (bool pauseIt)
{
m_ActionPaused = pauseIt;
}
#endif // CONFIG2_AUDIO

View File

@ -71,6 +71,7 @@ protected:
float m_MusicGain;
float m_AmbientGain;
float m_ActionGain;
float m_UIGain;
bool m_Enabled;
long m_BufferSize;
int m_BufferCount;
@ -127,15 +128,13 @@ public:
long GetBufferCount();
long GetBufferSize();
void SetMusicItem(ISoundItem* anItem);
void SetAmbientItem(ISoundItem* anItem);
void PlayActionItem(ISoundItem* anItem);
void PlayGroupItem(ISoundItem* anItem, ALfloat groupGain);
void PlayAsMusic( const VfsPath& itemPath, bool looping );
void PlayAsAmbient( const VfsPath& itemPath, bool looping );
void PlayAsUI(const VfsPath& itemPath, bool looping);
void PlayGroupItem(ISoundItem* anItem, ALfloat groupGain);
void SetGains(float masterG, float musicG, float ambientG, float actionG, float uiG );
void SetMasterGain(float gain);
void SetMusicGain(float gain);
void SetAmbientGain(float gain);
void SetActionGain(float gain);
bool InDistress();
void SetDistressThroughShortage();
void SetDistressThroughError();
@ -147,7 +146,14 @@ public:
protected:
void InitListener();
virtual Status AlcInit();
Status AlcInit();
void SetMusicItem(ISoundItem* anItem);
void SetAmbientItem(ISoundItem* anItem);
void SetMasterGain(float gain);
void SetMusicGain(float gain);
void SetAmbientGain(float gain);
void SetActionGain(float gain);
void SetUIGain(float gain);
private:
CSoundManager(CSoundManager* UNUSED(other)){};

View File

@ -61,37 +61,41 @@ bool COggData::IsStereo()
bool COggData::InitOggFile(const VfsPath& itemPath)
{
int buffersToStart = g_SoundManager->GetBufferCount();
if ( OpenOggNonstream( g_VFS, itemPath, ogg) == INFO::OK )
{
m_FileFinished = false;
if ( CSoundManager* sndManager = (CSoundManager*)g_SoundManager )
{
int buffersToStart = sndManager->GetBufferCount();
if ( OpenOggNonstream( g_VFS, itemPath, ogg) == INFO::OK )
{
m_FileFinished = false;
SetFormatAndFreq(ogg->Format(), ogg->SamplingRate() );
SetFileName( itemPath );
AL_CHECK
SetFormatAndFreq(ogg->Format(), ogg->SamplingRate() );
SetFileName( itemPath );
alGenBuffers(buffersToStart, m_Buffer);
if(alGetError() != AL_NO_ERROR)
{
LOGERROR( L"- Error creating initial buffer !!\n");
return false;
}
else
{
m_BuffersUsed = FetchDataIntoBuffer(buffersToStart, m_Buffer);
if (m_FileFinished)
{
m_OneShot = true;
if (m_BuffersUsed < buffersToStart)
{
alDeleteBuffers(buffersToStart - m_BuffersUsed, &m_Buffer[m_BuffersUsed]);
}
}
AL_CHECK
}
return true;
alGenBuffers(buffersToStart, m_Buffer);
if(alGetError() != AL_NO_ERROR)
{
LOGERROR( L"- Error creating initial buffer !!\n");
return false;
}
else
{
m_BuffersUsed = FetchDataIntoBuffer(buffersToStart, m_Buffer);
if (m_FileFinished)
{
m_OneShot = true;
if (m_BuffersUsed < buffersToStart)
{
alDeleteBuffers(buffersToStart - m_BuffersUsed, &m_Buffer[m_BuffersUsed]);
}
}
AL_CHECK
}
return true;
}
return false;
}
return false;
}
@ -119,24 +123,28 @@ bool COggData::IsOneShot()
int COggData::FetchDataIntoBuffer(int count, ALuint* buffers)
{
long bufferSize = g_SoundManager->GetBufferSize();
u8* pcmout = new u8[bufferSize + 5000];
int buffersWritten = 0;
for (int i = 0; (i < count) && !m_FileFinished; i++)
{
memset( pcmout, 0, bufferSize + 5000 );
Status totalRet = ogg->GetNextChunk( pcmout, bufferSize);
m_FileFinished = ogg->atFileEOF();
if (totalRet > 0)
if ( CSoundManager* sndManager = (CSoundManager*)g_SoundManager )
{
long bufferSize = sndManager->GetBufferSize();
u8* pcmout = new u8[bufferSize + 5000];
int buffersWritten = 0;
for (int i = 0; (i < count) && !m_FileFinished; i++)
{
buffersWritten++;
alBufferData(buffers[i], m_Format, pcmout, (ALsizei)totalRet, (int)m_Frequency);
memset( pcmout, 0, bufferSize + 5000 );
Status totalRet = ogg->GetNextChunk( pcmout, bufferSize);
m_FileFinished = ogg->atFileEOF();
if (totalRet > 0)
{
buffersWritten++;
alBufferData(buffers[i], m_Format, pcmout, (ALsizei)totalRet, (int)m_Frequency);
}
}
delete[] pcmout;
return buffersWritten;
}
delete[] pcmout;
return buffersWritten;
return 0;
}

View File

@ -346,16 +346,6 @@ void CSoundBase::FadeToIn(ALfloat newVolume, double fadeDuration)
}
}
void CSoundBase::PlayAsMusic()
{
((CSoundManager*)g_SoundManager)->SetMusicItem(this);
}
void CSoundBase::PlayAsAmbient()
{
((CSoundManager*)g_SoundManager)->SetAmbientItem(this);
}
void CSoundBase::Stop()
{
m_ShouldBePlaying = false;

View File

@ -73,8 +73,6 @@ public:
void StopAndDelete();
void FadeToIn(ALfloat newVolume, double fadeDuration);
void PlayAsMusic();
void PlayAsAmbient();
bool GetLooping();
bool IsPlaying();

View File

@ -47,8 +47,6 @@ public:
virtual void Attach(CSoundData* itemData) = 0;
virtual void EnsurePlay() = 0;
virtual void PlayAsMusic() = 0;
virtual void PlayAsAmbient() = 0;
virtual void PlayAndDelete() = 0;
virtual void StopAndDelete() = 0;

View File

@ -29,121 +29,89 @@
namespace JSI_Sound
{
#if CONFIG2_AUDIO
void StartMusic(void* UNUSED(cbdata))
{
#if CONFIG2_AUDIO
CSoundManager* sndManager = (CSoundManager*)g_SoundManager;
if ( sndManager )
if ( CSoundManager* sndManager = (CSoundManager*)g_SoundManager )
sndManager->SetMusicEnabled(true);
#endif
}
void StopMusic(void* UNUSED(cbdata))
{
#if CONFIG2_AUDIO
CSoundManager* sndManager = (CSoundManager*)g_SoundManager;
if ( sndManager )
if ( CSoundManager* sndManager = (CSoundManager*)g_SoundManager )
sndManager->SetMusicEnabled(false);
#endif
}
void ClearPlaylist(void* UNUSED(cbdata))
{
#if CONFIG2_AUDIO
CSoundManager* sndManager = (CSoundManager*)g_SoundManager;
if ( sndManager )
if ( CSoundManager* sndManager = (CSoundManager*)g_SoundManager )
sndManager->ClearPlayListItems();
#endif
}
void AddPlaylistItem(void* UNUSED(cbdata), std::wstring filename)
{
#if CONFIG2_AUDIO
CSoundManager* sndManager = (CSoundManager*)g_SoundManager;
if ( sndManager )
{
if ( CSoundManager* sndManager = (CSoundManager*)g_SoundManager )
sndManager->AddPlayListItem( new VfsPath( filename ) );
#else
UNUSED2(filename);
#endif
}
void LoopPlaylist(void* UNUSED(cbdata))
void StartPlaylist(void* UNUSED(cbdata), bool looping)
{
#if CONFIG2_AUDIO
CSoundManager* sndManager = (CSoundManager*)g_SoundManager;
if ( sndManager )
sndManager->StartPlayList( true );
#endif
}
void PlayPlaylist(void* UNUSED(cbdata))
{
#if CONFIG2_AUDIO
CSoundManager* sndManager = (CSoundManager*)g_SoundManager;
if ( sndManager )
sndManager->StartPlayList( false );
#endif
if ( CSoundManager* sndManager = (CSoundManager*)g_SoundManager )
sndManager->StartPlayList( looping );
}
void LoopMusic(void* UNUSED(cbdata), std::wstring filename)
void PlayMusic(void* UNUSED(cbdata), std::wstring filename, bool looping)
{
#if CONFIG2_AUDIO
if ( g_SoundManager ) {
CSoundManager* sndManager = (CSoundManager*)g_SoundManager;
ISoundItem* aSnd = sndManager->LoadItem(filename);
if (aSnd != NULL)
aSnd->PlayAsMusic();
}
#else
UNUSED2(filename);
#endif // CONFIG2_AUDIO
}
void PlayMusic(void* UNUSED(cbdata), std::wstring filename)
{
#if CONFIG2_AUDIO
if ( g_SoundManager ) {
CSoundManager* sndManager = (CSoundManager*)g_SoundManager;
ISoundItem* aSnd = sndManager->LoadItem(filename);
if (aSnd != NULL)
aSnd->PlayAsMusic();
}
#else
UNUSED2(filename);
#endif // CONFIG2_AUDIO
if ( CSoundManager* sndManager = (CSoundManager*)g_SoundManager )
sndManager->PlayAsMusic( filename, looping);
}
void LoopAmbientSound(void* UNUSED(cbdata), std::wstring filename)
void PlayUISound(void* UNUSED(cbdata), std::wstring filename, bool looping)
{
#if CONFIG2_AUDIO
if ( g_SoundManager ) {
CSoundManager* sndManager = (CSoundManager*)g_SoundManager;
ISoundItem* aSnd = sndManager->LoadItem(filename);
if (aSnd != NULL)
aSnd->PlayAsAmbient();
}
#else
UNUSED2(filename);
#endif // CONFIG2_AUDIO
if ( CSoundManager* sndManager = (CSoundManager*)g_SoundManager )
sndManager->PlayAsUI( filename, looping);
}
void PlayAmbientSound(void* UNUSED(cbdata), std::wstring filename, bool looping)
{
if ( CSoundManager* sndManager = (CSoundManager*)g_SoundManager )
sndManager->PlayAsAmbient( filename, looping);
}
bool MusicPlaying(void* UNUSED(cbdata))
{
#if CONFIG2_AUDIO
return true;
#else
return false;
#endif // CONFIG2_AUDIO
}
#else
bool MusicPlaying(void* UNUSED(cbdata) ){}
void PlayAmbientSound(void* UNUSED(cbdata), std::wstring UNUSED(filename), bool UNUSED(looping) ){}
void PlayUISound(void* UNUSED(cbdata), std::wstring UNUSED(filename), bool UNUSED(looping) ) {}
void PlayMusic(void* UNUSED(cbdata), std::wstring UNUSED(filename), bool UNUSED(looping) ) {}
void StartPlaylist(void* UNUSED(cbdata), bool UNUSED(looping) ){}
void AddPlaylistItem(void* UNUSED(cbdata), std::wstring UNUSED(filename) ){}
void ClearPlaylist(void* UNUSED(cbdata) ){}
void StopMusic(void* UNUSED(cbdata) ){}
void StartMusic(void* UNUSED(cbdata) ){}
#endif
void RegisterScriptFunctions(ScriptInterface& scriptInterface)
{
scriptInterface.RegisterFunction<void, &StartMusic>("StartMusic");
scriptInterface.RegisterFunction<void, &StopMusic>("StopMusic");
scriptInterface.RegisterFunction<void, &ClearPlaylist>("ClearPlaylist");
scriptInterface.RegisterFunction<void, std::wstring, &AddPlaylistItem>("AddPlaylistItem");
scriptInterface.RegisterFunction<void, &LoopPlaylist>("LoopPlaylist");
scriptInterface.RegisterFunction<void, &PlayPlaylist>("PlayPlaylist");
scriptInterface.RegisterFunction<void, std::wstring, &LoopMusic>("LoopMusic");
scriptInterface.RegisterFunction<void, std::wstring, &PlayMusic>("PlayMusic");
scriptInterface.RegisterFunction<void, std::wstring, &LoopAmbientSound>("LoopAmbientSound");
scriptInterface.RegisterFunction<void, bool, &StartPlaylist>("StartPlaylist");
scriptInterface.RegisterFunction<void, std::wstring, bool, &PlayMusic>("PlayMusic");
scriptInterface.RegisterFunction<void, std::wstring, bool, &PlayUISound>("PlayUISound");
scriptInterface.RegisterFunction<void, std::wstring, bool, &PlayAmbientSound>("PlayAmbientSound");
scriptInterface.RegisterFunction<bool, &MusicPlaying>("MusicPlaying");
}
}
}