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;