sound3dhandle.cpp 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. /*
  2. ** Command & Conquer Renegade(tm)
  3. ** Copyright 2025 Electronic Arts Inc.
  4. **
  5. ** This program is free software: you can redistribute it and/or modify
  6. ** it under the terms of the GNU General Public License as published by
  7. ** the Free Software Foundation, either version 3 of the License, or
  8. ** (at your option) any later version.
  9. **
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. ** GNU General Public License for more details.
  14. **
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. /***********************************************************************************************
  19. *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
  20. ***********************************************************************************************
  21. * *
  22. * Project Name : wwaudio *
  23. * *
  24. * $Archive:: /Commando/Code/WWAudio/sound3dhandle.cpp $*
  25. * *
  26. * Author:: Patrick Smith *
  27. * *
  28. * $Modtime:: 10/31/01 3:00p $*
  29. * *
  30. * $Revision:: 3 $*
  31. * *
  32. *---------------------------------------------------------------------------------------------*
  33. * Functions: *
  34. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
  35. #include "sound3dhandle.h"
  36. #include "audiblesound.h"
  37. #include "wwprofile.h"
  38. //////////////////////////////////////////////////////////////////////
  39. //
  40. // Sound3DHandleClass
  41. //
  42. //////////////////////////////////////////////////////////////////////
  43. Sound3DHandleClass::Sound3DHandleClass (void) :
  44. SampleHandle ((H3DSAMPLE)INVALID_MILES_HANDLE)
  45. {
  46. return ;
  47. }
  48. //////////////////////////////////////////////////////////////////////
  49. //
  50. // ~Sound3DHandleClass
  51. //
  52. //////////////////////////////////////////////////////////////////////
  53. Sound3DHandleClass::~Sound3DHandleClass (void)
  54. {
  55. return ;
  56. }
  57. //////////////////////////////////////////////////////////////////////
  58. //
  59. // Initialize
  60. //
  61. //////////////////////////////////////////////////////////////////////
  62. void
  63. Sound3DHandleClass::Initialize (SoundBufferClass *buffer)
  64. {
  65. WWPROFILE ("Sound3DHandleClass::Initialize");
  66. SoundHandleClass::Initialize (buffer);
  67. if (SampleHandle != (H3DSAMPLE)INVALID_MILES_HANDLE && Buffer != NULL) {
  68. //
  69. // Configure the 3D sample
  70. //
  71. U32 success = ::AIL_set_3D_sample_file (SampleHandle, Buffer->Get_Raw_Buffer ());
  72. S32 test1 = 0;
  73. S32 test2 = 0;
  74. Get_Sample_MS_Position (&test1, &test2);
  75. //
  76. // Check for success
  77. //
  78. WWASSERT (success != 0);
  79. if (success == 0) {
  80. WWDEBUG_SAY (("WWAudio: Couldn't set 3d sample file. Reason %s\r\n", ::AIL_last_error ()));
  81. }
  82. }
  83. return ;
  84. }
  85. //////////////////////////////////////////////////////////////////////
  86. //
  87. // Start_Sample
  88. //
  89. //////////////////////////////////////////////////////////////////////
  90. void
  91. Sound3DHandleClass::Start_Sample (void)
  92. {
  93. if (SampleHandle != (H3DSAMPLE)INVALID_MILES_HANDLE) {
  94. ::AIL_start_3D_sample (SampleHandle);
  95. }
  96. return ;
  97. }
  98. //////////////////////////////////////////////////////////////////////
  99. //
  100. // Stop_Sample
  101. //
  102. //////////////////////////////////////////////////////////////////////
  103. void
  104. Sound3DHandleClass::Stop_Sample (void)
  105. {
  106. if (SampleHandle != (H3DSAMPLE)INVALID_MILES_HANDLE) {
  107. ::AIL_stop_3D_sample (SampleHandle);
  108. }
  109. return ;
  110. }
  111. //////////////////////////////////////////////////////////////////////
  112. //
  113. // Resume_Sample
  114. //
  115. //////////////////////////////////////////////////////////////////////
  116. void
  117. Sound3DHandleClass::Resume_Sample (void)
  118. {
  119. if (SampleHandle != (H3DSAMPLE)INVALID_MILES_HANDLE) {
  120. ::AIL_resume_3D_sample (SampleHandle);
  121. }
  122. return ;
  123. }
  124. //////////////////////////////////////////////////////////////////////
  125. //
  126. // End_Sample
  127. //
  128. //////////////////////////////////////////////////////////////////////
  129. void
  130. Sound3DHandleClass::End_Sample (void)
  131. {
  132. if (SampleHandle != (H3DSAMPLE)INVALID_MILES_HANDLE) {
  133. ::AIL_end_3D_sample (SampleHandle);
  134. }
  135. return ;
  136. }
  137. //////////////////////////////////////////////////////////////////////
  138. //
  139. // Set_Sample_Pan
  140. //
  141. //////////////////////////////////////////////////////////////////////
  142. void
  143. Sound3DHandleClass::Set_Sample_Pan (S32 /*pan*/)
  144. {
  145. return ;
  146. }
  147. //////////////////////////////////////////////////////////////////////
  148. //
  149. // Get_Sample_Pan
  150. //
  151. //////////////////////////////////////////////////////////////////////
  152. S32
  153. Sound3DHandleClass::Get_Sample_Pan (void)
  154. {
  155. return 64;
  156. }
  157. //////////////////////////////////////////////////////////////////////
  158. //
  159. // Set_Sample_Volume
  160. //
  161. //////////////////////////////////////////////////////////////////////
  162. void
  163. Sound3DHandleClass::Set_Sample_Volume (S32 volume)
  164. {
  165. if (SampleHandle != (H3DSAMPLE)INVALID_MILES_HANDLE) {
  166. ::AIL_set_3D_sample_volume (SampleHandle, volume);
  167. }
  168. return ;
  169. }
  170. //////////////////////////////////////////////////////////////////////
  171. //
  172. // Get_Sample_Volume
  173. //
  174. //////////////////////////////////////////////////////////////////////
  175. S32
  176. Sound3DHandleClass::Get_Sample_Volume (void)
  177. {
  178. S32 retval = 0;
  179. if (SampleHandle != (H3DSAMPLE)INVALID_MILES_HANDLE) {
  180. retval = ::AIL_3D_sample_volume (SampleHandle);
  181. }
  182. return retval;
  183. }
  184. //////////////////////////////////////////////////////////////////////
  185. //
  186. // Set_Sample_Loop_Count
  187. //
  188. //////////////////////////////////////////////////////////////////////
  189. void
  190. Sound3DHandleClass::Set_Sample_Loop_Count (U32 count)
  191. {
  192. if (SampleHandle != (H3DSAMPLE)INVALID_MILES_HANDLE) {
  193. ::AIL_set_3D_sample_loop_count (SampleHandle, count);
  194. }
  195. return ;
  196. }
  197. //////////////////////////////////////////////////////////////////////
  198. //
  199. // Get_Sample_Loop_Count
  200. //
  201. //////////////////////////////////////////////////////////////////////
  202. U32
  203. Sound3DHandleClass::Get_Sample_Loop_Count (void)
  204. {
  205. U32 retval = 0;
  206. if (SampleHandle != (H3DSAMPLE)INVALID_MILES_HANDLE) {
  207. retval = ::AIL_3D_sample_loop_count (SampleHandle);
  208. }
  209. return retval;
  210. }
  211. //////////////////////////////////////////////////////////////////////
  212. //
  213. // Set_Sample_MS_Position
  214. //
  215. //////////////////////////////////////////////////////////////////////
  216. void
  217. Sound3DHandleClass::Set_Sample_MS_Position (U32 ms)
  218. {
  219. if (SampleHandle != (H3DSAMPLE)INVALID_MILES_HANDLE) {
  220. WWASSERT (Buffer != NULL);
  221. U32 bytes_per_sec = (Buffer->Get_Rate () * Buffer->Get_Bits ()) >> 3;
  222. U32 bytes = (ms * bytes_per_sec) / 1000;
  223. bytes += (bytes & 1);
  224. ::AIL_set_3D_sample_offset (SampleHandle, bytes);
  225. }
  226. return ;
  227. }
  228. //////////////////////////////////////////////////////////////////////
  229. //
  230. // Get_Sample_MS_Position
  231. //
  232. //////////////////////////////////////////////////////////////////////
  233. void
  234. Sound3DHandleClass::Get_Sample_MS_Position (S32 *len, S32 *pos)
  235. {
  236. if (SampleHandle != (H3DSAMPLE)INVALID_MILES_HANDLE) {
  237. WWASSERT (Buffer != NULL);
  238. if (pos != NULL) {
  239. U32 bytes = ::AIL_3D_sample_offset (SampleHandle);
  240. U32 bytes_per_sec = (Buffer->Get_Rate () * Buffer->Get_Bits ()) >> 3;
  241. U32 ms = (bytes * 1000) / bytes_per_sec;
  242. (*pos) = ms;
  243. }
  244. if (len != NULL) {
  245. U32 bytes = ::AIL_3D_sample_length (SampleHandle);
  246. U32 bytes_per_sec = (Buffer->Get_Rate () * Buffer->Get_Bits ()) >> 3;
  247. U32 ms = (bytes * 1000) / bytes_per_sec;
  248. (*len) = ms;
  249. }
  250. }
  251. return ;
  252. }
  253. //////////////////////////////////////////////////////////////////////
  254. //
  255. // Set_Sample_User_Data
  256. //
  257. //////////////////////////////////////////////////////////////////////
  258. void
  259. Sound3DHandleClass::Set_Sample_User_Data (S32 i, U32 val)
  260. {
  261. if (SampleHandle != (H3DSAMPLE)INVALID_MILES_HANDLE) {
  262. ::AIL_set_3D_object_user_data (SampleHandle, i, val);
  263. }
  264. return ;
  265. }
  266. //////////////////////////////////////////////////////////////////////
  267. //
  268. // Get_Sample_User_Data
  269. //
  270. //////////////////////////////////////////////////////////////////////
  271. U32
  272. Sound3DHandleClass::Get_Sample_User_Data (S32 i)
  273. {
  274. U32 retval = 0;
  275. if (SampleHandle != (H3DSAMPLE)INVALID_MILES_HANDLE) {
  276. retval = AIL_3D_object_user_data (SampleHandle, i);
  277. }
  278. return retval;
  279. }
  280. //////////////////////////////////////////////////////////////////////
  281. //
  282. // Get_Sample_Playback_Rate
  283. //
  284. //////////////////////////////////////////////////////////////////////
  285. S32
  286. Sound3DHandleClass::Get_Sample_Playback_Rate (void)
  287. {
  288. S32 retval = 0;
  289. if (SampleHandle != (H3DSAMPLE)INVALID_MILES_HANDLE) {
  290. retval = ::AIL_3D_sample_playback_rate (SampleHandle);
  291. }
  292. return retval;
  293. }
  294. //////////////////////////////////////////////////////////////////////
  295. //
  296. // Set_Sample_Playback_Rate
  297. //
  298. //////////////////////////////////////////////////////////////////////
  299. void
  300. Sound3DHandleClass::Set_Sample_Playback_Rate (S32 rate)
  301. {
  302. if (SampleHandle != (H3DSAMPLE)INVALID_MILES_HANDLE) {
  303. ::AIL_set_3D_sample_playback_rate (SampleHandle, rate);
  304. }
  305. return ;
  306. }
  307. //////////////////////////////////////////////////////////////////////
  308. //
  309. // Set_Miles_Handle
  310. //
  311. //////////////////////////////////////////////////////////////////////
  312. void
  313. Sound3DHandleClass::Set_Miles_Handle (uint32 handle)
  314. {
  315. WWASSERT (SampleHandle == (H3DSAMPLE)INVALID_MILES_HANDLE);
  316. SampleHandle = (H3DSAMPLE)handle;
  317. return ;
  318. }