Sound.h 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #pragma once
  2. #include "..\..\common_h\Sound.h"
  3. #include "SoundBankFile.h"
  4. #include "SoundsEngine.h"
  5. class SoundScene;
  6. class SoundService;
  7. class Sound : public ISound3D
  8. {
  9. enum States
  10. {
  11. //Состояния ожидания
  12. cmd_none = 0,
  13. cmd_play = 1, //Был выбран старт, в конце кадра надо запустить проигрывание
  14. cmd_stop = 2, //Ожидание остановки звука
  15. cmd_fadein = 3, //Начать проигрывать с увеличивающейся громкостью
  16. cmd_fadeout = 4, //Остановить проигрывание с плавно уменьшающейся громкостью
  17. cmd_mask = 0xff, //Маска для изъятия команды
  18. //Текущие состояния
  19. s_play = 0x10000, //В текущий момент проигрываеться волна
  20. s_pause = 0x20000, //Звук находиться на паузе
  21. s_outofrange = 0x40000, //3D звук за пределами
  22. s_mask = 0xff0000, //Маска состояний
  23. //Константные состояния
  24. att_isAutoDelete = 0x20000000, //Удалить звук при остановке
  25. att_isLoop = 0x40000000, //Зацикленный звук
  26. att_is3D = 0x80000000, //Звук используеться как 3D
  27. };
  28. enum Const
  29. {
  30. c_time_to_skip_lost_ms = 1500, //Время остатка, при котором потерянный звук уже не востанавливаеться
  31. c_fade_time_to_restore = 500, //Время фэйда востанавливающегося звука
  32. };
  33. public:
  34. Sound(SoundScene & scene, bool is3D, bool isAutodelete, SoundBankFileSound & snd, const char * bankName, const char * _cppFile, long _cppLine);
  35. virtual ~Sound();
  36. public:
  37. //Удалить звук
  38. virtual void Release();
  39. //Проиграть
  40. virtual void Play();
  41. //Остановить
  42. virtual void Stop();
  43. //Узнать текущее состояние
  44. virtual bool IsPlay();
  45. //Установить громкость звука
  46. virtual void SetVolume(float volume);
  47. //Получить громкость звука
  48. virtual float GetVolume();
  49. //Получить имя звука
  50. virtual const char * GetName();
  51. //Получить имя звукового банка
  52. virtual const char * GetSoundBankName();
  53. //Запустить звук проигрываться и плавно увеличить громкость за time секунд
  54. virtual void FadeIn(float time);
  55. //Плавно уменьшить громкость до 0 за time секунд и остановить проигрывание звука
  56. virtual void FadeOut(float time);
  57. //Узнать, зациклен звук или нет
  58. virtual bool IsLoop();
  59. //Вернуть идентификатор фонемы. Если отрицательный результат - фонемы нет, 0 - тишина
  60. virtual long GetPhonemeId(ErrorCode * ecode);
  61. public:
  62. //Установить позицию источника звука
  63. virtual void SetPosition(const Vector & position);
  64. //Получить позицию источника звука
  65. virtual Vector GetPosition();
  66. public:
  67. //Приостоновить звук
  68. void ScenePause();
  69. //Продолжить проигрывать звук
  70. void SceneResume();
  71. //Продолжить проигрывание звука с потерянным каналом
  72. bool ContinueLost();
  73. //Установить код для пула
  74. void SetPullCode(dword code);
  75. //Получить код пула
  76. dword GetPullCode();
  77. public:
  78. //Исполнить команду
  79. void ExecuteCommand();
  80. //Обновить звук (если true, то звук выкинуть из списка обновления)
  81. void Update(float dltTime);
  82. //Написать в лог сообщение об неудалённом звуке
  83. void UnReleaseMessage(const char * sceneOvner);
  84. //Отобразить отладочную информацию
  85. void DebugDraw(dword debugStates, long & line, const char * sceneOvner);
  86. //Нарисовать слушателя
  87. static void DebugDrawListener(dword debugStates, const Matrix & listener, const char * sceneOvner);
  88. //Написать о параметрах эффекта среды окружения
  89. static void DebugDrawEnvironment(dword debugStates, long & line, const char * sceneOvner, const FxScene::EnvParams & env);
  90. //Вывести глобальные параметры
  91. static void DebugDrawGlobals(dword debugStates, SoundService & service);
  92. //Этот ли звук
  93. bool IsThis(SoundBankFileSound & sbfs);
  94. private:
  95. //Установить команду на исполнение
  96. void SetCommand(States cmd);
  97. //Запустить звук на проигрывание немедленно
  98. void PlayNow(bool isFadeIn);
  99. //Мэнеджмент канала и волн
  100. void ProcessChannel(long count = 4);
  101. //Остановить звук немедленно
  102. void StopNow(bool noRelease = false);
  103. //Заместить этот звук новым
  104. void Replase();
  105. //Обновить громкость звука
  106. void UpdateVolume();
  107. //Обновить позицию звука
  108. float Update3DPosition(bool isUpdateChannel);
  109. #ifndef STOP_DEBUG
  110. //Вывести отладочную информацию для 3D звука
  111. void DebugDraw3D(dword drawLevel, const char * sceneOvner);
  112. //Вывести отладочную информацию для 2D звука
  113. void DebugDraw2D(dword drawLevel, long & line, const char * sceneOvner);
  114. #endif
  115. private:
  116. SoundsEngine::SoundChannel * channel; //Используемый канал для проигрывания звука
  117. SoundBankFileSound & sbfSound; //Данные звука
  118. const char * soundBankName; //Имя звукового банка, которому принадлежит звук
  119. dword states; //Текущие состояние звука
  120. float currentTime; //Текущие время проигрывания звука
  121. SoundBankFileWaveInfo * wave; //Текущая проигрываемая волна
  122. SoundBankFilePhonemes * phonemes; //Фонемы
  123. dword phonemesFrame; //Последняя позиция с которой были считаны фонемы
  124. SoundScene & soundScene; //Сцена, которой принадлежим
  125. float currentVolume; //Текущая громкость звука
  126. Vector globalPos; //Позиция в глобальной системе
  127. float fadeTime; //Время фэйд-эффекта
  128. dword pausePosition; //Позиция паузы
  129. Sound * playPrev; //Предыдущий в списке проигрываемых
  130. Sound * playNext; //Следующий в списке проигрываемых
  131. dword pullCode; //Код текущего пула памяти
  132. const char * cppFile; //Файл из которого был создан звук
  133. long cppLine; //Строка с которой был создан звук
  134. };
  135. //Установить код для пула
  136. __forceinline void Sound::SetPullCode(dword code)
  137. {
  138. pullCode = code;
  139. }
  140. //Получить код пула
  141. __forceinline dword Sound::GetPullCode()
  142. {
  143. return pullCode;
  144. }
  145. //Этот ли звук
  146. __forceinline bool Sound::IsThis(SoundBankFileSound & sbfs)
  147. {
  148. return (&sbfs == &sbfSound);
  149. }