audioDataBlock.cc 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) 2013 GarageGames, LLC
  3. //
  4. // Permission is hereby granted, free of charge, to any person obtaining a copy
  5. // of this software and associated documentation files (the "Software"), to
  6. // deal in the Software without restriction, including without limitation the
  7. // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  8. // sell copies of the Software, and to permit persons to whom the Software is
  9. // furnished to do so, subject to the following conditions:
  10. //
  11. // The above copyright notice and this permission notice shall be included in
  12. // all copies or substantial portions of the Software.
  13. //
  14. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19. // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  20. // IN THE SOFTWARE.
  21. //-----------------------------------------------------------------------------
  22. #include "audio/audioDataBlock.h"
  23. #include "console/consoleTypes.h"
  24. #include "platform/platformAL.h"
  25. #include "network/netConnection.h"
  26. //--------------------------------------------------------------------------
  27. namespace
  28. {
  29. void writeRangedF32(BitStream * bstream, F32 val, F32 min, F32 max, U32 numBits)
  30. {
  31. val = (mClampF(val, min, max) - min) / (max - min);
  32. bstream->writeInt((S32)(val * ((1 << numBits) - 1)), numBits);
  33. }
  34. F32 readRangedF32(BitStream * bstream, F32 min, F32 max, U32 numBits)
  35. {
  36. return(min + (F32(bstream->readInt(numBits)) / F32((1 << numBits) - 1)) * (max - min));
  37. }
  38. void writeRangedS32(BitStream * bstream, S32 val, S32 min, S32 max)
  39. {
  40. bstream->writeRangedU32((val - min), 0, (max - min));
  41. }
  42. S32 readRangedS32(BitStream * bstream, S32 min, S32 max)
  43. {
  44. return(bstream->readRangedU32(0, (max - min)) + min);
  45. }
  46. }
  47. //--------------------------------------------------------------------------
  48. // Class AudioEnvironment:
  49. //--------------------------------------------------------------------------
  50. IMPLEMENT_CO_DATABLOCK_V1(AudioEnvironment);
  51. AudioEnvironment::AudioEnvironment()
  52. {
  53. mUseRoom = true;
  54. #if !defined(TORQUE_OS_IOS) && !defined(TORQUE_OS_ANDROID)
  55. mRoom = EAX_ENVIRONMENT_GENERIC;
  56. #endif
  57. mRoomHF = 0;
  58. mReflections = 0;
  59. mReverb = 0;
  60. mRoomRolloffFactor = 0.1f;
  61. mDecayTime = 0.1f;
  62. mDecayHFRatio = 0.1f;
  63. mReflectionsDelay = 0.f;
  64. mReverbDelay = 0.f;
  65. mRoomVolume = 0;
  66. mEffectVolume = 0.f;
  67. mDamping = 0.f;
  68. mEnvironmentSize = 10.f;
  69. mEnvironmentDiffusion = 1.f;
  70. mAirAbsorption = 0.f;
  71. mFlags = 0;
  72. }
  73. #if !defined(TORQUE_OS_IOS) && !defined(TORQUE_OS_ANDROID)
  74. static EnumTable::Enums roomEnums[] =
  75. {
  76. { EAX_ENVIRONMENT_GENERIC, "GENERIC" }, // 0
  77. { EAX_ENVIRONMENT_PADDEDCELL, "PADDEDCELL" },
  78. { EAX_ENVIRONMENT_ROOM, "ROOM" },
  79. { EAX_ENVIRONMENT_BATHROOM, "BATHROOM" },
  80. { EAX_ENVIRONMENT_LIVINGROOM, "LIVINGROOM" },
  81. { EAX_ENVIRONMENT_STONEROOM, "STONEROOM" }, // 5
  82. { EAX_ENVIRONMENT_AUDITORIUM, "AUDITORIUM" },
  83. { EAX_ENVIRONMENT_CONCERTHALL, "CONCERTHALL" },
  84. { EAX_ENVIRONMENT_CAVE, "CAVE" },
  85. { EAX_ENVIRONMENT_ARENA, "ARENA" },
  86. { EAX_ENVIRONMENT_HANGAR, "HANGAR" }, // 10
  87. { EAX_ENVIRONMENT_CARPETEDHALLWAY, "CARPETEDHALLWAY" },
  88. { EAX_ENVIRONMENT_HALLWAY, "HALLWAY" },
  89. { EAX_ENVIRONMENT_STONECORRIDOR, "STONECORRIDOR" },
  90. { EAX_ENVIRONMENT_ALLEY, "ALLEY" },
  91. { EAX_ENVIRONMENT_FOREST, "FOREST" }, // 15
  92. { EAX_ENVIRONMENT_CITY, "CITY" },
  93. { EAX_ENVIRONMENT_MOUNTAINS, "MOUNTAINS" },
  94. { EAX_ENVIRONMENT_QUARRY, "QUARRY" },
  95. { EAX_ENVIRONMENT_PLAIN, "PLAIN" },
  96. { EAX_ENVIRONMENT_PARKINGLOT, "PARKINGLOT" }, // 20
  97. { EAX_ENVIRONMENT_SEWERPIPE, "SEWERPIPE" },
  98. { EAX_ENVIRONMENT_UNDERWATER, "UNDERWATER" },
  99. { EAX_ENVIRONMENT_DRUGGED, "DRUGGED" },
  100. { EAX_ENVIRONMENT_DIZZY, "DIZZY" },
  101. { EAX_ENVIRONMENT_PSYCHOTIC, "PSYCHOTIC" } // 25
  102. };
  103. static EnumTable gAudioEnvironmentRoomTypes(sizeof(roomEnums) / sizeof(roomEnums[0]), &roomEnums[0]);
  104. #endif
  105. //--------------------------------------------------------------------------
  106. IMPLEMENT_CONSOLETYPE(AudioEnvironment)
  107. IMPLEMENT_GETDATATYPE(AudioEnvironment)
  108. IMPLEMENT_SETDATATYPE(AudioEnvironment)
  109. void AudioEnvironment::initPersistFields()
  110. {
  111. Parent::initPersistFields();
  112. addField("useRoom", TypeBool, Offset(mUseRoom, AudioEnvironment));
  113. #if !defined(TORQUE_OS_IOS) && !defined(TORQUE_OS_ANDROID)
  114. addField("room", TypeEnum, Offset(mRoom, AudioEnvironment), 1, &gAudioEnvironmentRoomTypes);
  115. #endif
  116. addField("roomHF", TypeS32, Offset(mRoomHF, AudioEnvironment));
  117. addField("reflections", TypeS32, Offset(mReflections, AudioEnvironment));
  118. addField("reverb", TypeS32, Offset(mReverb, AudioEnvironment));
  119. addField("roomRolloffFactor", TypeF32, Offset(mRoomRolloffFactor, AudioEnvironment));
  120. addField("decayTime", TypeF32, Offset(mDecayTime, AudioEnvironment));
  121. addField("decayHFRatio", TypeF32, Offset(mDecayHFRatio, AudioEnvironment));
  122. addField("reflectionsDelay", TypeF32, Offset(mReflectionsDelay, AudioEnvironment));
  123. addField("reverbDelay", TypeF32, Offset(mReverbDelay, AudioEnvironment));
  124. addField("roomVolume", TypeS32, Offset(mRoomVolume, AudioEnvironment));
  125. addField("effectVolume", TypeF32, Offset(mEffectVolume, AudioEnvironment));
  126. addField("damping", TypeF32, Offset(mDamping, AudioEnvironment));
  127. addField("environmentSize", TypeF32, Offset(mEnvironmentSize, AudioEnvironment));
  128. addField("environmentDiffusion", TypeF32, Offset(mEnvironmentDiffusion, AudioEnvironment));
  129. addField("airAbsorption", TypeF32, Offset(mAirAbsorption, AudioEnvironment));
  130. addField("flags", TypeS32, Offset(mFlags, AudioEnvironment));
  131. }
  132. void AudioEnvironment::packData(BitStream* stream)
  133. {
  134. Parent::packData(stream);
  135. #if !defined(TORQUE_OS_IOS) && !defined(TORQUE_OS_ANDROID)
  136. if(stream->writeFlag(mUseRoom))
  137. stream->writeRangedU32(mRoom, EAX_ENVIRONMENT_GENERIC, EAX_ENVIRONMENT_COUNT);
  138. else
  139. #endif
  140. {
  141. writeRangedS32(stream, mRoomHF, -10000, 0);
  142. writeRangedS32(stream, mReflections, -10000, 10000);
  143. writeRangedS32(stream, mReverb, -10000, 2000);
  144. writeRangedF32(stream, mRoomRolloffFactor, 0.1f, 10.f, 8);
  145. writeRangedF32(stream, mDecayTime, 0.1f, 20.f, 8);
  146. writeRangedF32(stream, mDecayHFRatio, 0.1f, 20.f, 8);
  147. writeRangedF32(stream, mReflectionsDelay, 0.f, 0.3f, 9);
  148. writeRangedF32(stream, mReverbDelay, 0.f, 0.1f, 7);
  149. writeRangedS32(stream, mRoomVolume, -10000, 0);
  150. writeRangedF32(stream, mEffectVolume, 0.f, 1.f, 8);
  151. writeRangedF32(stream, mDamping, 0.f, 2.f, 9);
  152. writeRangedF32(stream, mEnvironmentSize, 1.f, 100.f, 10);
  153. writeRangedF32(stream, mEnvironmentDiffusion, 0.f, 1.f, 8);
  154. writeRangedF32(stream, mAirAbsorption, -100.f, 0.f, 10);
  155. stream->writeInt(mFlags, 6);
  156. }
  157. }
  158. void AudioEnvironment::unpackData(BitStream* stream)
  159. {
  160. Parent::unpackData(stream);
  161. mUseRoom = stream->readFlag();
  162. #if !defined(TORQUE_OS_IOS) && !defined(TORQUE_OS_ANDROID)
  163. if(mUseRoom)
  164. mRoom = stream->readRangedU32(EAX_ENVIRONMENT_GENERIC, EAX_ENVIRONMENT_COUNT);
  165. else
  166. #endif
  167. {
  168. mRoomHF = readRangedS32(stream, -10000, 0);
  169. mReflections = readRangedS32(stream, -10000, 10000);
  170. mReverb = readRangedS32(stream, -10000, 2000);
  171. mRoomRolloffFactor = readRangedF32(stream, 0.1f, 10.f, 8);
  172. mDecayTime = readRangedF32(stream, 0.1f, 20.f, 8);
  173. mDecayHFRatio = readRangedF32(stream, 0.1f, 20.f, 8);
  174. mReflectionsDelay = readRangedF32(stream, 0.f, 0.3f, 9);
  175. mReverbDelay = readRangedF32(stream, 0.f, 0.1f, 7);
  176. mRoomVolume = readRangedS32(stream, -10000, 0);
  177. mEffectVolume = readRangedF32(stream, 0.f, 1.f, 8);
  178. mDamping = readRangedF32(stream, 0.f, 2.f, 9);
  179. mEnvironmentSize = readRangedF32(stream, 1.f, 100.f, 10);
  180. mEnvironmentDiffusion = readRangedF32(stream, 0.f, 1.f, 8);
  181. mAirAbsorption = readRangedF32(stream, -100.f, 0.f, 10);
  182. mFlags = stream->readInt(6);
  183. }
  184. }
  185. //--------------------------------------------------------------------------
  186. // Class AudioEnvironmentProfile:
  187. //--------------------------------------------------------------------------
  188. IMPLEMENT_CO_DATABLOCK_V1(AudioSampleEnvironment);
  189. AudioSampleEnvironment::AudioSampleEnvironment()
  190. {
  191. mDirect = 0;
  192. mDirectHF = 0;
  193. mRoom = 0;
  194. mRoomHF = 0;
  195. mObstruction = 0.f;
  196. mObstructionLFRatio = 0.f;
  197. mOcclusion = 0.f;
  198. mOcclusionLFRatio = 0.f;
  199. mOcclusionRoomRatio = 0.f;
  200. mRoomRolloff = 0.f;
  201. mAirAbsorption = 0.f;
  202. mOutsideVolumeHF = 0;
  203. mFlags = 0;
  204. }
  205. //--------------------------------------------------------------------------
  206. IMPLEMENT_CONSOLETYPE(AudioSampleEnvironment)
  207. IMPLEMENT_GETDATATYPE(AudioSampleEnvironment)
  208. IMPLEMENT_SETDATATYPE(AudioSampleEnvironment)
  209. void AudioSampleEnvironment::initPersistFields()
  210. {
  211. Parent::initPersistFields();
  212. addField("direct", TypeS32, Offset(mDirect, AudioSampleEnvironment));
  213. addField("directHF", TypeS32, Offset(mDirectHF, AudioSampleEnvironment));
  214. addField("room", TypeS32, Offset(mRoom, AudioSampleEnvironment));
  215. addField("obstruction", TypeF32, Offset(mObstruction, AudioSampleEnvironment));
  216. addField("obstructionLFRatio", TypeF32, Offset(mObstructionLFRatio, AudioSampleEnvironment));
  217. addField("occlusion", TypeF32, Offset(mOcclusion, AudioSampleEnvironment));
  218. addField("occlusionLFRatio", TypeF32, Offset(mOcclusionLFRatio, AudioSampleEnvironment));
  219. addField("occlusionRoomRatio", TypeF32, Offset(mOcclusionRoomRatio, AudioSampleEnvironment));
  220. addField("roomRolloff", TypeF32, Offset(mRoomRolloff, AudioSampleEnvironment));
  221. addField("airAbsorption", TypeF32, Offset(mAirAbsorption, AudioSampleEnvironment));
  222. addField("outsideVolumeHF", TypeS32, Offset(mOutsideVolumeHF, AudioSampleEnvironment));
  223. addField("flags", TypeS32, Offset(mFlags, AudioSampleEnvironment));
  224. }
  225. void AudioSampleEnvironment::packData(BitStream* stream)
  226. {
  227. Parent::packData(stream);
  228. writeRangedS32(stream, mDirect, -10000, 1000);
  229. writeRangedS32(stream, mDirectHF, -10000, 0);
  230. writeRangedS32(stream, mRoom, -10000, 1000);
  231. writeRangedS32(stream, mRoomHF, -10000, 0);
  232. writeRangedF32(stream, mObstruction, 0.f, 1.f, 9);
  233. writeRangedF32(stream, mObstructionLFRatio, 0.f, 1.f, 8);
  234. writeRangedF32(stream, mOcclusion, 0.f, 1.f, 9);
  235. writeRangedF32(stream, mOcclusionLFRatio, 0.f, 1.f, 8);
  236. writeRangedF32(stream, mOcclusionRoomRatio, 0.f, 10.f, 9);
  237. writeRangedF32(stream, mRoomRolloff, 0.f, 10.f, 9);
  238. writeRangedF32(stream, mAirAbsorption, 0.f, 10.f, 9);
  239. writeRangedS32(stream, mOutsideVolumeHF, -10000, 0);
  240. stream->writeInt(mFlags, 3);
  241. }
  242. void AudioSampleEnvironment::unpackData(BitStream* stream)
  243. {
  244. Parent::unpackData(stream);
  245. mDirect = readRangedS32(stream, -10000, 1000);
  246. mDirectHF = readRangedS32(stream, -10000, 0);
  247. mRoom = readRangedS32(stream, -10000, 1000);
  248. mRoomHF = readRangedS32(stream, -10000, 0);
  249. mObstruction = readRangedF32(stream, 0.f, 1.f, 9);
  250. mObstructionLFRatio = readRangedF32(stream, 0.f, 1.f, 8);
  251. mOcclusion = readRangedF32(stream, 0.f, 1.f, 9);
  252. mOcclusionLFRatio = readRangedF32(stream, 0.f, 1.f, 8);
  253. mOcclusionRoomRatio = readRangedF32(stream, 0.f, 10.f, 9);
  254. mRoomRolloff = readRangedF32(stream, 0.f, 10.f, 9);
  255. mAirAbsorption = readRangedF32(stream, 0.f, 10.f, 9);
  256. mOutsideVolumeHF = readRangedS32(stream, -10000, 0);
  257. mFlags = stream->readInt(3);
  258. }