diff --git a/source/common b/source/common index 0962d758a8079cb5130411c14863e7869fd7de4b..421ed9d1c0af7fadd5a6e9188c36f6f6a4290ed4 160000 --- a/source/common +++ b/source/common @@ -1 +1 @@ -Subproject commit 0962d758a8079cb5130411c14863e7869fd7de4b +Subproject commit 421ed9d1c0af7fadd5a6e9188c36f6f6a4290ed4 diff --git a/source/xSound/SoundLayer.cpp b/source/xSound/SoundLayer.cpp index d099813898a91176af0bcb534a3381f5a57471d9..05d778f93de15941f20d92a1c30c7b1e66123249 100644 --- a/source/xSound/SoundLayer.cpp +++ b/source/xSound/SoundLayer.cpp @@ -71,6 +71,7 @@ void CSoundLayer::addLayer(CSoundLayer *pLayer) LibReport(REPORT_MSG_LEVEL_FATAL, "Layer name '%s' exists", pLayer->getName()); m_mapLayers[pLayer->getName()] = pLayer; + m_aLayers.push_back(pLayer); } void CSoundLayer::delLayer(CSoundLayer *pLayer) @@ -84,6 +85,12 @@ void CSoundLayer::delLayer(CSoundLayer *pLayer) } } + int idx = m_aLayers.indexOf(pLayer); + if(idx >= 0) + { + m_aLayers.erase(idx); + } + mem_delete(pLayer); } @@ -92,6 +99,7 @@ void CSoundLayer::delLayer(CSoundLayer *pLayer) void CSoundLayer::addSndPlayer(CSoundPlayer *pSndPlayer) { m_mapSndPlayers[pSndPlayer->getName()].push_back(pSndPlayer); + m_aSndPlayers.push_back(pSndPlayer); } void CSoundLayer::delSndPlayer(const CSoundPlayer *pSndPlayer) @@ -101,13 +109,16 @@ void CSoundLayer::delSndPlayer(const CSoundPlayer *pSndPlayer) return; ArrayPlayer &oAP = m_mapSndPlayers[szName]; - for(int i = 0, il = oAP.size(); i < il; ++i) + int idx = oAP.indexOf(pSndPlayer); + if(idx >= 0) { - if(oAP[i] == pSndPlayer) - { - oAP.erase(i); - break; - } + oAP.erase(idx); + } + + idx = m_aSndPlayers.indexOf(pSndPlayer); + if(idx >= 0) + { + m_aSndPlayers.erase(idx); } mem_delete(pSndPlayer); @@ -118,6 +129,7 @@ void CSoundLayer::delSndPlayer(const CSoundPlayer *pSndPlayer) void CSoundLayer::addSndEmitter(CSoundEmitter *pSndEmitter) { m_mapSndEmitters[pSndEmitter->getName()].push_back(pSndEmitter); + m_aSndEmitters.push_back(pSndEmitter); } void CSoundLayer::delSndEmitter(const CSoundEmitter *pSndEmitter) @@ -127,13 +139,16 @@ void CSoundLayer::delSndEmitter(const CSoundEmitter *pSndEmitter) return; ArrayEmitter &oAE = m_mapSndEmitters[szName]; - for(int i = 0, il = oAE.size(); i < il; ++i) + int idx = oAE.indexOf(pSndEmitter); + if(idx >= 0) { - if(oAE[i] == pSndEmitter) - { - oAE.erase(i); - break; - } + oAE.erase(idx); + } + + idx = m_aSndEmitters.indexOf(pSndEmitter); + if(idx >= 0) + { + m_aSndEmitters.erase(idx); } mem_delete(pSndEmitter); @@ -167,14 +182,9 @@ IXSoundLayer* XMETHODCALLTYPE CSoundLayer::findLayer(const char *szName) return this; IXSoundLayer *pFound = NULL; - // TODO use plain array for iteration - for(MapLayer::Iterator i = m_mapLayers.begin(); i; ++i) + for(UINT i = 0, l = m_aLayers.size(); i < l; ++i) { - if(!i.second) - { - continue; - } - if((pFound = (*i.second)->findLayer(szName))) + if((pFound = m_aLayers[i]->findLayer(szName))) break; } @@ -312,27 +322,21 @@ bool XMETHODCALLTYPE CSoundLayer::isPlaying() const //########################################################################## -// FIXME никаких итераторов в апдейте! void CSoundLayer::update(const float3 &vListenerPos, const float3 &vListenerDir, const float3 &vListenerUp) { - for(MapLayer::Iterator i = m_mapLayers.begin(); i; ++i) + for(UINT i = 0, l = m_aLayers.size(); i < l; ++i) { - if(*i.second) - (*i.second)->update(vListenerPos, vListenerDir, vListenerUp); + m_aLayers[i]->update(vListenerPos, vListenerDir, vListenerUp); } - for(MapPlayer::Iterator i = m_mapSndPlayers.begin(); i; ++i) + for(UINT i = 0, l = m_aSndPlayers.size(); i < l; ++i) { - ArrayPlayer &oAP = *i.second; - for(int k = 0, kl = oAP.size(); k < kl; ++k) - oAP[k]->update(vListenerPos, vListenerDir, vListenerUp); + m_aSndPlayers[i]->update(vListenerPos, vListenerDir, vListenerUp); } - for(MapEmitter::Iterator i = m_mapSndEmitters.begin(); i; ++i) + for(UINT i = 0, l = m_aSndEmitters.size(); i < l; ++i) { - ArrayEmitter &oAE = *i.second; - for(int k = 0, kl = oAE.size(); k < kl; ++k) - oAE[k]->update(vListenerPos, vListenerDir, vListenerUp); + m_aSndEmitters[i]->update(vListenerPos, vListenerDir, vListenerUp); } } @@ -377,27 +381,19 @@ void CSoundLayer::_play(bool canPlay, bool isFromParent) } m_isPlayingTotal = isPlaying; - for(MapLayer::Iterator i = m_mapLayers.begin(); i; ++i) + for(UINT i = 0, l = m_aLayers.size(); i < l; ++i) { - (*i.second)->_play(isPlaying, true); + m_aLayers[i]->_play(isPlaying, true); } - for(MapPlayer::Iterator i = m_mapSndPlayers.begin(); i; ++i) + for(UINT i = 0, l = m_aSndPlayers.size(); i < l; ++i) { - ArrayPlayer &oAP = *i.second; - for(int k = 0, kl = oAP.size(); k < kl; ++k) - { - oAP[k]->_onLayerPlay(isPlaying); - } + m_aSndPlayers[i]->_onLayerPlay(isPlaying); } - for(MapEmitter::Iterator i = m_mapSndEmitters.begin(); i; ++i) + for(UINT i = 0, l = m_aSndEmitters.size(); i < l; ++i) { - ArrayEmitter &oAE = *i.second; - for(int k = 0, kl = oAE.size(); k < kl; ++k) - { - oAE[k]->_onLayerPlay(isPlaying); - } + m_aSndEmitters[i]->_onLayerPlay(isPlaying); } m_pPrimaryBuffer->play(isPlaying); diff --git a/source/xSound/SoundLayer.h b/source/xSound/SoundLayer.h index d5a5420737c2340ca15aebb3a3445c693ebf6193..edfa730902b611ec507b9b55404dcf1fd9db73d1 100644 --- a/source/xSound/SoundLayer.h +++ b/source/xSound/SoundLayer.h @@ -89,14 +89,17 @@ protected: typedef AssotiativeArray<String, CSoundLayer*> MapLayer; MapLayer m_mapLayers; + Array<CSoundLayer*> m_aLayers; typedef Array<CSoundPlayer*> ArrayPlayer; typedef AssotiativeArray<String, ArrayPlayer> MapPlayer; MapPlayer m_mapSndPlayers; + Array<CSoundPlayer*> m_aSndPlayers; typedef Array<CSoundEmitter*> ArrayEmitter; typedef AssotiativeArray<String, ArrayEmitter> MapEmitter; MapEmitter m_mapSndEmitters; + Array<CSoundEmitter*> m_aSndEmitters; }; #endif diff --git a/source/xSound/SoundSystem.cpp b/source/xSound/SoundSystem.cpp index e50ed965b1aa2288b3926d27165b660750f47ff1..38c140e222cbff7111e5d9119b469616badfe717 100644 --- a/source/xSound/SoundSystem.cpp +++ b/source/xSound/SoundSystem.cpp @@ -52,11 +52,7 @@ void CSoundSystem::update(const float3 &vListenerPos, const float3 &vListenerDir { if(m_pMasterLayer) m_pMasterLayer->update(vListenerPos, vListenerDir, vListenerUp); - - m_vObserverPos = vListenerPos; - m_vObserverLook = vListenerDir; - m_vObserverUp = vListenerUp; - + SndQueueMsg oMsg; while(m_queue.pop(&oMsg)) { diff --git a/source/xSound/SoundSystem.h b/source/xSound/SoundSystem.h index 7ec85c8903cac13865306d19c427de45d3d024a0..05fd0bf46d26cd3205fa057a2d7a4a0056d7f731 100644 --- a/source/xSound/SoundSystem.h +++ b/source/xSound/SoundSystem.h @@ -85,8 +85,6 @@ protected: typedef AssotiativeArray<String, IXAudioCodec*> MapCodec; MapCodec m_mapCodecs; - - float3 m_vObserverPos, m_vObserverLook, m_vObserverUp; SpinLock m_oSpinLockUpdate; }; diff --git a/source/xSound/plugin_main.cpp b/source/xSound/plugin_main.cpp index 94f754071a9789b9f45ca950b17de7925b7a5e9e..89b082c4ecb8b8b934ac18170c77f5d03f44e033 100644 --- a/source/xSound/plugin_main.cpp +++ b/source/xSound/plugin_main.cpp @@ -80,7 +80,7 @@ public: uint64_t getRepeatInterval() override { - return(20000); // 20ms + return(50000); // 50ms } protected: