upse-spu-internal.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. /***************************************************************************
  2. upse-spu-internal.h - description
  3. -------------------
  4. begin : Wed May 15 2002
  5. copyright : (C) 2002 by Pete Bernert
  6. email : BlackDove@addcom.de
  7. ***************************************************************************/
  8. /***************************************************************************
  9. * *
  10. * This program is free software; you can redistribute it and/or modify *
  11. * it under the terms of the GNU General Public License as published by *
  12. * the Free Software Foundation; either version 2 of the License, or *
  13. * (at your option) any later version. See also the license.txt file for *
  14. * additional informations. *
  15. * *
  16. ***************************************************************************/
  17. #include "upse-types.h"
  18. #include "upse-ps1-memory-manager.h"
  19. //*************************************************************************//
  20. // History of changes:
  21. //
  22. // 2002/05/15 - Pete
  23. // - generic cleanup for the Peops release
  24. //
  25. //*************************************************************************//
  26. #define max(a,b) (((a) > (b)) ? (a) : (b))
  27. #define min(a,b) (((a) < (b)) ? (a) : (b))
  28. ////////////////////////////////////////////////////////////////////////
  29. // spu defines
  30. ////////////////////////////////////////////////////////////////////////
  31. // num of channels
  32. #define MAXCHAN 24
  33. ///////////////////////////////////////////////////////////
  34. // struct defines
  35. ///////////////////////////////////////////////////////////
  36. // ADSR INFOS PER CHANNEL
  37. typedef struct
  38. {
  39. int AttackModeExp;
  40. s32 AttackTime;
  41. s32 DecayTime;
  42. s32 SustainLevel;
  43. int SustainModeExp;
  44. s32 SustainModeDec;
  45. s32 SustainTime;
  46. int ReleaseModeExp;
  47. u32 ReleaseVal;
  48. s32 ReleaseTime;
  49. s32 ReleaseStartTime;
  50. s32 ReleaseVol;
  51. s32 lTime;
  52. s32 lVolume;
  53. } ADSRInfo;
  54. typedef struct
  55. {
  56. int State;
  57. int AttackModeExp;
  58. int AttackRate;
  59. int DecayRate;
  60. int SustainLevel;
  61. int SustainModeExp;
  62. int SustainIncrease;
  63. int SustainRate;
  64. int ReleaseModeExp;
  65. int ReleaseRate;
  66. int EnvelopeVol;
  67. s32 lVolume;
  68. s32 lDummy1;
  69. s32 lDummy2;
  70. } ADSRInfoEx;
  71. ///////////////////////////////////////////////////////////
  72. // Tmp Flags
  73. // used for debug channel muting
  74. #define FLAG_MUTE 1
  75. ///////////////////////////////////////////////////////////
  76. // MAIN CHANNEL STRUCT
  77. typedef struct
  78. {
  79. int bNew; // start flag
  80. int iSBPos; // mixing stuff
  81. int spos;
  82. int sinc;
  83. int SB[32 + 1];
  84. int sval;
  85. u8 *pStart; // start ptr into sound mem
  86. u8 *pCurr; // current pos in sound mem
  87. u8 *pLoop; // loop ptr in sound mem
  88. int bOn; // is channel active (sample playing?)
  89. int bStop; // is channel stopped (sample _can_ still be playing, ADSR Release phase)
  90. int iActFreq; // current psx pitch
  91. int iUsedFreq; // current pc pitch
  92. int iLeftVolume; // left volume
  93. int iLeftVolRaw; // left psx volume value
  94. int bIgnoreLoop; // ignore loop bit, if an external loop address is used
  95. int iRightVolume; // right volume
  96. int iRightVolRaw; // right psx volume value
  97. int iRawPitch; // raw pitch (0...3fff)
  98. int iIrqDone; // debug irq done flag
  99. int s_1; // last decoding infos
  100. int s_2;
  101. int bRVBActive; // reverb active flag
  102. int iRVBOffset; // reverb offset
  103. int iRVBRepeat; // reverb repeat
  104. int bNoise; // noise active flag
  105. int bFMod; // freq mod (0=off, 1=sound channel, 2=freq channel)
  106. int iOldNoise; // old noise val for this channel
  107. ADSRInfo ADSR; // active ADSR settings
  108. ADSRInfoEx ADSRX; // next ADSR settings (will be moved to active on sample start)
  109. } SPUCHAN;
  110. ///////////////////////////////////////////////////////////
  111. typedef struct
  112. {
  113. int StartAddr; // reverb area start addr in samples
  114. int CurrAddr; // reverb area curr addr in samples
  115. int Enabled;
  116. int VolLeft;
  117. int VolRight;
  118. int iLastRVBLeft;
  119. int iLastRVBRight;
  120. int iRVBLeft;
  121. int iRVBRight;
  122. int FB_SRC_A; // (offset)
  123. int FB_SRC_B; // (offset)
  124. int IIR_ALPHA; // (coef.)
  125. int ACC_COEF_A; // (coef.)
  126. int ACC_COEF_B; // (coef.)
  127. int ACC_COEF_C; // (coef.)
  128. int ACC_COEF_D; // (coef.)
  129. int IIR_COEF; // (coef.)
  130. int FB_ALPHA; // (coef.)
  131. int FB_X; // (coef.)
  132. int IIR_DEST_A0; // (offset)
  133. int IIR_DEST_A1; // (offset)
  134. int ACC_SRC_A0; // (offset)
  135. int ACC_SRC_A1; // (offset)
  136. int ACC_SRC_B0; // (offset)
  137. int ACC_SRC_B1; // (offset)
  138. int IIR_SRC_A0; // (offset)
  139. int IIR_SRC_A1; // (offset)
  140. int IIR_DEST_B0; // (offset)
  141. int IIR_DEST_B1; // (offset)
  142. int ACC_SRC_C0; // (offset)
  143. int ACC_SRC_C1; // (offset)
  144. int ACC_SRC_D0; // (offset)
  145. int ACC_SRC_D1; // (offset)
  146. int IIR_SRC_B1; // (offset)
  147. int IIR_SRC_B0; // (offset)
  148. int MIX_DEST_A0; // (offset)
  149. int MIX_DEST_A1; // (offset)
  150. int MIX_DEST_B0; // (offset)
  151. int MIX_DEST_B1; // (offset)
  152. int IN_COEF_L; // (coef.)
  153. int IN_COEF_R; // (coef.)
  154. } REVERBInfo;
  155. extern u16 regArea[0x200];
  156. extern u16 spuMem[256 * 1024];
  157. extern u8 *spuMemC;
  158. extern u8 *pSpuIrq;
  159. extern u8 *pSpuBuffer;
  160. extern u32 dwNoiseVal; // global noise generator
  161. extern u16 spuCtrl; // some vars to store psx reg infos
  162. extern u16 spuStat;
  163. extern u16 spuIrq;
  164. extern u32 spuAddr; // address into spu mem
  165. extern int bSPUIsOpen;
  166. extern SPUCHAN s_chan[MAXCHAN + 1]; // channel + 1 infos (1 is security for fmod handling)
  167. extern REVERBInfo rvb;