diff --git a/sdks/mital b/sdks/mital index d0cbed91d28e1816044820a77902b37ed33b4596..fd57ec3eb23d3d7c01ee792fe778827c75ce5b48 160000 --- a/sdks/mital +++ b/sdks/mital @@ -1 +1 @@ -Subproject commit d0cbed91d28e1816044820a77902b37ed33b4596 +Subproject commit fd57ec3eb23d3d7c01ee792fe778827c75ce5b48 diff --git a/source/game/GameData.cpp b/source/game/GameData.cpp index bb38523c4041be8ab4366d66a3a01bb3704db9d4..6575219621d623a437b5cd602dbf64bc5b0d3b29 100644 --- a/source/game/GameData.cpp +++ b/source/game/GameData.cpp @@ -1407,7 +1407,10 @@ void GameData::playFootstepSound(MTLTYPE_PHYSIC mtl_type, const float3 &f3Pos) SSCore_SndInstancePlay3d(idSound, false, false, (float3*)&f3Pos);*/ IXSoundEmitter *pEmitter = m_aFootstepSound[mtl_type][rand() % iCount]; if (pEmitter) + { + pEmitter->setWorldPos(f3Pos); pEmitter->play(); + } } void GameData::loadFoostepsSounds() diff --git a/source/game/SoundPlayer.cpp b/source/game/SoundPlayer.cpp index 17491fd4a92b613ae4c3d1a46b2112ad277c320e..cc9f528e844aaeaf909a8e43647eb9d9d951f7a2 100644 --- a/source/game/SoundPlayer.cpp +++ b/source/game/SoundPlayer.cpp @@ -9,8 +9,34 @@ BEGIN_PROPTABLE(CSoundPlayer) DEFINE_FIELD_STRINGFN(m_szPathSound, 0, "file", "Sound file", setSound, EDITOR_SOUND) +DEFINE_FIELD_FLOAT(m_fVolume, 0, "volume", "Volume", EDITOR_TEXTFIELD) + DEFINE_FIELD_FLOAT(m_fDist, 0, "distance", "Hearing distance", EDITOR_TEXTFIELD) +DEFINE_FIELD_INT(m_iLoop, 0, "loop", "Loop", EDITOR_COMBOBOX) + COMBO_OPTION("None", "0") //!< Нет + COMBO_OPTION("Simple", "1") //!< Простое (могут быть пустоты на стыках конца с началом) + COMBO_OPTION("Seamless", "2") //!< Непрерывное (пустот не будет, все будет заполнено звуком) +EDITOR_COMBO_END() + +DEFINE_FIELD_INT(m_iType, 0, "type", "Type", EDITOR_COMBOBOX) + COMBO_OPTION("2D", "0") + COMBO_OPTION("3D", "1") +EDITOR_COMBO_END() + +//! Включить +DEFINE_INPUT(turnOn, "turnOn", "Turn On", PDF_NONE) +//! Выключить +DEFINE_INPUT(turnOff, "turnOff", "Turn Off", PDF_NONE) + +//! При включении +DEFINE_OUTPUT(m_onTurnOn, "OnTurnOn", "On Turn On") +//! При выключении +DEFINE_OUTPUT(m_onTurnOff, "OnTurnOff", "On Turn Off") + +//! Изначально проигрывается +DEFINE_FLAG(SND_PLAYER_START_PLAYED, "Play on") + END_PROPTABLE() REGISTER_ENTITY(CSoundPlayer, sound_player); @@ -26,22 +52,75 @@ CSoundPlayer::CSoundPlayer(CEntityManager *pMgr): void CSoundPlayer::setSound(const char *szSound) { - mem_release(m_pPlayer); - IXSoundSystem *pSound = (IXSoundSystem*)(Core_GetIXCore()->getPluginManager()->getInterface(IXSOUNDSYSTEM_GUID)); - IXSoundLayer *pMasterLayer = pSound->findLayer("master"); - m_pPlayer = pMasterLayer->newSoundPlayer(szSound, SOUND_DTYPE_3D); - if (m_pPlayer) + if (!m_pPlayer || strcasecmp(m_pPlayer->getName(), szSound) != 0) { - m_pPlayer->setLoop(SOUND_LOOP_SIMPLE); - m_pPlayer->play(); + mem_release(m_pPlayer); + IXSoundSystem *pSound = (IXSoundSystem*)(Core_GetIXCore()->getPluginManager()->getInterface(IXSOUNDSYSTEM_GUID)); + IXSoundLayer *pMasterLayer = pSound->findLayer("master"); + m_pPlayer = pMasterLayer->newSoundPlayer(szSound, (SOUND_DTYPE)m_iType); + + if (m_pPlayer) + { + m_szPathSound = szSound; + m_pPlayer->setLoop((SOUND_LOOP)m_iLoop); + m_pPlayer->setVolume(m_fVolume); + + if (getFlags() & SND_PLAYER_START_PLAYED) + m_pPlayer->play(); + } } } void CSoundPlayer::onSync() { + CPointEntity::onSync(); if (!m_pPlayer) return; float3 vPos = getPos(); m_pPlayer->setWorldPos(vPos); + + if (m_pPlayer->getLoop() != (SOUND_LOOP)m_iLoop) + m_pPlayer->setLoop((SOUND_LOOP)m_iLoop); + + if (m_pPlayer->getVolume() != m_fVolume) + m_pPlayer->setVolume(m_fVolume); + + if (m_iType != m_pPlayer->getType()) + { + m_pPlayer->setType((SOUND_DTYPE)m_iType); + m_pPlayer->setPan(0.f); + } +} + +void CSoundPlayer::turnOn(inputdata_t * pInputdata) +{ + if (m_pPlayer) + m_pPlayer->play(); + FIRE_OUTPUT(m_onTurnOn, pInputdata->pInflictor); +} + +void CSoundPlayer::turnOff(inputdata_t * pInputdata) +{ + if (m_pPlayer) + m_pPlayer->stop(); + FIRE_OUTPUT(m_onTurnOff, pInputdata->pInflictor); +} + +//************************************************************************** + +void CSoundPlayer::updateFlags() +{ + BaseClass::updateFlags(); + + if (getFlags() & SND_PLAYER_START_PLAYED) + { + if (m_pPlayer) + m_pPlayer->play(); + } + else + { + if (m_pPlayer) + m_pPlayer->stop(); + } } \ No newline at end of file diff --git a/source/game/SoundPlayer.h b/source/game/SoundPlayer.h index 58d463da065e65c05d0d3bd4053c4aeed2fb3744..90b729b0c1898e427b3f0c7e5e72531e2edaa2f3 100644 --- a/source/game/SoundPlayer.h +++ b/source/game/SoundPlayer.h @@ -1,12 +1,12 @@ /***************************************************** -Copyright � DogmaNet Team, 2020 +Copyright © DogmaNet Team, 2020 Site: dogmanet.ru See the license in LICENSE *****************************************************/ /*! \file - ����� ��������� ������ + Класс звукового плеера */ #ifndef __SOUND_PLAYER_H #define __SOUND_PLAYER_H @@ -14,8 +14,9 @@ See the license in LICENSE #include "PointEntity.h" #include <xcommon/IXSoundSystem.h> +#define SND_PLAYER_START_PLAYED ENT_FLAG_0 -/*! ����� ��������� ������ +/*! Класс звукового плеера \ingroup cpointentity */ class CSoundPlayer : public CPointEntity @@ -23,7 +24,6 @@ class CSoundPlayer : public CPointEntity DECLARE_CLASS(CSoundPlayer, CPointEntity); DECLARE_PROPTABLE(); public: - //CSoundPlayer() = default; CSoundPlayer(CEntityManager * pMgr); virtual void setSound(const char *szSound); @@ -35,11 +35,25 @@ public: void play(); protected: + + void updateFlags() override; + + void turnOn(inputdata_t *pInputdata); + void turnOff(inputdata_t *pInputdata); + + //######################################################################## + + output_t m_onTurnOn; + output_t m_onTurnOff; IXSoundPlayer *m_pPlayer = NULL; const char *m_szPathSound = ""; + int m_iLoop = SOUND_LOOP_NONE; float m_fDist = 10.f; + float m_fVolume = 1.f; + + int m_iType = SOUND_DTYPE_3D; }; #endif diff --git a/source/xSound/SoundBase.cpp b/source/xSound/SoundBase.cpp index 8b28f7f1664347d22e4ad17e3a6e64b760c913f6..6281c59a761348f6b852f50e239196fcb0bda045 100644 --- a/source/xSound/SoundBase.cpp +++ b/source/xSound/SoundBase.cpp @@ -3,11 +3,21 @@ //########################################################################## -SOUND_DTYPE XMETHODCALLTYPE CSoundBase::getType() +SOUND_DTYPE XMETHODCALLTYPE CSoundBase::getType() const { return m_dtype; } +void XMETHODCALLTYPE CSoundBase::setType(SOUND_DTYPE dtype) +{ + m_dtype = dtype; +} + +const char* XMETHODCALLTYPE CSoundBase::getName() const +{ + return m_sName.c_str(); +} + void XMETHODCALLTYPE CSoundBase::setVolume(float fVolume) { m_fVolume = fVolume; diff --git a/source/xSound/SoundBase.h b/source/xSound/SoundBase.h index b6de20455067cc5a644c4d349da116808d2e05ca..754cc88b5c5a1001b8e51d4d462ea48222114377 100644 --- a/source/xSound/SoundBase.h +++ b/source/xSound/SoundBase.h @@ -23,7 +23,10 @@ public: SX_ALIGNED_OP_MEM - virtual SOUND_DTYPE XMETHODCALLTYPE getType() final; + virtual SOUND_DTYPE XMETHODCALLTYPE getType() const final; + virtual void XMETHODCALLTYPE setType(SOUND_DTYPE dtype) final; + + virtual const char* XMETHODCALLTYPE getName() const final; virtual void XMETHODCALLTYPE setVolume(float fVolume) final; virtual float XMETHODCALLTYPE getVolume() const final; diff --git a/source/xSound/SoundEmitter.cpp b/source/xSound/SoundEmitter.cpp index 1536107900c2500a040da7656b8a81894faee83d..83b1c7c6b8510324d71b78f2f72758fedf2593cc 100644 --- a/source/xSound/SoundEmitter.cpp +++ b/source/xSound/SoundEmitter.cpp @@ -10,6 +10,10 @@ CSoundEmitter::~CSoundEmitter() { m_pLayer->delSndEmitter(this); + for (int i = 0; i < m_aInstances.size(); ++i) + { + mem_delete(m_aInstances[i]); + } } //************************************************************************** @@ -18,7 +22,7 @@ CSoundEmitter* CSoundEmitter::newInstance() { CSoundEmitter *pEmitter = new CSoundEmitter(); - pEmitter->m_aInstances[0].pAB = m_aInstances[0].pAB->newInstance(); + 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; @@ -44,9 +48,9 @@ void XMETHODCALLTYPE CSoundEmitter::play() //проход по массиву инстансов звука, если есть первый попавшийся не проигрываемые тогда его проигрываем for (int i = 0, il = m_aInstances.size(); i<il; ++i) { - if (!(m_aInstances[i].pAB->isPlaying())) + if (!(m_aInstances[i]->pAB->isPlaying())) { - pAB = m_aInstances[i].pAB; + pAB = m_aInstances[i]->pAB; continue; } } @@ -54,12 +58,12 @@ void XMETHODCALLTYPE CSoundEmitter::play() if (!pAB) { //если пришли сюда, значит нет свободных инстансов, создаем новый и проигрыаем - IAudioBuffer *pInst = m_aInstances[0].pAB->newInstance(); + IAudioBuffer *pInst = m_aInstances[0]->pAB->newInstance(); pAB = pInst; - m_aInstances.push_back(pInst); + m_aInstances.push_back(new Instance(pInst)); } - Com3D(pAB, m_fDist, m_vWorldPos, vPos, vLook, vUp); + Com3D(pAB, m_fDist, m_fVolume, m_vWorldPos, vPos, vLook, vUp); pAB->play(true); } @@ -70,8 +74,8 @@ 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); + if (m_aInstances[i]->isPlaying) + m_aInstances[i]->pAB->play(true); } } @@ -80,18 +84,19 @@ 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); + m_aInstances[i]->isPlaying = m_aInstances[i]->pAB->isPlaying(); + m_aInstances[i]->pAB->play(false); } } //************************************************************************** -bool CSoundEmitter::create(CSoundLayer *pLayer, IXAudioCodecTarget *pCodecTarget, SOUND_DTYPE dtype) +bool CSoundEmitter::create(const char* szName, CSoundLayer *pLayer, IXAudioCodecTarget *pCodecTarget, SOUND_DTYPE dtype) { if (!pCodecTarget || !pLayer) return false; + m_sName = szName; m_dtype = dtype; AudioRawDesc oDesc; pCodecTarget->getDesc(&oDesc); @@ -111,7 +116,7 @@ bool CSoundEmitter::create(CSoundLayer *pLayer, IXAudioCodecTarget *pCodecTarget pAB->setLoop(AB_LOOP_NONE); - m_aInstances.push_back(Instance(pAB)); + m_aInstances.push_back(new Instance(pAB)); return true; } @@ -125,9 +130,9 @@ void CSoundEmitter::update(const float3 &vListenerPos, const float3 &vListenerDi for (int i = 0, il = m_aInstances.size(); i < il; ++i) { - if (m_aInstances[i].pAB->isPlaying()) + if (m_aInstances[i]->pAB->isPlaying()) { - Com3D(m_aInstances[i].pAB, m_fDist, m_vWorldPos, vListenerPos, vListenerDir, vListenerUp); + Com3D(m_aInstances[i]->pAB, m_fDist, m_fVolume, m_vWorldPos, vListenerPos, vListenerDir, vListenerUp); } } } \ No newline at end of file diff --git a/source/xSound/SoundEmitter.h b/source/xSound/SoundEmitter.h index 318fe788508b13b01c80c87f6692a9f113c285e8..0b95ad57bb304d6881a63932511a6f01581a28cf 100644 --- a/source/xSound/SoundEmitter.h +++ b/source/xSound/SoundEmitter.h @@ -38,7 +38,7 @@ protected: friend CSoundLayer; - bool create(CSoundLayer *pLayer, IXAudioCodecTarget *pCodecTarget, SOUND_DTYPE dtype); + bool create(const char* szName, CSoundLayer *pLayer, IXAudioCodecTarget *pCodecTarget, SOUND_DTYPE dtype); struct Instance { @@ -49,7 +49,7 @@ protected: bool isPlaying = false; }; - Array<Instance> m_aInstances; + Array<Instance*> m_aInstances; }; #endif diff --git a/source/xSound/SoundLayer.cpp b/source/xSound/SoundLayer.cpp index 88ef9d7594ccbcbd6537ffdc423c026a6cd1b164..7f8e4fffafef3658d142720cc3762da87188b623 100644 --- a/source/xSound/SoundLayer.cpp +++ b/source/xSound/SoundLayer.cpp @@ -18,20 +18,31 @@ CSoundLayer::~CSoundLayer() m_mapLayers.erase(i.first); } - for (mapsoundplayer::Iterator i = m_mapSndPlayers.begin(); i; i++) + for (MapPlayer::Iterator i = m_mapSndPlayers.begin(); i; i++) { - mem_release(m_mapSndPlayers[i.first]); - m_mapSndPlayers.erase(i.first); + /*mem_release(m_mapSndPlayers[i.first]); + m_mapSndPlayers.erase(i.first);*/ + ArrayPlayer *oAP = i.second; + for (int k = 0, kl = oAP->size(); k < kl; ++k) + { + mem_release(oAP->get(k)); + } } + m_mapSndPlayers.clear(); - int iCount0 = m_mapSndEmitters.Size(); - for (mapsoundemitter::Iterator i = m_mapSndEmitters.begin(); i; i++) + for (MapEmitter::Iterator i = m_mapSndEmitters.begin(); i; i++) { - mem_release(m_mapSndEmitters[i.first]); - m_mapSndEmitters.erase(i.first); + /*mem_release(m_mapSndEmitters[i.first]); + m_mapSndEmitters.erase(i.first);*/ + ArrayEmitter *oAE = i.second; + for (int k = 0, kl = oAE->size(); k < kl; ++k) + { + mem_release(oAE->get(k)); + } } + m_mapSndEmitters.clear(); - mem_release_del(m_pPrimaryBuffer); + mem_release(m_pPrimaryBuffer); } //************************************************************************** @@ -84,12 +95,25 @@ void CSoundLayer::delLayer(const CSoundLayer *pLayer) void CSoundLayer::addSndPlayer(CSoundPlayer *pSndPlayer, const char *szName) { - m_mapSndPlayers[szName] = pSndPlayer; + m_mapSndPlayers[szName].push_back(pSndPlayer); } void CSoundLayer::delSndPlayer(const CSoundPlayer *pSndPlayer) { - for (mapsoundplayer::Iterator i = m_mapSndPlayers.begin(); i; i++) + const char *szName = pSndPlayer->getName(); + if (!m_mapSndPlayers.KeyExists(szName)) + return; + + const ArrayPlayer *oAP = m_mapSndPlayers.at(szName); + for (int i = 0, il = oAP->size(); i < il; ++i) + { + if (oAP->get(i) == pSndPlayer) + { + m_mapSndPlayers[szName].erase(i); + } + } + + /*for (MapPlayer::Iterator i = m_mapSndPlayers.begin(); i; i++) { if (m_mapSndPlayers[i.first] == pSndPlayer) { @@ -97,20 +121,31 @@ void CSoundLayer::delSndPlayer(const CSoundPlayer *pSndPlayer) m_mapSndPlayers.erase(i.first); break; } - } + }*/ } //************************************************************************** void CSoundLayer::addSndEmitter(CSoundEmitter *pSndEmitter, const char *szName) { - m_mapSndEmitters[szName] = pSndEmitter; + m_mapSndEmitters[szName].push_back(pSndEmitter); } void CSoundLayer::delSndEmitter(const CSoundEmitter *pSndEmitter) { - int iCount0 = m_mapSndEmitters.Size(); - for (mapsoundemitter::Iterator i = m_mapSndEmitters.begin(); i; i++) + const char *szName = pSndEmitter->getName(); + if (!m_mapSndEmitters.KeyExists(szName)) + return; + + const ArrayEmitter *oAE = m_mapSndEmitters.at(szName); + for (int i = 0, il = oAE->size(); i < il; ++i) + { + if (oAE->get(i) == pSndEmitter) + { + m_mapSndEmitters[szName].erase(i); + } + } + /*for (MapPlayer::Iterator i = m_mapSndEmitters.begin(); i; i++) { if (m_mapSndEmitters[i.first] == pSndEmitter) { @@ -118,9 +153,7 @@ void CSoundLayer::delSndEmitter(const CSoundEmitter *pSndEmitter) m_mapSndEmitters.erase(i.first); break; } - } - int iCount1 = m_mapSndEmitters.Size(); - int qwerty = 0; + }*/ } //************************************************************************** @@ -198,10 +231,14 @@ IXSoundEmitter* XMETHODCALLTYPE CSoundLayer::newSoundEmitter(const char *szName, CSoundEmitter *pEmitter = NULL; - if (m_mapSndEmitters.KeyExists(szName)) + if (m_mapSndEmitters.KeyExists(szName) && m_mapSndPlayers[szName].size() > 0) { - CSoundEmitter *pEmitterOrigin = m_mapSndEmitters[szName]; - pEmitter = pEmitterOrigin->newInstance(); + /*CSoundEmitter *pEmitterOrigin = m_mapSndEmitters[szName]; + pEmitter = pEmitterOrigin->newInstance();*/ + + pEmitter = m_mapSndEmitters[szName][0]->newInstance(); + /*addSndEmitter(pEmitter, szName); + return pEmitter;*/ } else { @@ -210,7 +247,7 @@ IXSoundEmitter* XMETHODCALLTYPE CSoundLayer::newSoundEmitter(const char *szName, return NULL; pEmitter = new CSoundEmitter(); - pEmitter->create(this, pCodecTarget, dtype); + pEmitter->create(szName, this, pCodecTarget, dtype); } addSndEmitter(pEmitter, szName); @@ -225,21 +262,23 @@ IXSoundPlayer* XMETHODCALLTYPE CSoundLayer::newSoundPlayer(const char *szName, S CSoundPlayer *pPlayer = NULL; - if (m_mapSndPlayers.KeyExists(szName)) + if (m_mapSndPlayers.KeyExists(szName) && m_mapSndPlayers[szName].size() > 0) { - if (m_mapSndPlayers[szName]) - pPlayer = m_mapSndPlayers[szName]; - //return pPlayer->newInstance(); + CSoundPlayer *pPlayerOrigin = m_mapSndPlayers[szName][0]; + if (pPlayerOrigin->canInstance()) + { + pPlayer = m_mapSndPlayers[szName][0]->newInstance(); + addSndPlayer(pPlayer, szName); + return pPlayer; + } } - else - { - IXAudioCodecTarget *pCodecTarget = m_pSoundSystem->getCodecTarget(szName); - if (!pCodecTarget) - return NULL; + + IXAudioCodecTarget *pCodecTarget = m_pSoundSystem->getCodecTarget(szName); + if (!pCodecTarget) + return NULL; - pPlayer = new CSoundPlayer(); - pPlayer->create(this, pCodecTarget, dtype); - } + pPlayer = new CSoundPlayer(); + pPlayer->create(szName, this, pCodecTarget, dtype); addSndPlayer(pPlayer, szName); @@ -258,20 +297,38 @@ void XMETHODCALLTYPE CSoundLayer::play(bool canPlay) for (maplayer::Iterator i = m_mapLayers.begin(); i; i++) m_mapLayers[i.first]->play(canPlay); - for (mapsoundplayer::Iterator i = m_mapSndPlayers.begin(); i; i++) + for (MapPlayer::Iterator i = m_mapSndPlayers.begin(); i; i++) { - if (canPlay) + /*if (canPlay) m_mapSndPlayers[i.first]->resume(); else - m_mapSndPlayers[i.first]->pause(); + m_mapSndPlayers[i.first]->pause();*/ + + ArrayPlayer *oAP = i.second; + for (int k = 0, kl = oAP->size(); k < kl; ++k) + { + if (canPlay) + oAP->get(k)->resume(); + else + oAP->get(k)->pause(); + } } - for (mapsoundemitter::Iterator i = m_mapSndEmitters.begin(); i; i++) + for (MapEmitter::Iterator i = m_mapSndEmitters.begin(); i; i++) { - if (canPlay) + /*if (canPlay) m_mapSndEmitters[i.first]->resume(); else - m_mapSndEmitters[i.first]->pause(); + m_mapSndEmitters[i.first]->pause();*/ + + ArrayEmitter *oAE = i.second; + for (int k = 0, kl = oAE->size(); k < kl; ++k) + { + if (canPlay) + oAE->get(k)->resume(); + else + oAE->get(k)->pause(); + } } m_pPrimaryBuffer->play(canPlay); @@ -290,16 +347,24 @@ void CSoundLayer::update(const float3 &vListenerPos, const float3 &vListenerDir, m_mapLayers[i.first]->update(vListenerPos, vListenerDir, vListenerUp); } - for (mapsoundplayer::Iterator i = m_mapSndPlayers.begin(); i; i++) + for (MapPlayer::Iterator i = m_mapSndPlayers.begin(); i; i++) { - if (m_mapSndPlayers[i.first]) - m_mapSndPlayers[i.first]->update(vListenerPos, vListenerDir, vListenerUp); + /*if (m_mapSndPlayers[i.first]) + m_mapSndPlayers[i.first]->update(vListenerPos, vListenerDir, vListenerUp);*/ + + ArrayPlayer *oAP = i.second; + for (int k = 0, kl = oAP->size(); k < kl; ++k) + oAP->get(k)->update(vListenerPos, vListenerDir, vListenerUp); } - for (mapsoundemitter::Iterator i = m_mapSndEmitters.begin(); i; i++) + for (MapEmitter::Iterator i = m_mapSndEmitters.begin(); i; i++) { - if (m_mapSndEmitters[i.first]) - m_mapSndEmitters[i.first]->update(vListenerPos, vListenerDir, vListenerUp); + /*if (m_mapSndEmitters[i.first]) + m_mapSndEmitters[i.first]->update(vListenerPos, vListenerDir, vListenerUp);*/ + + ArrayEmitter *oAE = i.second; + for (int k = 0, kl = oAE->size(); k < kl; ++k) + oAE->get(k)->update(vListenerPos, vListenerDir, vListenerUp); } } diff --git a/source/xSound/SoundLayer.h b/source/xSound/SoundLayer.h index 06b901608f63450394188ee5cfb8fe29ea765f62..29c455858471a3c359e96491636044454a8ae5b9 100644 --- a/source/xSound/SoundLayer.h +++ b/source/xSound/SoundLayer.h @@ -82,11 +82,13 @@ protected: typedef AssotiativeArray<String, CSoundLayer*> maplayer; maplayer m_mapLayers; - typedef AssotiativeArray<String, CSoundPlayer*> mapsoundplayer; - mapsoundplayer m_mapSndPlayers; + typedef Array<CSoundPlayer*> ArrayPlayer; + typedef AssotiativeArray<String, ArrayPlayer> MapPlayer; + MapPlayer m_mapSndPlayers; - typedef AssotiativeArray<String, CSoundEmitter*> mapsoundemitter; - mapsoundemitter m_mapSndEmitters; + typedef Array<CSoundEmitter*> ArrayEmitter; + typedef AssotiativeArray<String, ArrayEmitter> MapEmitter; + MapEmitter m_mapSndEmitters; }; #endif diff --git a/source/xSound/SoundPlayer.cpp b/source/xSound/SoundPlayer.cpp index 648532c1f5d6e717bd6bd460971b7e6b31ed49a4..fcf6670640eec71eddcfccf86b5f86fcbc4c856d 100644 --- a/source/xSound/SoundPlayer.cpp +++ b/source/xSound/SoundPlayer.cpp @@ -9,7 +9,7 @@ CSoundPlayer::~CSoundPlayer() { m_pLayer->delSndPlayer(this); - mem_release_del(m_pAB); + mem_release(m_pAB); mem_delete(m_pCodecTarget); mem_delete(m_pStream); @@ -17,6 +17,11 @@ CSoundPlayer::~CSoundPlayer() //************************************************************************** +bool CSoundPlayer::canInstance() const +{ + return (!m_pStream); +} + CSoundPlayer* CSoundPlayer::newInstance() { if (m_pStream) @@ -34,16 +39,18 @@ CSoundPlayer* CSoundPlayer::newInstance() pPlayer->m_pLayer = this->m_pLayer; pPlayer->m_fDist = this->m_fDist; pPlayer->m_vWorldPos = this->m_vWorldPos; + pPlayer->m_sName = this->m_sName; return pPlayer; } //************************************************************************** -bool CSoundPlayer::create(CSoundLayer *pLayer, IXAudioCodecTarget *pCodecTarget, SOUND_DTYPE dtype) +bool CSoundPlayer::create(const char* szName, CSoundLayer *pLayer, IXAudioCodecTarget *pCodecTarget, SOUND_DTYPE dtype) { if (!pCodecTarget || !pLayer) return false; + m_sName = szName; m_dtype = dtype; m_pLayer = pLayer; m_pCodecTarget = pCodecTarget; @@ -99,7 +106,7 @@ void XMETHODCALLTYPE CSoundPlayer::play() float3 vPos, vLook, vUp; m_pLayer->getObserverParam(&vPos, &vLook, &vUp); - Com3D(m_pAB, m_fDist, m_vWorldPos, vPos, vLook, vUp); + Com3D(m_pAB, m_fDist, m_fVolume, m_vWorldPos, vPos, vLook, vUp); m_pAB->play(true); m_state = SOUND_STATE_PLAY; } @@ -231,6 +238,7 @@ void CSoundPlayer::setPosStream(uint32_t uPos) } } + m_pAB->setPos(0); int qwerty = 0; } @@ -255,7 +263,7 @@ void CSoundPlayer::update(const float3 &vListenerPos, const float3 &vListenerDir if (m_dtype == SOUND_DTYPE_3D) { - Com3D(m_pAB, m_fDist, m_vWorldPos, vListenerPos, vListenerDir, vListenerUp); + Com3D(m_pAB, m_fDist, m_fVolume, m_vWorldPos, vListenerPos, vListenerDir, vListenerUp); } if (!m_pStream) diff --git a/source/xSound/SoundPlayer.h b/source/xSound/SoundPlayer.h index e21098dd48cc669deb91af4c154e82a1a99af274..73ba0b431e37c15c4c3e06eb3bdac36fdd2a165c 100644 --- a/source/xSound/SoundPlayer.h +++ b/source/xSound/SoundPlayer.h @@ -23,6 +23,7 @@ public: ~CSoundPlayer(); + bool canInstance() const; CSoundPlayer* newInstance(); virtual void XMETHODCALLTYPE play() override; @@ -46,7 +47,7 @@ protected: void update(const float3 &vListenerPos, const float3 &vListenerDir, const float3 &vListenerUp); - bool create(CSoundLayer *pLayer, IXAudioCodecTarget *pCodecTarget, SOUND_DTYPE dtype); + bool create(const char* szName, CSoundLayer *pLayer, IXAudioCodecTarget *pCodecTarget, SOUND_DTYPE dtype); //! возвращает текущую позицию проигрывания звука в байтах uint32_t getPosBytes() const; diff --git a/source/xSound/SoundSystem.h b/source/xSound/SoundSystem.h index 62ffad2c74decfb24ee6ee4cfe48bf59e99c00cc..8d621c30692e92062e6bfaeec7a07c8878666a82 100644 --- a/source/xSound/SoundSystem.h +++ b/source/xSound/SoundSystem.h @@ -32,13 +32,13 @@ inline float Com3DPan(const float3 &vSnd, const float3 &vListenerPos, const floa return pan; } -inline void Com3D(IAudioBuffer *pAB, float fDist, const float3 &vSnd, const float3 &vListenerPos, const float3 &vListenerDir, const float3 &vListenerUp) +inline void Com3D(IAudioBuffer *pAB, float fDist, float m_fVolume, const float3 &vSnd, const float3 &vListenerPos, const float3 &vListenerDir, const float3 &vListenerUp) { float fPan = Com3DPan(vSnd, vListenerPos, vListenerDir, vListenerUp); float fVolume = 1.f - saturatef(SMVector3Distance(vSnd, vListenerPos) / fDist); fPan = lerpf(fPan, 0.f, fVolume); pAB->setPan(fPan); - pAB->setVolume(fVolume); + pAB->setVolume(fVolume*m_fVolume); } //########################################################################## diff --git a/source/xcommon/IXSoundSystem.h b/source/xcommon/IXSoundSystem.h index 88b92812bcc171175f6eac04b446475a614e2e03..060bab35fc9095388f022120764b6ef9e600ffe7 100644 --- a/source/xcommon/IXSoundSystem.h +++ b/source/xcommon/IXSoundSystem.h @@ -41,7 +41,10 @@ enum SOUND_LOOP class IXSoundBase: public IXUnknown { public: - virtual SOUND_DTYPE XMETHODCALLTYPE getType() = 0; + virtual SOUND_DTYPE XMETHODCALLTYPE getType() const = 0; + virtual void XMETHODCALLTYPE setType(SOUND_DTYPE dtype) = 0; + + virtual const char* XMETHODCALLTYPE getName() const = 0; virtual void XMETHODCALLTYPE play() = 0;