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;