Fixes rare crash in sound manager, due to worker thread dereferencing global pointer before it had been assigned. Fixes #2333, refs #2387, #2317.
Fixes potential infinite loop if worker thread was running but not enabled. Fixes apparent bug in fading sound smoothness. Cleans up worker class slightly. Cleans up weird and inconsistent whitespace. This was SVN commit r15269.
This commit is contained in:
parent
c17bf75cbb
commit
a63ed4e4c4
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2013 Wildfire Games.
|
||||
/* Copyright (C) 2014 Wildfire Games.
|
||||
* This file is part of 0 A.D.
|
||||
*
|
||||
* 0 A.D. is free software: you can redistribute it and/or modify
|
||||
@ -26,29 +26,30 @@ class CVector3D;
|
||||
|
||||
class ISoundManager
|
||||
{
|
||||
|
||||
public:
|
||||
virtual ~ISoundManager() {};
|
||||
virtual ~ISoundManager() {};
|
||||
|
||||
static void CreateSoundManager();
|
||||
static void SetEnabled(bool doEnable);
|
||||
static void CloseGame();
|
||||
static void CreateSoundManager();
|
||||
static void SetEnabled(bool doEnable);
|
||||
static void CloseGame();
|
||||
|
||||
virtual void IdleTask() = 0;
|
||||
virtual void Pause(bool pauseIt) = 0;
|
||||
virtual void StartWorker() = 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;
|
||||
virtual void SetUIGain(float gain) = 0;
|
||||
virtual void IdleTask() = 0;
|
||||
virtual void Pause(bool pauseIt) = 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 void PlayAsGroup(const VfsPath& groupPath, CVector3D sourcePos, entity_id_t source, bool ownedSound) = 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;
|
||||
virtual void SetUIGain(float gain) = 0;
|
||||
|
||||
virtual bool InDistress() = 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 void PlayAsGroup(const VfsPath& groupPath, CVector3D sourcePos, entity_id_t source, bool ownedSound) = 0;
|
||||
|
||||
virtual bool InDistress() = 0;
|
||||
};
|
||||
|
||||
extern ISoundManager* g_SoundManager;
|
||||
|
@ -19,21 +19,20 @@
|
||||
|
||||
#include "ISoundManager.h"
|
||||
#include "SoundManager.h"
|
||||
#include "data/SoundData.h"
|
||||
#include "items/CBufferItem.h"
|
||||
#include "items/CSoundItem.h"
|
||||
#include "items/CStreamItem.h"
|
||||
|
||||
#include "ps/Filesystem.h"
|
||||
|
||||
#include "soundmanager/data/SoundData.h"
|
||||
#include "soundmanager/items/CSoundItem.h"
|
||||
#include "soundmanager/items/CBufferItem.h"
|
||||
#include "soundmanager/items/CStreamItem.h"
|
||||
#include "lib/external_libraries/libsdl.h"
|
||||
#include "ps/CLogger.h"
|
||||
#include "ps/CStr.h"
|
||||
#include "ps/Filesystem.h"
|
||||
#include "ps/Profiler2.h"
|
||||
|
||||
ISoundManager* g_SoundManager = NULL;
|
||||
|
||||
#define SOURCE_NUM 64
|
||||
#define SOURCE_NUM 64
|
||||
|
||||
#if CONFIG2_AUDIO
|
||||
|
||||
@ -47,7 +46,6 @@ public:
|
||||
m_Items = new ItemsList;
|
||||
m_DeadItems = new ItemsList;
|
||||
m_Shutdown = false;
|
||||
m_Enabled = false;
|
||||
|
||||
int ret = pthread_create(&m_WorkerThread, NULL, &RunThread, this);
|
||||
ENSURE(ret == 0);
|
||||
@ -60,22 +58,12 @@ public:
|
||||
delete m_DeadItems;
|
||||
}
|
||||
|
||||
void SetEnabled(bool enabled)
|
||||
{
|
||||
CScopeLock lock(m_WorkerMutex);
|
||||
if (enabled != m_Enabled)
|
||||
{
|
||||
m_Enabled = enabled;
|
||||
}
|
||||
}
|
||||
|
||||
bool Shutdown()
|
||||
{
|
||||
{
|
||||
CScopeLock lock(m_WorkerMutex);
|
||||
|
||||
m_Shutdown = true;
|
||||
m_Enabled = false;
|
||||
|
||||
ItemsList::iterator lstr = m_Items->begin();
|
||||
while (lstr != m_Items->end())
|
||||
@ -91,10 +79,10 @@ public:
|
||||
return true;
|
||||
}
|
||||
|
||||
void addItem( ISoundItem* anItem )
|
||||
void addItem(ISoundItem* anItem)
|
||||
{
|
||||
CScopeLock lock(m_WorkerMutex);
|
||||
m_Items->push_back( anItem );
|
||||
m_Items->push_back(anItem);
|
||||
}
|
||||
|
||||
void CleanupItems()
|
||||
@ -103,7 +91,7 @@ public:
|
||||
AL_CHECK
|
||||
ItemsList::iterator deadItems = m_DeadItems->begin();
|
||||
while (deadItems != m_DeadItems->end())
|
||||
{
|
||||
{
|
||||
delete *deadItems;
|
||||
++deadItems;
|
||||
|
||||
@ -125,20 +113,14 @@ private:
|
||||
|
||||
void Run()
|
||||
{
|
||||
while ( true )
|
||||
while (true)
|
||||
{
|
||||
g_Profiler2.RecordRegionLeave("semaphore wait");
|
||||
|
||||
// Handle shutdown requests as soon as possible
|
||||
if (GetShutdown())
|
||||
return;
|
||||
|
||||
// If we're not enabled, ignore this wakeup
|
||||
if (!GetEnabled())
|
||||
continue;
|
||||
|
||||
int pauseTime = 500;
|
||||
if ( g_SoundManager->InDistress() )
|
||||
if (g_SoundManager->InDistress())
|
||||
pauseTime = 50;
|
||||
|
||||
{
|
||||
@ -147,13 +129,12 @@ private:
|
||||
ItemsList::iterator lstr = m_Items->begin();
|
||||
ItemsList* nextItemList = new ItemsList;
|
||||
|
||||
|
||||
while (lstr != m_Items->end()) {
|
||||
|
||||
while (lstr != m_Items->end())
|
||||
{
|
||||
AL_CHECK
|
||||
if ((*lstr)->IdleTask())
|
||||
{
|
||||
if ( (pauseTime == 1000) && (*lstr)->IsFading() )
|
||||
if ((pauseTime == 500) && (*lstr)->IsFading())
|
||||
pauseTime = 100;
|
||||
|
||||
nextItemList->push_back(*lstr);
|
||||
@ -173,24 +154,16 @@ private:
|
||||
|
||||
AL_CHECK
|
||||
}
|
||||
SDL_Delay( pauseTime );
|
||||
SDL_Delay(pauseTime);
|
||||
}
|
||||
}
|
||||
|
||||
bool GetEnabled()
|
||||
{
|
||||
CScopeLock lock(m_WorkerMutex);
|
||||
return m_Enabled;
|
||||
}
|
||||
|
||||
bool GetShutdown()
|
||||
{
|
||||
CScopeLock lock(m_WorkerMutex);
|
||||
return m_Shutdown;
|
||||
}
|
||||
|
||||
|
||||
|
||||
private:
|
||||
// Thread-related members:
|
||||
pthread_t m_WorkerThread;
|
||||
@ -202,7 +175,6 @@ private:
|
||||
ItemsList* m_Items;
|
||||
ItemsList* m_DeadItems;
|
||||
|
||||
bool m_Enabled;
|
||||
bool m_Shutdown;
|
||||
|
||||
CSoundManagerWorker(ISoundManager* UNUSED(other)){};
|
||||
@ -210,25 +182,24 @@ private:
|
||||
|
||||
void ISoundManager::CreateSoundManager()
|
||||
{
|
||||
if ( !g_SoundManager )
|
||||
if (!g_SoundManager)
|
||||
{
|
||||
g_SoundManager = new CSoundManager();
|
||||
g_SoundManager->StartWorker();
|
||||
}
|
||||
}
|
||||
|
||||
void ISoundManager::SetEnabled(bool doEnable)
|
||||
{
|
||||
if ( g_SoundManager && !doEnable )
|
||||
{
|
||||
if (g_SoundManager && !doEnable)
|
||||
SAFE_DELETE(g_SoundManager);
|
||||
}
|
||||
else if ( !g_SoundManager && doEnable )
|
||||
{
|
||||
else if (!g_SoundManager && doEnable)
|
||||
ISoundManager::CreateSoundManager();
|
||||
}
|
||||
}
|
||||
void ISoundManager::CloseGame()
|
||||
{
|
||||
if ( CSoundManager* aSndMgr = (CSoundManager*)g_SoundManager )
|
||||
aSndMgr->SetAmbientItem( NULL );
|
||||
if (CSoundManager* aSndMgr = (CSoundManager*)g_SoundManager)
|
||||
aSndMgr->SetAmbientItem(NULL);
|
||||
}
|
||||
|
||||
void CSoundManager::al_ReportError(ALenum err, const char* caller, int line)
|
||||
@ -257,45 +228,42 @@ Status CSoundManager::ReloadChangedFiles(const VfsPath& UNUSED(path))
|
||||
|
||||
CSoundManager::CSoundManager()
|
||||
{
|
||||
m_CurrentEnvirons = 0;
|
||||
m_ALSourceBuffer = NULL;
|
||||
m_Device = NULL;
|
||||
m_Context = NULL;
|
||||
m_Worker = NULL;
|
||||
m_CurrentEnvirons = NULL;
|
||||
m_ALSourceBuffer = NULL;
|
||||
m_Device = NULL;
|
||||
m_Context = NULL;
|
||||
m_Worker = NULL;
|
||||
m_PlayListItems = NULL;
|
||||
m_CurrentTune = 0;
|
||||
m_Gain = 1;
|
||||
m_MusicGain = 1;
|
||||
m_AmbientGain = 1;
|
||||
m_ActionGain = 1;
|
||||
m_CurrentTune = NULL;
|
||||
m_Gain = 1;
|
||||
m_MusicGain = 1;
|
||||
m_AmbientGain = 1;
|
||||
m_ActionGain = 1;
|
||||
m_UIGain = 1;
|
||||
m_BufferCount = 50;
|
||||
m_BufferSize = 98304;
|
||||
m_SoundEnabled = true;
|
||||
m_MusicEnabled = true;
|
||||
m_MusicPaused = false;
|
||||
m_AmbientPaused = false;
|
||||
m_ActionPaused = false;
|
||||
m_BufferCount = 50;
|
||||
m_BufferSize = 98304;
|
||||
m_SoundEnabled = true;
|
||||
m_MusicEnabled = true;
|
||||
m_MusicPaused = false;
|
||||
m_AmbientPaused = false;
|
||||
m_ActionPaused = false;
|
||||
|
||||
m_DistressTime = 0;
|
||||
m_DistressTime = 0;
|
||||
m_DistressErrCount = 0;
|
||||
|
||||
m_PlayingPlaylist = false;
|
||||
m_LoopingPlaylist = false;
|
||||
m_RunningPlaylist = false;
|
||||
m_PlaylistGap = 0;
|
||||
m_PlaylistGap = 0;
|
||||
|
||||
m_Enabled = false;
|
||||
AlcInit();
|
||||
|
||||
if ( m_Enabled )
|
||||
if (m_Enabled)
|
||||
{
|
||||
InitListener();
|
||||
|
||||
m_PlayListItems = new PlayList;
|
||||
|
||||
m_Worker = new CSoundManagerWorker();
|
||||
m_Worker->SetEnabled( true );
|
||||
}
|
||||
|
||||
RegisterFileReloadFunc(ReloadChangedFileCB, this);
|
||||
@ -305,7 +273,7 @@ CSoundManager::~CSoundManager()
|
||||
{
|
||||
UnregisterFileReloadFunc(ReloadChangedFileCB, this);
|
||||
|
||||
if (m_Worker )
|
||||
if (m_Worker)
|
||||
{
|
||||
AL_CHECK
|
||||
m_Worker->Shutdown();
|
||||
@ -321,20 +289,24 @@ CSoundManager::~CSoundManager()
|
||||
delete it->second;
|
||||
m_SoundGroups.clear();
|
||||
|
||||
if ( m_PlayListItems )
|
||||
if (m_PlayListItems)
|
||||
delete m_PlayListItems;
|
||||
|
||||
if ( m_ALSourceBuffer != NULL )
|
||||
if (m_ALSourceBuffer != NULL)
|
||||
delete[] m_ALSourceBuffer;
|
||||
|
||||
if ( m_Context )
|
||||
if (m_Context)
|
||||
alcDestroyContext(m_Context);
|
||||
|
||||
if ( m_Device )
|
||||
if (m_Device)
|
||||
alcCloseDevice(m_Device);
|
||||
}
|
||||
|
||||
|
||||
void CSoundManager::StartWorker()
|
||||
{
|
||||
if (m_Enabled)
|
||||
m_Worker = new CSoundManagerWorker();
|
||||
}
|
||||
|
||||
Status CSoundManager::AlcInit()
|
||||
{
|
||||
@ -352,17 +324,15 @@ Status CSoundManager::AlcInit()
|
||||
m_ALSourceBuffer = new ALSourceHolder[SOURCE_NUM];
|
||||
ALuint* sourceList = new ALuint[SOURCE_NUM];
|
||||
|
||||
alGenSources( SOURCE_NUM, sourceList);
|
||||
alGenSources(SOURCE_NUM, sourceList);
|
||||
ALCenum err = alcGetError(m_Device);
|
||||
|
||||
|
||||
if ( err == ALC_NO_ERROR )
|
||||
if (err == ALC_NO_ERROR)
|
||||
{
|
||||
for ( int x=0; x<SOURCE_NUM;x++)
|
||||
for (int x = 0; x < SOURCE_NUM; x++)
|
||||
{
|
||||
m_ALSourceBuffer[x].ALSource = sourceList[x];
|
||||
m_ALSourceBuffer[x].SourceItem = NULL;
|
||||
|
||||
m_ALSourceBuffer[x].ALSource = sourceList[x];
|
||||
m_ALSourceBuffer[x].SourceItem = NULL;
|
||||
}
|
||||
m_Enabled = true;
|
||||
}
|
||||
@ -380,14 +350,12 @@ Status CSoundManager::AlcInit()
|
||||
ALCenum err = alcGetError(m_Device);
|
||||
const char* dev_name = (const char*)alcGetString(m_Device, ALC_DEVICE_SPECIFIER);
|
||||
|
||||
if(err == ALC_NO_ERROR && m_Device && m_Context)
|
||||
if (err == ALC_NO_ERROR && m_Device && m_Context)
|
||||
debug_printf(L"Sound: AlcInit success, using %hs\n", dev_name);
|
||||
else
|
||||
{
|
||||
LOGERROR(L"Sound: AlcInit failed, m_Device=%p m_Context=%p dev_name=%hs err=%x\n", m_Device, m_Context, dev_name, err);
|
||||
|
||||
|
||||
|
||||
// FIXME Hack to get around exclusive access to the sound device
|
||||
#if OS_UNIX
|
||||
ret = INFO::OK;
|
||||
@ -403,9 +371,9 @@ bool CSoundManager::InDistress()
|
||||
{
|
||||
CScopeLock lock(m_DistressMutex);
|
||||
|
||||
if ( m_DistressTime == 0 )
|
||||
if (m_DistressTime == 0)
|
||||
return false;
|
||||
else if ( (timer_Time() - m_DistressTime) > 10 )
|
||||
else if ((timer_Time() - m_DistressTime) > 10)
|
||||
{
|
||||
m_DistressTime = 0;
|
||||
// Coming out of distress mode
|
||||
@ -437,11 +405,11 @@ void CSoundManager::SetDistressThroughError()
|
||||
|
||||
|
||||
|
||||
ALuint CSoundManager::GetALSource( ISoundItem* anItem)
|
||||
ALuint CSoundManager::GetALSource(ISoundItem* anItem)
|
||||
{
|
||||
for ( int x=0; x<SOURCE_NUM;x++)
|
||||
for (int x = 0; x < SOURCE_NUM; x++)
|
||||
{
|
||||
if ( ! m_ALSourceBuffer[x].SourceItem )
|
||||
if (!m_ALSourceBuffer[x].SourceItem)
|
||||
{
|
||||
m_ALSourceBuffer[x].SourceItem = anItem;
|
||||
return m_ALSourceBuffer[x].ALSource;
|
||||
@ -453,9 +421,9 @@ ALuint CSoundManager::GetALSource( ISoundItem* anItem)
|
||||
|
||||
void CSoundManager::ReleaseALSource(ALuint theSource)
|
||||
{
|
||||
for ( int x=0; x<SOURCE_NUM;x++)
|
||||
for (int x = 0; x < SOURCE_NUM; x++)
|
||||
{
|
||||
if ( m_ALSourceBuffer[x].ALSource == theSource )
|
||||
if (m_ALSourceBuffer[x].ALSource == theSource)
|
||||
{
|
||||
m_ALSourceBuffer[x].SourceItem = NULL;
|
||||
return;
|
||||
@ -482,8 +450,8 @@ void CSoundManager::ClearPlayListItems()
|
||||
{
|
||||
if (m_Enabled)
|
||||
{
|
||||
if ( m_PlayingPlaylist )
|
||||
SetMusicItem( NULL );
|
||||
if (m_PlayingPlaylist)
|
||||
SetMusicItem(NULL);
|
||||
|
||||
m_PlayingPlaylist = false;
|
||||
m_LoopingPlaylist = false;
|
||||
@ -493,7 +461,7 @@ void CSoundManager::ClearPlayListItems()
|
||||
}
|
||||
}
|
||||
|
||||
void CSoundManager::StartPlayList( bool doLoop )
|
||||
void CSoundManager::StartPlayList(bool doLoop)
|
||||
{
|
||||
if (m_Enabled && m_MusicEnabled)
|
||||
{
|
||||
@ -502,8 +470,8 @@ void CSoundManager::StartPlayList( bool doLoop )
|
||||
m_PlayingPlaylist = true;
|
||||
m_LoopingPlaylist = doLoop;
|
||||
m_RunningPlaylist = false;
|
||||
|
||||
ISoundItem* aSnd = LoadItem( (m_PlayListItems->at( 0 )) );
|
||||
|
||||
ISoundItem* aSnd = LoadItem((m_PlayListItems->at(0)));
|
||||
if (aSnd)
|
||||
SetMusicItem(aSnd);
|
||||
else
|
||||
@ -514,10 +482,10 @@ void CSoundManager::StartPlayList( bool doLoop )
|
||||
|
||||
void CSoundManager::SetMasterGain(float gain)
|
||||
{
|
||||
if ( m_Enabled )
|
||||
if (m_Enabled)
|
||||
{
|
||||
m_Gain = gain;
|
||||
alListenerf( AL_GAIN, m_Gain);
|
||||
alListenerf(AL_GAIN, m_Gain);
|
||||
AL_CHECK
|
||||
}
|
||||
}
|
||||
@ -544,13 +512,13 @@ ISoundItem* CSoundManager::LoadItem(const VfsPath& itemPath)
|
||||
{
|
||||
AL_CHECK
|
||||
|
||||
if ( m_Enabled )
|
||||
if (m_Enabled)
|
||||
{
|
||||
CSoundData* itemData = CSoundData::SoundDataFromFile(itemPath);
|
||||
|
||||
AL_CHECK
|
||||
if ( itemData )
|
||||
return CSoundManager::ItemForData( itemData );
|
||||
if (itemData)
|
||||
return CSoundManager::ItemForData(itemData);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
@ -563,7 +531,7 @@ ISoundItem* CSoundManager::ItemForData(CSoundData* itemData)
|
||||
|
||||
AL_CHECK
|
||||
|
||||
if ( m_Enabled && (itemData != NULL) )
|
||||
if (m_Enabled && (itemData != NULL))
|
||||
{
|
||||
if (itemData->IsOneShot())
|
||||
{
|
||||
@ -577,46 +545,45 @@ ISoundItem* CSoundManager::ItemForData(CSoundData* itemData)
|
||||
answer = new CStreamItem(itemData);
|
||||
}
|
||||
|
||||
if ( answer && m_Worker )
|
||||
m_Worker->addItem( answer );
|
||||
if (answer && m_Worker)
|
||||
m_Worker->addItem(answer);
|
||||
}
|
||||
|
||||
|
||||
return answer;
|
||||
}
|
||||
|
||||
void CSoundManager::IdleTask()
|
||||
{
|
||||
if ( m_Enabled )
|
||||
if (m_Enabled)
|
||||
{
|
||||
if (m_CurrentTune)
|
||||
{
|
||||
m_CurrentTune->EnsurePlay();
|
||||
if ( m_PlayingPlaylist && m_RunningPlaylist )
|
||||
if (m_PlayingPlaylist && m_RunningPlaylist)
|
||||
{
|
||||
if ( m_CurrentTune->Finished() )
|
||||
if (m_CurrentTune->Finished())
|
||||
{
|
||||
if ( m_PlaylistGap == 0 )
|
||||
if (m_PlaylistGap == 0)
|
||||
{
|
||||
m_PlaylistGap = timer_Time() + 15;
|
||||
}
|
||||
else if ( m_PlaylistGap < timer_Time() )
|
||||
else if (m_PlaylistGap < timer_Time())
|
||||
{
|
||||
m_PlaylistGap = 0;
|
||||
PlayList::iterator it = find (m_PlayListItems->begin(), m_PlayListItems->end(), *(m_CurrentTune->GetName()) );
|
||||
if ( it != m_PlayListItems->end() )
|
||||
PlayList::iterator it = find(m_PlayListItems->begin(), m_PlayListItems->end(), *(m_CurrentTune->GetName()));
|
||||
if (it != m_PlayListItems->end())
|
||||
{
|
||||
++it;
|
||||
|
||||
Path nextPath;
|
||||
if ( it == m_PlayListItems->end() )
|
||||
nextPath = m_PlayListItems->at( 0 );
|
||||
if (it == m_PlayListItems->end())
|
||||
nextPath = m_PlayListItems->at(0);
|
||||
else
|
||||
nextPath = *it;
|
||||
|
||||
ISoundItem* aSnd = LoadItem( nextPath );
|
||||
if ( aSnd )
|
||||
SetMusicItem( aSnd );
|
||||
ISoundItem* aSnd = LoadItem(nextPath);
|
||||
if (aSnd)
|
||||
SetMusicItem(aSnd);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -628,16 +595,15 @@ void CSoundManager::IdleTask()
|
||||
|
||||
if (m_Worker)
|
||||
m_Worker->CleanupItems();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
ISoundItem* CSoundManager::ItemForEntity( entity_id_t UNUSED(source), CSoundData* sndData)
|
||||
ISoundItem* CSoundManager::ItemForEntity(entity_id_t UNUSED(source), CSoundData* sndData)
|
||||
{
|
||||
ISoundItem* currentItem = NULL;
|
||||
|
||||
if ( m_Enabled )
|
||||
currentItem = ItemForData( sndData );
|
||||
if (m_Enabled)
|
||||
currentItem = ItemForData(sndData);
|
||||
|
||||
return currentItem;
|
||||
}
|
||||
@ -645,22 +611,23 @@ ISoundItem* CSoundManager::ItemForEntity( entity_id_t UNUSED(source), CSoundData
|
||||
|
||||
void CSoundManager::InitListener()
|
||||
{
|
||||
ALfloat listenerPos[]={0.0,0.0,0.0};
|
||||
ALfloat listenerVel[]={0.0,0.0,0.0};
|
||||
ALfloat listenerOri[]={0.0,0.0,-1.0, 0.0,1.0,0.0};
|
||||
ALfloat listenerPos[] = {0.0, 0.0, 0.0};
|
||||
ALfloat listenerVel[] = {0.0, 0.0, 0.0};
|
||||
ALfloat listenerOri[] = {0.0, 0.0, -1.0, 0.0, 1.0, 0.0};
|
||||
|
||||
alListenerfv(AL_POSITION,listenerPos);
|
||||
alListenerfv(AL_VELOCITY,listenerVel);
|
||||
alListenerfv(AL_ORIENTATION,listenerOri);
|
||||
alListenerfv(AL_POSITION, listenerPos);
|
||||
alListenerfv(AL_VELOCITY, listenerVel);
|
||||
alListenerfv(AL_ORIENTATION, listenerOri);
|
||||
|
||||
alDistanceModel(AL_LINEAR_DISTANCE);
|
||||
}
|
||||
|
||||
void CSoundManager::PlayGroupItem(ISoundItem* anItem, ALfloat groupGain )
|
||||
void CSoundManager::PlayGroupItem(ISoundItem* anItem, ALfloat groupGain)
|
||||
{
|
||||
if (anItem)
|
||||
{
|
||||
if (m_Enabled && (m_ActionGain > 0)) {
|
||||
if (m_Enabled && (m_ActionGain > 0))
|
||||
{
|
||||
anItem->SetGain(m_ActionGain * groupGain);
|
||||
anItem->PlayAndDelete();
|
||||
AL_CHECK
|
||||
@ -668,12 +635,12 @@ void CSoundManager::PlayGroupItem(ISoundItem* anItem, ALfloat groupGain )
|
||||
}
|
||||
}
|
||||
|
||||
void CSoundManager::SetMusicEnabled (bool isEnabled)
|
||||
void CSoundManager::SetMusicEnabled(bool isEnabled)
|
||||
{
|
||||
if (m_CurrentTune && !isEnabled)
|
||||
{
|
||||
m_CurrentTune->FadeAndDelete(1.00);
|
||||
m_CurrentTune = 0L;
|
||||
m_CurrentTune = NULL;
|
||||
}
|
||||
m_MusicEnabled = isEnabled;
|
||||
}
|
||||
@ -685,7 +652,7 @@ void CSoundManager::PlayAsGroup(const VfsPath& groupPath, CVector3D sourcePos, e
|
||||
if (m_SoundGroups.find(groupPath.string()) == m_SoundGroups.end())
|
||||
{
|
||||
group = new CSoundGroup();
|
||||
if (!group->LoadSoundGroup(L"audio/" + groupPath.string() ))
|
||||
if (!group->LoadSoundGroup(L"audio/" + groupPath.string()))
|
||||
{
|
||||
LOGERROR(L"Failed to load sound group '%ls'", groupPath.string().c_str());
|
||||
delete group;
|
||||
@ -700,11 +667,11 @@ void CSoundManager::PlayAsGroup(const VfsPath& groupPath, CVector3D sourcePos, e
|
||||
}
|
||||
|
||||
// Failed to load group -> do nothing
|
||||
if ( group && ( ownedSound || !group->TestFlag( eOwnerOnly ) ) )
|
||||
if (group && (ownedSound || !group->TestFlag(eOwnerOnly)))
|
||||
group->PlayNext(sourcePos, source);
|
||||
}
|
||||
|
||||
void CSoundManager::PlayAsMusic( const VfsPath& itemPath, bool looping )
|
||||
void CSoundManager::PlayAsMusic(const VfsPath& itemPath, bool looping)
|
||||
{
|
||||
if (m_Enabled)
|
||||
{
|
||||
@ -716,14 +683,14 @@ void CSoundManager::PlayAsMusic( const VfsPath& itemPath, bool looping )
|
||||
}
|
||||
}
|
||||
|
||||
void CSoundManager::PlayAsAmbient( const VfsPath& itemPath, bool looping )
|
||||
void CSoundManager::PlayAsAmbient(const VfsPath& itemPath, bool looping)
|
||||
{
|
||||
if (m_Enabled)
|
||||
{
|
||||
UNUSED2( looping );
|
||||
UNUSED2(looping);
|
||||
ISoundItem* aSnd = LoadItem(itemPath);
|
||||
if (aSnd != NULL)
|
||||
SetAmbientItem( aSnd );
|
||||
SetAmbientItem(aSnd);
|
||||
}
|
||||
}
|
||||
|
||||
@ -739,7 +706,7 @@ void CSoundManager::PlayAsUI(const VfsPath& itemPath, bool looping)
|
||||
if (m_UIGain > 0)
|
||||
{
|
||||
anItem->SetGain(m_UIGain);
|
||||
anItem->SetLooping( looping );
|
||||
anItem->SetLooping(looping);
|
||||
anItem->PlayAndDelete();
|
||||
}
|
||||
}
|
||||
@ -747,42 +714,41 @@ void CSoundManager::PlayAsUI(const VfsPath& itemPath, bool looping)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CSoundManager::Pause(bool pauseIt)
|
||||
{
|
||||
PauseMusic(pauseIt);
|
||||
PauseAmbient(pauseIt);
|
||||
PauseAction(pauseIt);
|
||||
PauseMusic(pauseIt);
|
||||
PauseAmbient(pauseIt);
|
||||
PauseAction(pauseIt);
|
||||
}
|
||||
|
||||
void CSoundManager::PauseMusic (bool pauseIt)
|
||||
void CSoundManager::PauseMusic(bool pauseIt)
|
||||
{
|
||||
if (m_CurrentTune && pauseIt && !m_MusicPaused )
|
||||
if (m_CurrentTune && pauseIt && !m_MusicPaused)
|
||||
{
|
||||
m_CurrentTune->FadeAndPause( 1.0 );
|
||||
m_CurrentTune->FadeAndPause(1.0);
|
||||
}
|
||||
else if ( m_CurrentTune && m_MusicPaused && !pauseIt && m_MusicEnabled )
|
||||
else if (m_CurrentTune && m_MusicPaused && !pauseIt && m_MusicEnabled)
|
||||
{
|
||||
m_CurrentTune->SetGain(0);
|
||||
m_CurrentTune->Resume();
|
||||
m_CurrentTune->FadeToIn( m_MusicGain, 1.0);
|
||||
m_CurrentTune->FadeToIn(m_MusicGain, 1.0);
|
||||
}
|
||||
m_MusicPaused = pauseIt;
|
||||
}
|
||||
|
||||
void CSoundManager::PauseAmbient (bool pauseIt)
|
||||
void CSoundManager::PauseAmbient(bool pauseIt)
|
||||
{
|
||||
if (m_CurrentEnvirons && pauseIt)
|
||||
m_CurrentEnvirons->Pause();
|
||||
else if ( m_CurrentEnvirons )
|
||||
m_CurrentEnvirons->Resume();
|
||||
if (m_CurrentEnvirons && pauseIt)
|
||||
m_CurrentEnvirons->Pause();
|
||||
else if (m_CurrentEnvirons)
|
||||
m_CurrentEnvirons->Resume();
|
||||
|
||||
m_AmbientPaused = pauseIt;
|
||||
m_AmbientPaused = pauseIt;
|
||||
}
|
||||
|
||||
void CSoundManager::PauseAction (bool pauseIt)
|
||||
void CSoundManager::PauseAction(bool pauseIt)
|
||||
{
|
||||
m_ActionPaused = pauseIt;
|
||||
m_ActionPaused = pauseIt;
|
||||
}
|
||||
|
||||
void CSoundManager::SetMusicItem(ISoundItem* anItem)
|
||||
@ -793,7 +759,7 @@ void CSoundManager::SetMusicItem(ISoundItem* anItem)
|
||||
if (m_CurrentTune)
|
||||
{
|
||||
m_CurrentTune->FadeAndDelete(2.00);
|
||||
m_CurrentTune = 0L;
|
||||
m_CurrentTune = NULL;
|
||||
}
|
||||
|
||||
IdleTask();
|
||||
@ -814,7 +780,7 @@ void CSoundManager::SetMusicItem(ISoundItem* anItem)
|
||||
m_CurrentTune->PlayLoop();
|
||||
|
||||
m_MusicPaused = false;
|
||||
m_CurrentTune->FadeToIn( m_MusicGain, 1.00);
|
||||
m_CurrentTune->FadeToIn(m_MusicGain, 1.00);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -832,7 +798,7 @@ void CSoundManager::SetAmbientItem(ISoundItem* anItem)
|
||||
if (m_CurrentEnvirons)
|
||||
{
|
||||
m_CurrentEnvirons->FadeAndDelete(3.00);
|
||||
m_CurrentEnvirons = 0L;
|
||||
m_CurrentEnvirons = NULL;
|
||||
}
|
||||
IdleTask();
|
||||
|
||||
@ -843,7 +809,7 @@ void CSoundManager::SetAmbientItem(ISoundItem* anItem)
|
||||
m_CurrentEnvirons = anItem;
|
||||
m_CurrentEnvirons->SetGain(0);
|
||||
m_CurrentEnvirons->PlayLoop();
|
||||
m_CurrentEnvirons->FadeToIn( m_AmbientGain, 2.00);
|
||||
m_CurrentEnvirons->FadeToIn(m_AmbientGain, 2.00);
|
||||
}
|
||||
}
|
||||
AL_CHECK
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2013 Wildfire Games.
|
||||
/* Copyright (C) 2014 Wildfire Games.
|
||||
* This file is part of 0 A.D.
|
||||
*
|
||||
* 0 A.D. is free software: you can redistribute it and/or modify
|
||||
@ -22,17 +22,15 @@
|
||||
|
||||
#if CONFIG2_AUDIO
|
||||
|
||||
#include "ISoundManager.h"
|
||||
#include "data/SoundData.h"
|
||||
#include "items/ISoundItem.h"
|
||||
#include "scripting/SoundGroup.h"
|
||||
|
||||
#include "lib/external_libraries/openal.h"
|
||||
|
||||
|
||||
#include "lib/file/vfs/vfs_path.h"
|
||||
#include "soundmanager/ISoundManager.h"
|
||||
#include "soundmanager/items/ISoundItem.h"
|
||||
#include "simulation2/system/Entity.h"
|
||||
#include "soundmanager/data/SoundData.h"
|
||||
#include "soundmanager/items/ISoundItem.h"
|
||||
#include "soundmanager/scripting/SoundGroup.h"
|
||||
#include "ps/Profiler2.h"
|
||||
#include "simulation2/system/Entity.h"
|
||||
|
||||
#include <vector>
|
||||
#include <map>
|
||||
@ -98,14 +96,16 @@ public:
|
||||
CSoundManager();
|
||||
virtual ~CSoundManager();
|
||||
|
||||
void StartWorker();
|
||||
|
||||
ISoundItem* LoadItem(const VfsPath& itemPath);
|
||||
ISoundItem* ItemForData(CSoundData* itemData);
|
||||
ISoundItem* ItemForEntity( entity_id_t source, CSoundData* sndData);
|
||||
ISoundItem* ItemForEntity(entity_id_t source, CSoundData* sndData);
|
||||
|
||||
Status ReloadChangedFiles(const VfsPath& path);
|
||||
|
||||
void ClearPlayListItems();
|
||||
void StartPlayList( bool doLoop );
|
||||
void StartPlayList(bool doLoop);
|
||||
void AddPlayListItem(const VfsPath& itemPath);
|
||||
|
||||
static void CreateSoundManager();
|
||||
@ -117,8 +117,8 @@ public:
|
||||
static void al_ReportError(ALenum err, const char* caller, int line);
|
||||
static void al_check(const char* caller, int line);
|
||||
|
||||
void SetMusicEnabled (bool isEnabled);
|
||||
void setSoundEnabled( bool enabled );
|
||||
void SetMusicEnabled(bool isEnabled);
|
||||
void setSoundEnabled(bool enabled);
|
||||
|
||||
ALuint GetALSource(ISoundItem* anItem);
|
||||
void ReleaseALSource(ALuint theSource);
|
||||
@ -135,8 +135,8 @@ public:
|
||||
long GetBufferCount();
|
||||
long GetBufferSize();
|
||||
|
||||
void PlayAsMusic( const VfsPath& itemPath, bool looping);
|
||||
void PlayAsAmbient( const VfsPath& itemPath, bool looping);
|
||||
void PlayAsMusic(const VfsPath& itemPath, bool looping);
|
||||
void PlayAsAmbient(const VfsPath& itemPath, bool looping);
|
||||
void PlayAsUI(const VfsPath& itemPath, bool looping);
|
||||
void PlayAsGroup(const VfsPath& groupPath, CVector3D sourcePos, entity_id_t source, bool ownedSound);
|
||||
|
||||
@ -147,9 +147,9 @@ public:
|
||||
void SetDistressThroughError();
|
||||
|
||||
void Pause(bool pauseIt);
|
||||
void PauseMusic (bool pauseIt);
|
||||
void PauseAmbient (bool pauseIt);
|
||||
void PauseAction (bool pauseIt);
|
||||
void PauseMusic(bool pauseIt);
|
||||
void PauseAmbient(bool pauseIt);
|
||||
void PauseAction(bool pauseIt);
|
||||
void SetAmbientItem(ISoundItem* anItem);
|
||||
|
||||
void SetMasterGain(float gain);
|
||||
|
Loading…
Reference in New Issue
Block a user