SoundScene.h 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. #pragma once
  2. #ifndef _SoundScene_h_
  3. #define _SoundScene_h_
  4. #include "..\..\common_h\Sound.h"
  5. #include "SoundBankFile.h"
  6. #include "SoundsEngine.h"
  7. class Sound;
  8. class SoundService;
  9. class SoundScene : public ISoundScene
  10. {
  11. struct CntQueue
  12. {
  13. Sound * snd;
  14. float tailTime;
  15. dword priority;
  16. dword isLoop;
  17. };
  18. public:
  19. SoundScene(SoundService & service, const char * ovnerName, const char * cppFile, long cppLine);
  20. virtual ~SoundScene();
  21. //------------------------------------------------------------------------------------------
  22. //ISoundScene
  23. //------------------------------------------------------------------------------------------
  24. public:
  25. //Удалить сцену
  26. virtual void Release();
  27. //Создать непозиционированный звук, если звук не создался - вернётся null
  28. virtual ISound * Create(const ConstString & soundName, const char * _cppFile, long _cppLine, bool isStartPlay, bool autoDelete, float vol);
  29. //Создать позиционированный в 3D звук, если звук не создался - вернётся null
  30. virtual ISound3D * Create3D(const ConstString & soundName, const Vector & worldPos, const char * _cppFile, long _cppLine, bool isStartPlay, bool autoDelete, float vol);
  31. private:
  32. //Создать звук
  33. Sound * CreateSound(const ConstString & soundName, const char * _cppFile, long _cppLine, bool isStartPlay, bool autoDelete, const Vector * worldPos, float vol);
  34. public:
  35. //Продолжить звучание сцены
  36. virtual void Resume();
  37. //Приостановить звучание сцены
  38. virtual void Pause();
  39. //Узнать текущее состояние сцены
  40. virtual bool IsPause();
  41. //Установить общую громкость звучание всей сцены
  42. virtual void SetVolume(float volume);
  43. //Получить общую громкость звучание всей сцены
  44. virtual float GetVolume();
  45. //Установить позицию слушателя
  46. virtual void SetListenerMatrix(const Matrix & mtx);
  47. //Получить позицию слушателя
  48. virtual void GetListenerMatrix(Matrix & mtx);
  49. //Установить текущую окружающую сцену с временем перехода в секундах
  50. virtual void SetSoundEnvironmentScene(const Enveronment * envPeset, float blendTime);
  51. //Получить текущую окружающую сцену
  52. virtual void GetSoundEnvironmentScene(Enveronment & envPeset);
  53. //Переименовать владельца сцены
  54. virtual void ModifyOvnerName(const char * ovnerName);
  55. //------------------------------------------------------------------------------------------
  56. //SoundService
  57. //------------------------------------------------------------------------------------------
  58. public:
  59. //Обновить сцену
  60. void Update(float dltTime);
  61. //Обновить громкости
  62. void UpdateVolumes();
  63. //Остановить проигрывание всех звуков
  64. void StopAllSounds(const char * sceneOvner);
  65. //Проверить на используемость
  66. bool IsUse(SoundBankFileSound & sbfs);
  67. //Путь удаляемого звукового банка
  68. void CheckForDelete(const char * soundBankName);
  69. //Нарисовать отладочную информацию
  70. void DebugDraw(dword debugStates, long & line);
  71. //Написать в лог сообщение об неудалённой сцене
  72. void UnReleaseMessage();
  73. private:
  74. static bool CompareCntQueue(const CntQueue & q1, const CntQueue & q2);
  75. //------------------------------------------------------------------------------------------
  76. //Sound
  77. //------------------------------------------------------------------------------------------
  78. public:
  79. //Исполнить внутреннюю команду звука перед обновлением
  80. void ExecuteSoundCommand(Sound * snd);
  81. //Поставить звук на обновление
  82. void StartUpdate(Sound * snd);
  83. //Прекратить обновлять звук
  84. void StopUpdate(Sound * snd);
  85. //Поставить звук в очередь на доигрывание
  86. void SetToContinueQueue(Sound * snd, float tailTime, dword priority, bool isLoop);
  87. //Удалить звук из очереди на доигрывание
  88. void RemoveFromContinueQueue(Sound * snd);
  89. //Получить размер очереди на доигрывание
  90. dword GetCouninueQueueSize();
  91. public:
  92. //Получить громкость для звуков
  93. float GetVolumeSounds();
  94. //Получить громкость для музыки
  95. float GetVolumeMusic();
  96. //Преобразовать позицию из мира в систему слушателя проверив максимальную дистанцию
  97. bool ListenerTransfromPosition(const Vector & glb, float maxDist2, Vector & loc, float & dist2);
  98. //Удалить звук
  99. void ReleaseSound(Sound * snd);
  100. //Получить мастер сцены
  101. SoundsEngine::SceneMaster & GetSceneMaster();
  102. //Получить звуковой движёк
  103. SoundsEngine & GetSoundsEngine();
  104. //------------------------------------------------------------------------------------------
  105. //Пулы
  106. //------------------------------------------------------------------------------------------
  107. private:
  108. //Выделить из пула звук
  109. static Sound * SoundNew(SoundScene & scene, bool is3D, bool isAutodelete, SoundBankFileSound & sbfs, const char * bankName, const char * cppFile, long cppLine);
  110. //Освободить в пуле звук
  111. static void SoundDelete(Sound * ptr);
  112. public:
  113. //Очистить все пулы
  114. static void ClearPulls();
  115. //------------------------------------------------------------------------------------------
  116. private:
  117. SoundService & soundService; //Ссылка на сервис звука
  118. array<Sound *> sounds; //Заведёные звуки сцены
  119. array<Sound *> soundCommands; //Список звуков ждущих команды
  120. array<Sound *> soundUpdates; //Список звуков ждущих команды
  121. array<CntQueue> continueQueue; //Очередь звуков требующих продолжения
  122. Matrix listener; //Матрица позиции слушателя
  123. Matrix inverseListener; //Обратная матрица позиции слушателя
  124. float volume; //Громкость сцены
  125. float volumeSounds; //Громкость звуков
  126. float volumeMusic; //Громкость музыки
  127. SoundsEngine::SceneMaster * sm; //Сюда идут звуки сцены на которые действуют эффекты окружения
  128. bool isPause; //Состояние
  129. bool isQueueSorted; //Очередь продолжений сортированна
  130. bool isEvtBlend; //Блендить параметры сдеры окружения
  131. string ovnerNameSaved; //Сохранёное имя владельца сцены
  132. string cppFileSaved; //Сохранёное имя файла, откуда создавалась сцена
  133. long cppLineSaved; //Сохранёное строка файла, откуда создавалась сцена
  134. FxScene::EnvParams envCurrent; //Текущие параметры среды окружения
  135. FxScene::EnvParams envSet; //Требуемые параметры среды окружения
  136. float envBlendWeight; //Вес с которым действуют повые параметры среды окружения
  137. float envBlendSpeed; //Скорость, с которой происходит изменение параметров среды окружения
  138. };
  139. //Исполнить внутреннюю команду звука перед обновлением
  140. __forceinline void SoundScene::ExecuteSoundCommand(Sound * snd)
  141. {
  142. soundCommands.Add(snd);
  143. }
  144. //Получить громкость для звуков
  145. __forceinline float SoundScene::GetVolumeSounds()
  146. {
  147. return volumeSounds;
  148. }
  149. //Получить громкость для музыки
  150. __forceinline float SoundScene::GetVolumeMusic()
  151. {
  152. return volumeMusic;
  153. }
  154. //Преобразовать позицию из мира в систему слушателя
  155. __forceinline bool SoundScene::ListenerTransfromPosition(const Vector & glb, float maxDist2, Vector & loc, float & dist2)
  156. {
  157. dist2 = (glb - listener.pos).GetLength2();
  158. if(dist2 < maxDist2)
  159. {
  160. loc = inverseListener*glb;
  161. return true;
  162. }
  163. return false;
  164. }
  165. //Получить мастер сцены
  166. __forceinline SoundsEngine::SceneMaster & SoundScene::GetSceneMaster()
  167. {
  168. Assert(sm);
  169. return *sm;
  170. }
  171. //Получить размер очереди на доигрывание
  172. __forceinline dword SoundScene::GetCouninueQueueSize()
  173. {
  174. return continueQueue.Size();
  175. }
  176. #endif