diff --git a/proj/SkyXEngine/vs2013/SkyXEngine.sln b/proj/SkyXEngine/vs2013/SkyXEngine.sln index 837df0923808527363ab332f62dda0674a69a26b..c7c5af055d34f1b8988f65596d456c3f5c48a4e3 100644 --- a/proj/SkyXEngine/vs2013/SkyXEngine.sln +++ b/proj/SkyXEngine/vs2013/SkyXEngine.sln @@ -895,6 +895,7 @@ Global {F926F7FA-099E-499C-ABC9-743BCAB919C4}.Debug|Win32.ActiveCfg = Debug|Win32 {F926F7FA-099E-499C-ABC9-743BCAB919C4}.Debug|Win32.Build.0 = Debug|Win32 {F926F7FA-099E-499C-ABC9-743BCAB919C4}.Debug|x64.ActiveCfg = Debug|x64 + {F926F7FA-099E-499C-ABC9-743BCAB919C4}.Debug|x64.Build.0 = Debug|x64 {F926F7FA-099E-499C-ABC9-743BCAB919C4}.Release|Mixed Platforms.ActiveCfg = Release|Win32 {F926F7FA-099E-499C-ABC9-743BCAB919C4}.Release|Mixed Platforms.Build.0 = Release|Win32 {F926F7FA-099E-499C-ABC9-743BCAB919C4}.Release|Win32.ActiveCfg = Release|Win32 @@ -916,6 +917,7 @@ Global {4A77FC81-98F6-4ABF-A489-B6F427354E5B}.Debug|Win32.ActiveCfg = Debug|Win32 {4A77FC81-98F6-4ABF-A489-B6F427354E5B}.Debug|Win32.Build.0 = Debug|Win32 {4A77FC81-98F6-4ABF-A489-B6F427354E5B}.Debug|x64.ActiveCfg = Debug|x64 + {4A77FC81-98F6-4ABF-A489-B6F427354E5B}.Debug|x64.Build.0 = Debug|x64 {4A77FC81-98F6-4ABF-A489-B6F427354E5B}.Release|Mixed Platforms.ActiveCfg = Release|Win32 {4A77FC81-98F6-4ABF-A489-B6F427354E5B}.Release|Mixed Platforms.Build.0 = Release|Win32 {4A77FC81-98F6-4ABF-A489-B6F427354E5B}.Release|Win32.ActiveCfg = Release|Win32 diff --git a/sdks/mital b/sdks/mital index ea44467d3f5b41063521218eb0ed5eb0e5b7efa7..e3bf76315c38eba4fde0e1b64f7afbcadeffddb3 160000 --- a/sdks/mital +++ b/sdks/mital @@ -1 +1 @@ -Subproject commit ea44467d3f5b41063521218eb0ed5eb0e5b7efa7 +Subproject commit e3bf76315c38eba4fde0e1b64f7afbcadeffddb3 diff --git a/source/game/GameData.cpp b/source/game/GameData.cpp index 44916e2a20265e6c6c56c7dc03da5f4ac3b28dc7..02234f801587b111526cff57877fdd9b63ebca32 100644 --- a/source/game/GameData.cpp +++ b/source/game/GameData.cpp @@ -1183,7 +1183,9 @@ GameData::~GameData() for(int i = 0; i < MPT_COUNT; ++i) { - // @TODO: SSCore_SndDelete3dInst() + int iCount = m_iFootstepSoundCount[i]; + for (int j = 0; j < iCount; ++j) + mem_release(m_aFootstepSound[i][j]); mem_delete_a(m_aFootstepSound[i]); } } diff --git a/source/oggplugin/AudioCodecOgg.cpp b/source/oggplugin/AudioCodecOgg.cpp index 3e90c267d6d37646049e10049404b3e84f52eabf..8e1085b657a51facec6ec9dc0c7244af54b53239 100644 --- a/source/oggplugin/AudioCodecOgg.cpp +++ b/source/oggplugin/AudioCodecOgg.cpp @@ -189,7 +189,7 @@ int64_t XMETHODCALLTYPE CAudioCodecTargetOgg::getPos() const if (!m_pFile || !m_pVoFile) return 0; - return ov_pcm_tell(m_pVoFile); + return ov_pcm_tell(m_pVoFile)*OGG_BYTES_PER_SAMPLE; } //************************************************************************** @@ -199,7 +199,7 @@ void XMETHODCALLTYPE CAudioCodecTargetOgg::setPos(int64_t iPos) if (!m_pFile || !m_pVoFile) return; - ov_pcm_seek(m_pVoFile, iPos); + ov_pcm_seek(m_pVoFile, iPos / OGG_BYTES_PER_SAMPLE); } //************************************************************************** diff --git a/source/xEngine/Engine.cpp b/source/xEngine/Engine.cpp index 3203de1870e26d474d0ea2114c15827438e0bb47..152cfd60c8b0ff5f7d056726d49912b047629fec 100644 --- a/source/xEngine/Engine.cpp +++ b/source/xEngine/Engine.cpp @@ -174,17 +174,30 @@ bool XMETHODCALLTYPE CEngine::initGraphics(XWINDOW_OS_HANDLE hWindow, IXEngineCa IXSoundLayer *pMasterLayer = pSound->createMasterLayer(&oAudioDesc, "master"); pMasterLayer->play(true); /*IXSoundPlayer *pPlayer = pMasterLayer->newSoundPlayer("sounds/guitar_10.ogg", SOUND_DTYPE_2D); - pPlayer->play();*/ - /*IXSoundEmitter *pEmitter = pMasterLayer->newSoundEmitter("sounds/ak74_shoot.ogg", SOUND_DTYPE_2D); - pEmitter->play();*/ + //pPlayer->setLoop(SOUND_LOOP_SIMPLE); + pPlayer->play(); + IXSoundEmitter *pEmitter = pMasterLayer->newSoundEmitter("sounds/ak74_shoot.ogg", SOUND_DTYPE_2D); + //pEmitter->play(); - /*while (1) + IXSoundEmitter *pEmitter2 = pMasterLayer->newSoundEmitter("sounds/ak74_shoot.ogg", SOUND_DTYPE_2D); + //pEmitter2->play(); + + while (1) { if (GetAsyncKeyState('I')) { - pEmitter->play(); + pEmitter2->play(); Sleep(100); } + + if (GetAsyncKeyState('Q')) + pMasterLayer->play(false); + + if (GetAsyncKeyState('W')) + pMasterLayer->play(true); + + float3 v; + pSound->update(v,v,v); }*/ LibReport(REPORT_MSG_LEVEL_NOTICE, "LIB sound initialized\n"); diff --git a/source/xSound/SoundBase.cpp b/source/xSound/SoundBase.cpp index 511275bf29d48abdb94844d3e3071e44cf84c4ab..8b28f7f1664347d22e4ad17e3a6e64b760c913f6 100644 --- a/source/xSound/SoundBase.cpp +++ b/source/xSound/SoundBase.cpp @@ -10,34 +10,22 @@ SOUND_DTYPE XMETHODCALLTYPE CSoundBase::getType() void XMETHODCALLTYPE CSoundBase::setVolume(float fVolume) { - if (!m_pAB) - return; - - m_pAB->setVolume(fVolume); + m_fVolume = fVolume; } float XMETHODCALLTYPE CSoundBase::getVolume() const { - if (!m_pAB) - return 0.f; - - return m_pAB->getVolume(); + return m_fVolume; } void XMETHODCALLTYPE CSoundBase::setPan(float fPan) { - if (!m_pAB || m_dtype == SOUND_DTYPE_3D) - return; - - m_pAB->setPan(fPan); + m_fPan = fPan; } float XMETHODCALLTYPE CSoundBase::getPan() const { - if (!m_pAB || m_dtype == SOUND_DTYPE_3D) - return 0.f; - - return m_pAB->getPan(); + return m_fPan; } const float3& XMETHODCALLTYPE CSoundBase::getWorldPos() const diff --git a/source/xSound/SoundBase.h b/source/xSound/SoundBase.h index 634a469c660259574be5f3743a98980160739eef..6721f5e8671242cdf27b60b67572c8e52382a728 100644 --- a/source/xSound/SoundBase.h +++ b/source/xSound/SoundBase.h @@ -47,8 +47,11 @@ protected: //************************************************************************ + float m_fVolume = 1.f; + float m_fPan = 0.f; + //! аудио буфер - IAudioBuffer *m_pAB = NULL; + //IAudioBuffer *m_pAB = NULL; //! дистанция слышимости float m_fDist = 0.f; @@ -68,7 +71,7 @@ protected: //! слой владелец CSoundLayer *m_pLayer = NULL; - CSoundSystem *m_pSoundSystem = NULL; + //CSoundSystem *m_pSoundSystem = NULL; }; #endif diff --git a/source/xSound/SoundEmitter.cpp b/source/xSound/SoundEmitter.cpp index 58d71b9c8d790ee036f61b3d3faab7f1de1aff03..d127bfe00d135d03616a6792f3df8fd6f93fc4f0 100644 --- a/source/xSound/SoundEmitter.cpp +++ b/source/xSound/SoundEmitter.cpp @@ -8,40 +8,76 @@ CSoundEmitter::~CSoundEmitter() { - for (int i = 0, il = m_aInstances.size(); i<il; ++i) - { - mem_release(m_aInstances[i]); - } + m_pLayer->delSndEmitter(this); + +} + +//************************************************************************** - mem_release(m_pAB); +CSoundEmitter* CSoundEmitter::newInstance() +{ + CSoundEmitter *pEmitter = new CSoundEmitter(); + + pEmitter->m_aInstances[0].pAB = m_aInstances[0].pAB->newInstance(); + pEmitter->m_dtype = this->m_dtype; + pEmitter->m_state = SOUND_STATE_STOP; + pEmitter->m_sName = this->m_sName; + pEmitter->m_pLayer = this->m_pLayer; + pEmitter->m_fDist = this->m_fDist; + pEmitter->m_vWorldPos = this->m_vWorldPos; + return pEmitter; } //************************************************************************** void XMETHODCALLTYPE CSoundEmitter::play() { - if (!(m_pAB->isPlaying())) - { - m_pAB->play(true); + //если родительский слой не проигрывается, тогда не запускаем проигрывание + if (!m_pLayer->isPlaying()) return; - } + //проход по массиву инстансов звука, если есть первый попавшийся не проигрываемые тогда его проигрываем for (int i = 0, il = m_aInstances.size(); i<il; ++i) { - if (!(m_aInstances[i]->isPlaying())) + if (!(m_aInstances[i].pAB->isPlaying())) { - m_aInstances[i]->play(true); + m_aInstances[i].pAB->setVolume(m_fVolume); + m_aInstances[i].pAB->play(true); return; } } - IAudioBuffer *pInst = m_pAB->newInstance(); + //если пришли сюда, значит нет свободных инстансов, создаем новый и проигрыаем + IAudioBuffer *pInst = m_aInstances[0].pAB->newInstance(); + pInst->setVolume(m_fVolume); pInst->play(true); m_aInstances.push_back(pInst); } //************************************************************************** +void CSoundEmitter::resume() +{ + //если инстансы проигрывались тогда включаем проигрывание + for (int i = 0, il = m_aInstances.size(); i < il; ++i) + { + if(m_aInstances[i].isPlaying) + m_aInstances[i].pAB->play(true); + } +} + +void CSoundEmitter::pause() +{ + //записываем состояния инстансов и останавливаем + for (int i = 0, il = m_aInstances.size(); i < il; ++i) + { + m_aInstances[i].isPlaying = m_aInstances[i].pAB->isPlaying(); + m_aInstances[i].pAB->play(false); + } +} + +//************************************************************************** + bool CSoundEmitter::create(CSoundLayer *pLayer, IXAudioCodecTarget *pCodecTarget) { if (!pCodecTarget || !pLayer) @@ -51,19 +87,21 @@ bool CSoundEmitter::create(CSoundLayer *pLayer, IXAudioCodecTarget *pCodecTarget pCodecTarget->getDesc(&oDesc); m_pLayer = pLayer; - m_pAB = pLayer->createAudioBuffer(AB_TYPE_SECOND, &oDesc); + IAudioBuffer *pAB = pLayer->createAudioBuffer(AB_TYPE_SECOND, &oDesc); BYTE *pData = new BYTE[oDesc.uSize]; pCodecTarget->decode(0, oDesc.uSize, (void**)&pData); BYTE *pData2; - m_pAB->lock(AB_LOCK_WRITE, (void**)&pData2); + pAB->lock(AB_LOCK_WRITE, (void**)&pData2); memcpy(pData2, pData, oDesc.uSize); - m_pAB->unlock(); + pAB->unlock(); mem_delete_a(pData); mem_release(pCodecTarget); - m_pAB->setLoop(AB_LOOP_NONE); + pAB->setLoop(AB_LOOP_NONE); + + m_aInstances.push_back(Instance(pAB)); return true; } diff --git a/source/xSound/SoundEmitter.h b/source/xSound/SoundEmitter.h index 6cc86355dc43798fc5ab28b0baf65b0e1490d62f..87a1302fba792650e7babb6fe38585a507fc7aaa 100644 --- a/source/xSound/SoundEmitter.h +++ b/source/xSound/SoundEmitter.h @@ -19,9 +19,19 @@ class CSoundEmitter : public CSoundBase, public virtual IXSoundEmitter { public: ~CSoundEmitter(); + + //! создание нового инстанса CSoundEmitter + CSoundEmitter* newInstance(); + virtual void XMETHODCALLTYPE play() override; - void update(); + //! продолжить проигрывание инстансов, если они проигрывались + void resume(); + + //! остановка проигрывания + void pause(); + + //void update(); protected: @@ -29,7 +39,16 @@ protected: bool create(CSoundLayer *pLayer, IXAudioCodecTarget *pCodecTarget); - Array<IAudioBuffer*> m_aInstances; + struct Instance + { + Instance() = default; + Instance(IAudioBuffer *pBuffer) { pAB = pBuffer; } + ~Instance() { mem_release(pAB); } + IAudioBuffer *pAB = NULL; + bool isPlaying = false; + }; + + Array<Instance> m_aInstances; }; #endif diff --git a/source/xSound/SoundLayer.cpp b/source/xSound/SoundLayer.cpp index 16e75f37f375f23f09d2bcbbd242fcf3aaac1af8..aa9a298a99b456c88180d1c31c1079c3144a68eb 100644 --- a/source/xSound/SoundLayer.cpp +++ b/source/xSound/SoundLayer.cpp @@ -12,18 +12,25 @@ CSoundLayer::~CSoundLayer() if (m_pParent) m_pParent->delLayer(this); - for (maplayer::Iterator i = m_mapLayers.begin(); i != m_mapLayers.end(); i++) + for (maplayer::Iterator i = m_mapLayers.begin(); i; i++) { - m_mapLayers[i.first]->Release(); + mem_release(m_mapLayers[i.first]); m_mapLayers.erase(i.first); } - for (mapsoundplayer::Iterator i = m_mapSndPlayers.begin(); i != m_mapSndPlayers.end(); i++) + for (mapsoundplayer::Iterator i = m_mapSndPlayers.begin(); i; i++) { - m_mapSndPlayers[i.first]->Release(); + mem_release(m_mapSndPlayers[i.first]); m_mapSndPlayers.erase(i.first); } + int iCount0 = m_mapSndEmitters.Size(); + for (mapsoundemitter::Iterator i = m_mapSndEmitters.begin(); i; i++) + { + mem_release(m_mapSndEmitters[i.first]); + m_mapSndEmitters.erase(i.first); + } + mem_release_del(m_pPrimaryBuffer); } @@ -61,9 +68,9 @@ void CSoundLayer::addLayer(CSoundLayer *pLayer, const char *szName) m_mapLayers[szName] = pLayer; } -void CSoundLayer::delLayer(CSoundLayer *pLayer) +void CSoundLayer::delLayer(const CSoundLayer *pLayer) { - for (maplayer::Iterator i = m_mapLayers.begin(); i != m_mapLayers.end(); i++) + for (maplayer::Iterator i = m_mapLayers.begin(); i; i++) { if (m_mapLayers[i.first] == pLayer) { @@ -75,16 +82,16 @@ void CSoundLayer::delLayer(CSoundLayer *pLayer) //************************************************************************** -void CSoundLayer::addSound(CSoundPlayer *pSound, const char *szName) +void CSoundLayer::addSndPlayer(CSoundPlayer *pSndPlayer, const char *szName) { - m_mapSndPlayers[szName] = pSound; + m_mapSndPlayers[szName] = pSndPlayer; } -void CSoundLayer::delSound(CSoundPlayer *pSound) +void CSoundLayer::delSndPlayer(const CSoundPlayer *pSndPlayer) { - for (mapsoundplayer::Iterator i = m_mapSndPlayers.begin(); i != m_mapSndPlayers.end(); i++) + for (mapsoundplayer::Iterator i = m_mapSndPlayers.begin(); i; i++) { - if (m_mapSndPlayers[i.first] == pSound) + if (m_mapSndPlayers[i.first] == pSndPlayer) { m_mapSndPlayers.erase(i.first); break; @@ -94,6 +101,29 @@ void CSoundLayer::delSound(CSoundPlayer *pSound) //************************************************************************** +void CSoundLayer::addSndEmitter(CSoundEmitter *pSndEmitter, const char *szName) +{ + m_mapSndEmitters[szName] = pSndEmitter; +} + +void CSoundLayer::delSndEmitter(const CSoundEmitter *pSndEmitter) +{ + int iCount0 = m_mapSndEmitters.Size(); + for (mapsoundemitter::Iterator i = m_mapSndEmitters.begin(); i; i++) + { + if (m_mapSndEmitters[i.first] == pSndEmitter) + { + m_mapSndEmitters[i.first] = NULL; + m_mapSndEmitters.erase(i.first); + break; + } + } + int iCount1 = m_mapSndEmitters.Size(); + int qwerty = 0; +} + +//************************************************************************** + void XMETHODCALLTYPE CSoundLayer::getDesc(AudioRawDesc *pDesc) const { if (!m_pPrimaryBuffer) @@ -121,7 +151,7 @@ IXSoundLayer* XMETHODCALLTYPE CSoundLayer::findLayer(const char *szName) IXSoundLayer *pFound = NULL; - for (maplayer::Iterator i = m_mapLayers.begin(); i != m_mapLayers.end(); i++) + for (maplayer::Iterator i = m_mapLayers.begin(); i; i++) { if ((pFound = m_mapLayers[i.first]->findLayer(szName))) break; @@ -165,12 +195,25 @@ IXSoundEmitter* XMETHODCALLTYPE CSoundLayer::newSoundEmitter(const char *szName, if (!szName) return NULL; - IXAudioCodecTarget *pCodecTarget = m_pSoundSystem->getCodecTarget(szName); - if (!pCodecTarget) - return NULL; + CSoundEmitter *pEmitter = NULL; + + if (m_mapSndEmitters.KeyExists(szName)) + { + CSoundEmitter *pEmitterOrigin = m_mapSndEmitters[szName]; + pEmitter = pEmitterOrigin->newInstance(); + } + else + { + IXAudioCodecTarget *pCodecTarget = m_pSoundSystem->getCodecTarget(szName); + if (!pCodecTarget) + return NULL; + + pEmitter = new CSoundEmitter(); + pEmitter->create(this, pCodecTarget); + } + + addSndEmitter(pEmitter, szName); - CSoundEmitter *pEmitter = new CSoundEmitter(); - pEmitter->create(this, pCodecTarget); return pEmitter; } @@ -179,24 +222,26 @@ IXSoundPlayer* XMETHODCALLTYPE CSoundLayer::newSoundPlayer(const char *szName, S if (!szName) return NULL; - CSoundPlayer *pSound = NULL; + CSoundPlayer *pPlayer = NULL; if (m_mapSndPlayers.KeyExists(szName)) { - pSound = m_mapSndPlayers[szName]; - return pSound->newInstance(); + pPlayer = m_mapSndPlayers[szName]; + //return pPlayer->newInstance(); } + else + { + IXAudioCodecTarget *pCodecTarget = m_pSoundSystem->getCodecTarget(szName); + if (!pCodecTarget) + return NULL; - IXAudioCodecTarget *pCodecTarget = m_pSoundSystem->getCodecTarget(szName); - if (!pCodecTarget) - return NULL; - - pSound = new CSoundPlayer(); - pSound->create(this, pCodecTarget); + pPlayer = new CSoundPlayer(); + pPlayer->create(this, pCodecTarget); + } - addSound(pSound, szName); + addSndPlayer(pPlayer, szName); - return pSound; + return pPlayer; } //########################################################################## @@ -208,10 +253,10 @@ void XMETHODCALLTYPE CSoundLayer::play(bool canPlay) m_isPlaying = canPlay; - for (maplayer::Iterator i = m_mapLayers.begin(); i != m_mapLayers.end(); i++) + for (maplayer::Iterator i = m_mapLayers.begin(); i; i++) m_mapLayers[i.first]->play(canPlay); - for (mapsoundplayer::Iterator i = m_mapSndPlayers.begin(); i != m_mapSndPlayers.end(); i++) + for (mapsoundplayer::Iterator i = m_mapSndPlayers.begin(); i; i++) { if (canPlay) m_mapSndPlayers[i.first]->resume(); @@ -219,6 +264,14 @@ void XMETHODCALLTYPE CSoundLayer::play(bool canPlay) m_mapSndPlayers[i.first]->pause(); } + for (mapsoundemitter::Iterator i = m_mapSndEmitters.begin(); i; i++) + { + if (canPlay) + m_mapSndEmitters[i.first]->resume(); + else + m_mapSndEmitters[i.first]->pause(); + } + m_pPrimaryBuffer->play(canPlay); } @@ -229,10 +282,10 @@ bool XMETHODCALLTYPE CSoundLayer::isPlaying() const void CSoundLayer::update() { - for (maplayer::Iterator i = m_mapLayers.begin(); i != m_mapLayers.end(); i++) + for (maplayer::Iterator i = m_mapLayers.begin(); i; i++) m_mapLayers[i.first]->update(); - for (mapsoundplayer::Iterator i = m_mapSndPlayers.begin(); i != m_mapLayers.end(); i++) + for (mapsoundplayer::Iterator i = m_mapSndPlayers.begin(); i; i++) m_mapSndPlayers[i.first]->update(); } diff --git a/source/xSound/SoundLayer.h b/source/xSound/SoundLayer.h index 3e435bbc6543b84d0536a4db96e99c6097778539..a95a93356eedacbe772882a40b217bcf8092e534 100644 --- a/source/xSound/SoundLayer.h +++ b/source/xSound/SoundLayer.h @@ -43,14 +43,22 @@ protected: friend CSoundSystem; friend CSoundPlayer; + friend CSoundEmitter; bool init(CSoundSystem *pSoundSystem, CSoundLayer *pParent, const AudioRawDesc *pDesc, const char *szName); + //************************************************************************ + void addLayer(CSoundLayer *pLayer, const char *szName); - void delLayer(CSoundLayer *pLayer); + void delLayer(const CSoundLayer *pLayer); + + void addSndPlayer(CSoundPlayer *pSndPlayer, const char *szName); + void delSndPlayer(const CSoundPlayer *pSndPlayer); - void addSound(CSoundPlayer *pSound, const char *szName); - void delSound(CSoundPlayer *pSound); + void addSndEmitter(CSoundEmitter *pSndEmitter, const char *szName); + void delSndEmitter(const CSoundEmitter *pSndEmitter); + + //************************************************************************ //! соответствует ли описание (его критические элементы) аудио буфера первичному буферу bool matchPrimaryLayer(const AudioRawDesc *pDesc); @@ -74,6 +82,9 @@ protected: typedef AssotiativeArray<String, CSoundPlayer*> mapsoundplayer; mapsoundplayer m_mapSndPlayers; + + typedef AssotiativeArray<String, CSoundEmitter*> mapsoundemitter; + mapsoundemitter m_mapSndEmitters; }; #endif diff --git a/source/xSound/SoundLoader.h b/source/xSound/SoundLoader.h index c17675c876510056330e916615b181a89778782c..6372307387125f716ca48cd01a13414bd9a154cf 100644 --- a/source/xSound/SoundLoader.h +++ b/source/xSound/SoundLoader.h @@ -22,8 +22,8 @@ See the license in LICENSE //! структура данных для потоковой загрузки struct CStreamData { - //! порядковый номер текущей загрузки частей (для определения позиции в звуке) - uint32_t uNumLoader = 0; + //! сколько частей уже проиграно (для определения позиции в звуке) + uint32_t uCountPlayed = 0; //! размер одной части в байтах uint32_t uPartSize = 0; diff --git a/source/xSound/SoundPlayer.cpp b/source/xSound/SoundPlayer.cpp index 53dbbe7cd29141da89b54dbfcef56d50f2600a7f..3220693dd75e76ef654898c037f93db4b674bcf7 100644 --- a/source/xSound/SoundPlayer.cpp +++ b/source/xSound/SoundPlayer.cpp @@ -8,6 +8,7 @@ CSoundPlayer::~CSoundPlayer() { + m_pLayer->delSndPlayer(this); mem_release_del(m_pAB); mem_delete(m_pCodecTarget); @@ -31,6 +32,8 @@ CSoundPlayer* CSoundPlayer::newInstance() pPlayer->m_state = SOUND_STATE_STOP; pPlayer->m_sName = this->m_sName; pPlayer->m_pLayer = this->m_pLayer; + pPlayer->m_fDist = this->m_fDist; + pPlayer->m_vWorldPos = this->m_vWorldPos; return pPlayer; } @@ -197,7 +200,7 @@ void CSoundPlayer::setPosStream(uint32_t uPos) uint32_t uPosAB = (uPos - (uParts * m_pStream->uPartSize * uCountParts)); uint32_t uCurrPart = uPosAB / m_pStream->uPartSize; - m_pStream->uNumLoader = uParts * uCountParts + uCurrPart; + m_pStream->uCountPlayed = uParts * uCountParts + uCurrPart; uint32_t uPosLoader = uPos - (uCurrPart * m_pStream->uPartSize); m_pCodecTarget->setPos(uPosLoader); @@ -215,7 +218,6 @@ void CSoundPlayer::setPosStream(uint32_t uPos) m_pAB->unlock(); m_pStream->aParts[i].isLoaded = true; - ++(m_pStream->uNumLoader); } else { @@ -234,38 +236,37 @@ uint32_t CSoundPlayer::getPosBytes() const uint32_t uPos = m_pAB->getPos(); if (m_pStream) - uPos = (uint64_t(uPos) + uint64_t(m_pStream->uPartSize) * uint64_t(m_pStream->uNumLoader)); + uPos = (uint64_t(uPos) + uint64_t(m_pStream->uPartSize) * uint64_t(m_pStream->uCountPlayed)); return uPos; } //########################################################################## -uint32_t uMax = 0; - void CSoundPlayer::update() { + if (!m_pLayer->isPlaying()) + return; + if (!m_pStream) return; uint32_t uGPosBytes = getPosBytes(); uint32_t uGPosBytes2 = m_pCodecTarget->getPos(); + /*static uint32_t uMax = 0; if (uMax < uGPosBytes) { uMax = uGPosBytes; - //printf("uMax = %d\n", uMax); - } + printf("uMax = %d\n", uMax); + }*/ if (uGPosBytes >= m_uLengthBytes) { if (m_loop == AB_LOOP_NONE) m_pAB->play(false); else - { - m_pCodecTarget->setPos(0); - m_pStream->uNumLoader = 0; - } + setTime(0.f); } if (!isPlaying()) @@ -285,6 +286,7 @@ void CSoundPlayer::update() m_pStream->aParts[i].isLoaded = false; size_t sizeRead = m_pCodecTarget->decode(m_pCodecTarget->getPos(), m_pStream->oData.uSize, (void**)&(m_pStream->oData.pData)); + ++(m_pStream->uCountPlayed); if (sizeRead == 0) continue; @@ -295,7 +297,6 @@ void CSoundPlayer::update() m_pAB->unlock(); m_pStream->aParts[i].isLoaded = true; - ++(m_pStream->uNumLoader); } } } diff --git a/source/xSound/SoundPlayer.h b/source/xSound/SoundPlayer.h index 3eb7d6a67087437e14c7ce07d724c853a1d19caf..24c157b1acba1b2137eb107f3aa5928a0dc315f2 100644 --- a/source/xSound/SoundPlayer.h +++ b/source/xSound/SoundPlayer.h @@ -51,12 +51,15 @@ protected: uint32_t getPosBytes() const; /*! установка позиции при потоковом воспроизведении - @param uPos позиция в байтах + @param uPos позиция в байтах */ void setPosStream(uint32_t uPos); //************************************************************************ + //! аудио буфер + IAudioBuffer *m_pAB = NULL; + //! зацикливать ли воспроизведение SOUND_LOOP m_loop = SOUND_LOOP_NONE;