AUD_Level.cpp 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. /*
  2. ** Command & Conquer Generals(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. ** **
  20. ** Westwood Studios Pacific. **
  21. ** **
  22. ** Confidential Information **
  23. ** Copyright (C) 2000 - All Rights Reserved **
  24. ** **
  25. ******************************************************************************
  26. ** **
  27. ** Project: Dune Emperor **
  28. ** **
  29. ** Module: <module> (<prefix>_) **
  30. ** **
  31. ** Version: $ID$ **
  32. ** **
  33. ** File name: audlevel.cpp **
  34. ** **
  35. ** Created by: 11/16/95 TR **
  36. ** **
  37. ** Description: <description> **
  38. ** **
  39. *****************************************************************************/
  40. /*****************************************************************************
  41. ** Includes **
  42. *****************************************************************************/
  43. #include <wpaudio/altypes.h>
  44. #include <wpaudio/level.h>
  45. #include <wpaudio/time.h>
  46. // 'assignment within condition expression'.
  47. #pragma warning(disable : 4706)
  48. DBG_DECLARE_TYPE ( AudioLevel )
  49. /*****************************************************************************
  50. ** Externals **
  51. *****************************************************************************/
  52. /*****************************************************************************
  53. ** Defines **
  54. *****************************************************************************/
  55. /*****************************************************************************
  56. ** Private Types **
  57. *****************************************************************************/
  58. /*****************************************************************************
  59. ** Private Data **
  60. *****************************************************************************/
  61. /*****************************************************************************
  62. ** Public Data **
  63. *****************************************************************************/
  64. /*****************************************************************************
  65. ** Private Prototypes **
  66. *****************************************************************************/
  67. /*****************************************************************************
  68. ** Private Functions **
  69. *****************************************************************************/
  70. /*****************************************************************************
  71. ** Public Functions **
  72. *****************************************************************************/
  73. /******************************************************************/
  74. /* */
  75. /* */
  76. /******************************************************************/
  77. void AudioLevelInit ( AudioLevel *level, int startLevel )
  78. {
  79. DBG_ASSERT ( level != NULL );
  80. DBG_SET_TYPE ( level, AudioLevel );
  81. level->flags = 0;
  82. level->lastTime = AudioGetTime ();
  83. AudioLevelSetDuration ( level, SECONDS(1), AUDIO_LEVEL_MAX);
  84. AudioLevelSet ( level, startLevel );
  85. AudioLevelUpdate ( level );
  86. }
  87. /******************************************************************/
  88. /* */
  89. /* */
  90. /******************************************************************/
  91. void AudioLevelSet ( AudioLevel *level, int newLevel )
  92. {
  93. DBG_ASSERT_TYPE ( level, AudioLevel );
  94. DBG_ASSERT (newLevel>=AUDIO_LEVEL_MIN);
  95. DBG_ASSERT (newLevel<=AUDIO_LEVEL_MAX);
  96. level->flags |= AUDIO_LEVEL_SET;
  97. level->newLevel = (newLevel<<AUDIO_LEVEL_SCALE);
  98. }
  99. /******************************************************************/
  100. /* */
  101. /* */
  102. /******************************************************************/
  103. void AudioLevelForce( AudioLevel *level)
  104. {
  105. DBG_ASSERT_TYPE ( level, AudioLevel );
  106. level->flags |= AUDIO_LEVEL_SET;
  107. }
  108. #ifdef _DEBUG
  109. /******************************************************************/
  110. /* */
  111. /* */
  112. /******************************************************************/
  113. int AudioLevelApply ( AudioLevel *level, int val )
  114. {
  115. DBG_ASSERT_TYPE ( level, AudioLevel );
  116. DBG_ASSERT (val >= AUDIO_LEVEL_MIN_VAL);
  117. DBG_ASSERT (val <= AUDIO_LEVEL_MAX_VAL);
  118. return AUDIO_LEVEL_APPLY(level,val);
  119. }
  120. #endif
  121. /******************************************************************/
  122. /* */
  123. /* */
  124. /******************************************************************/
  125. void AudioLevelAdjust ( AudioLevel *level, int newLevel )
  126. {
  127. DBG_ASSERT_TYPE ( level, AudioLevel );
  128. DBG_ASSERT (newLevel>=AUDIO_LEVEL_MIN);
  129. DBG_ASSERT (newLevel<=AUDIO_LEVEL_MAX);
  130. level->flags &= ~AUDIO_LEVEL_SET;
  131. if ( level->newLevel == level->level)
  132. {
  133. level->lastTime = AudioGetTime ();
  134. }
  135. level->newLevel = newLevel<<AUDIO_LEVEL_SCALE;
  136. }
  137. /******************************************************************/
  138. /* */
  139. /* */
  140. /******************************************************************/
  141. void AudioLevelSetDuration ( AudioLevel *level, TimeStamp time, int range )
  142. {
  143. DBG_ASSERT_TYPE ( level, AudioLevel );
  144. DBG_ASSERT ( time != 0 );
  145. DBG_ASSERT (range > 0);
  146. DBG_ASSERT (range <= AUDIO_LEVEL_MAX);
  147. level->change = (range<< AUDIO_LEVEL_SCALE) / (uint) time;
  148. level->duration = time;
  149. }
  150. /******************************************************************/
  151. /* */
  152. /* */
  153. /******************************************************************/
  154. int AudioLevelUpdate ( AudioLevel *level )
  155. {
  156. int dif;
  157. int delta; // amount to move by this update
  158. TimeStamp time, thisTime;
  159. DBG_ASSERT_TYPE ( level, AudioLevel );
  160. if ( (dif = (level->newLevel - level->level)) )
  161. {
  162. if (level->flags & AUDIO_LEVEL_SET )
  163. {
  164. level->level = level->newLevel;
  165. }
  166. else
  167. {
  168. // calculate what the delta change is for this update
  169. thisTime = AudioGetTime ( ) ;
  170. time = thisTime - level->lastTime;
  171. level->lastTime = thisTime; // remember time of this update
  172. // the next check avoid overflowing the delta
  173. if (time > level->duration)
  174. {
  175. time = level->duration;
  176. }
  177. delta = level->change * (uint) time;
  178. if (dif<0)
  179. {
  180. if ( delta > (-dif))
  181. {
  182. level->level += dif;
  183. }
  184. else
  185. {
  186. level->level -= delta;
  187. }
  188. }
  189. else
  190. {
  191. if ( delta > dif )
  192. {
  193. level->level += dif;
  194. }
  195. else
  196. {
  197. level->level += delta;
  198. }
  199. }
  200. }
  201. // there was a change in the level
  202. level->flags |= AUDIO_LEVEL_CHANGED;
  203. return TRUE;
  204. }
  205. // there has been no change this update
  206. return FALSE;
  207. }
  208. /******************************************************************/
  209. /* */
  210. /* */
  211. /******************************************************************/
  212. int AudioLevelGetVal( AudioLevel *level )
  213. {
  214. return (level->newLevel>>AUDIO_LEVEL_SCALE);
  215. }