- static int iCnt=0; // this func will be called with 44.1 khz\r
-\r
- if(!rvb.StartAddr) // reverb is off\r
- {\r
- rvb.iLastRVBLeft=rvb.iLastRVBRight=rvb.iRVBLeft=rvb.iRVBRight=0;\r
- return 0;\r
- }\r
-\r
- iCnt++; \r
-\r
- if(iCnt&1) // we work on every second left value: downsample to 22 khz\r
- {\r
- if(spuCtrl&0x80) // -> reverb on? oki\r
- {\r
- int ACC0,ACC1,FB_A0,FB_A1,FB_B0,FB_B1;\r
-\r
- const int INPUT_SAMPLE_L=*(sRVBStart+(ns<<1)); \r
- const int INPUT_SAMPLE_R=*(sRVBStart+(ns<<1)+1); \r
-\r
- const int IIR_INPUT_A0 = (g_buffer(rvb.IIR_SRC_A0) * rvb.IIR_COEF)/32768L + (INPUT_SAMPLE_L * rvb.IN_COEF_L)/32768L;\r
- const int IIR_INPUT_A1 = (g_buffer(rvb.IIR_SRC_A1) * rvb.IIR_COEF)/32768L + (INPUT_SAMPLE_R * rvb.IN_COEF_R)/32768L;\r
- const int IIR_INPUT_B0 = (g_buffer(rvb.IIR_SRC_B0) * rvb.IIR_COEF)/32768L + (INPUT_SAMPLE_L * rvb.IN_COEF_L)/32768L;\r
- const int IIR_INPUT_B1 = (g_buffer(rvb.IIR_SRC_B1) * rvb.IIR_COEF)/32768L + (INPUT_SAMPLE_R * rvb.IN_COEF_R)/32768L;\r
-\r
- const int IIR_A0 = (IIR_INPUT_A0 * rvb.IIR_ALPHA)/32768L + (g_buffer(rvb.IIR_DEST_A0) * (32768L - rvb.IIR_ALPHA))/32768L;\r
- const int IIR_A1 = (IIR_INPUT_A1 * rvb.IIR_ALPHA)/32768L + (g_buffer(rvb.IIR_DEST_A1) * (32768L - rvb.IIR_ALPHA))/32768L;\r
- const int IIR_B0 = (IIR_INPUT_B0 * rvb.IIR_ALPHA)/32768L + (g_buffer(rvb.IIR_DEST_B0) * (32768L - rvb.IIR_ALPHA))/32768L;\r
- const int IIR_B1 = (IIR_INPUT_B1 * rvb.IIR_ALPHA)/32768L + (g_buffer(rvb.IIR_DEST_B1) * (32768L - rvb.IIR_ALPHA))/32768L;\r
-\r
- s_buffer1(rvb.IIR_DEST_A0, IIR_A0);\r
- s_buffer1(rvb.IIR_DEST_A1, IIR_A1);\r
- s_buffer1(rvb.IIR_DEST_B0, IIR_B0);\r
- s_buffer1(rvb.IIR_DEST_B1, IIR_B1);\r
- \r
- ACC0 = (g_buffer(rvb.ACC_SRC_A0) * rvb.ACC_COEF_A)/32768L +\r
- (g_buffer(rvb.ACC_SRC_B0) * rvb.ACC_COEF_B)/32768L +\r
- (g_buffer(rvb.ACC_SRC_C0) * rvb.ACC_COEF_C)/32768L +\r
- (g_buffer(rvb.ACC_SRC_D0) * rvb.ACC_COEF_D)/32768L;\r
- ACC1 = (g_buffer(rvb.ACC_SRC_A1) * rvb.ACC_COEF_A)/32768L +\r
- (g_buffer(rvb.ACC_SRC_B1) * rvb.ACC_COEF_B)/32768L +\r
- (g_buffer(rvb.ACC_SRC_C1) * rvb.ACC_COEF_C)/32768L +\r
- (g_buffer(rvb.ACC_SRC_D1) * rvb.ACC_COEF_D)/32768L;\r
-\r
- FB_A0 = g_buffer(rvb.MIX_DEST_A0 - rvb.FB_SRC_A);\r
- FB_A1 = g_buffer(rvb.MIX_DEST_A1 - rvb.FB_SRC_A);\r
- FB_B0 = g_buffer(rvb.MIX_DEST_B0 - rvb.FB_SRC_B);\r
- FB_B1 = g_buffer(rvb.MIX_DEST_B1 - rvb.FB_SRC_B);\r
-\r
- s_buffer(rvb.MIX_DEST_A0, ACC0 - (FB_A0 * rvb.FB_ALPHA)/32768L);\r
- s_buffer(rvb.MIX_DEST_A1, ACC1 - (FB_A1 * rvb.FB_ALPHA)/32768L);\r
- \r
- s_buffer(rvb.MIX_DEST_B0, (rvb.FB_ALPHA * ACC0)/32768L - (FB_A0 * (int)(rvb.FB_ALPHA^0xFFFF8000))/32768L - (FB_B0 * rvb.FB_X)/32768L);\r
- s_buffer(rvb.MIX_DEST_B1, (rvb.FB_ALPHA * ACC1)/32768L - (FB_A1 * (int)(rvb.FB_ALPHA^0xFFFF8000))/32768L - (FB_B1 * rvb.FB_X)/32768L);\r
- \r
- rvb.iLastRVBLeft = rvb.iRVBLeft;\r
- rvb.iLastRVBRight = rvb.iRVBRight;\r
-\r
- rvb.iRVBLeft = (g_buffer(rvb.MIX_DEST_A0)+g_buffer(rvb.MIX_DEST_B0))/3;\r
- rvb.iRVBRight = (g_buffer(rvb.MIX_DEST_A1)+g_buffer(rvb.MIX_DEST_B1))/3;\r
-\r
- rvb.iRVBLeft = (rvb.iRVBLeft * rvb.VolLeft) / 0x4000;\r
- rvb.iRVBRight = (rvb.iRVBRight * rvb.VolRight) / 0x4000;\r
-\r
- rvb.CurrAddr++;\r
- if(rvb.CurrAddr>0x3ffff) rvb.CurrAddr=rvb.StartAddr;\r
-\r
- return rvb.iLastRVBLeft+(rvb.iRVBLeft-rvb.iLastRVBLeft)/2;\r
- }\r
- else // -> reverb off\r
- {\r
- rvb.iLastRVBLeft=rvb.iLastRVBRight=rvb.iRVBLeft=rvb.iRVBRight=0;\r
- }\r
-\r
- rvb.CurrAddr++;\r
- if(rvb.CurrAddr>0x3ffff) rvb.CurrAddr=rvb.StartAddr;\r
- }\r
-\r
- return rvb.iLastRVBLeft;\r
+ int IIR_ALPHA = rvb.IIR_ALPHA;\r
+ int ACC0, ACC1, FB_A0, FB_A1, FB_B0, FB_B1;\r
+ int mix_dest_a0, mix_dest_a1, mix_dest_b0, mix_dest_b1;\r
+\r
+ int input_L = sRVBStart[ns] * rvb.IN_COEF_L;\r
+ int input_R = sRVBStart[ns+1] * rvb.IN_COEF_R;\r
+\r
+ int IIR_INPUT_A0 = ((g_buffer(IIR_SRC_A0) * rvb.IIR_COEF) + input_L) >> 15;\r
+ int IIR_INPUT_A1 = ((g_buffer(IIR_SRC_A1) * rvb.IIR_COEF) + input_R) >> 15;\r
+ int IIR_INPUT_B0 = ((g_buffer(IIR_SRC_B0) * rvb.IIR_COEF) + input_L) >> 15;\r
+ int IIR_INPUT_B1 = ((g_buffer(IIR_SRC_B1) * rvb.IIR_COEF) + input_R) >> 15;\r
+\r
+ int iir_dest_a0 = g_buffer(IIR_DEST_A0);\r
+ int iir_dest_a1 = g_buffer(IIR_DEST_A1);\r
+ int iir_dest_b0 = g_buffer(IIR_DEST_B0);\r
+ int iir_dest_b1 = g_buffer(IIR_DEST_B1);\r
+\r
+ int IIR_A0 = iir_dest_a0 + ((IIR_INPUT_A0 - iir_dest_a0) * IIR_ALPHA >> 15);\r
+ int IIR_A1 = iir_dest_a1 + ((IIR_INPUT_A1 - iir_dest_a1) * IIR_ALPHA >> 15);\r
+ int IIR_B0 = iir_dest_b0 + ((IIR_INPUT_B0 - iir_dest_b0) * IIR_ALPHA >> 15);\r
+ int IIR_B1 = iir_dest_b1 + ((IIR_INPUT_B1 - iir_dest_b1) * IIR_ALPHA >> 15);\r
+\r
+ s_buffer1(IIR_DEST_A0, IIR_A0);\r
+ s_buffer1(IIR_DEST_A1, IIR_A1);\r
+ s_buffer1(IIR_DEST_B0, IIR_B0);\r
+ s_buffer1(IIR_DEST_B1, IIR_B1);\r
+\r
+ ACC0 = (g_buffer(ACC_SRC_A0) * rvb.ACC_COEF_A +\r
+ g_buffer(ACC_SRC_B0) * rvb.ACC_COEF_B +\r
+ g_buffer(ACC_SRC_C0) * rvb.ACC_COEF_C +\r
+ g_buffer(ACC_SRC_D0) * rvb.ACC_COEF_D) >> 15;\r
+ ACC1 = (g_buffer(ACC_SRC_A1) * rvb.ACC_COEF_A +\r
+ g_buffer(ACC_SRC_B1) * rvb.ACC_COEF_B +\r
+ g_buffer(ACC_SRC_C1) * rvb.ACC_COEF_C +\r
+ g_buffer(ACC_SRC_D1) * rvb.ACC_COEF_D) >> 15;\r
+\r
+ FB_A0 = g_buffer(FB_SRC_A0);\r
+ FB_A1 = g_buffer(FB_SRC_A1);\r
+ FB_B0 = g_buffer(FB_SRC_B0);\r
+ FB_B1 = g_buffer(FB_SRC_B1);\r
+\r
+ mix_dest_a0 = ACC0 - ((FB_A0 * rvb.FB_ALPHA) >> 15);\r
+ mix_dest_a1 = ACC1 - ((FB_A1 * rvb.FB_ALPHA) >> 15);\r
+\r
+ mix_dest_b0 = FB_A0 + (((ACC0 - FB_A0) * rvb.FB_ALPHA - FB_B0 * rvb.FB_X) >> 15);\r
+ mix_dest_b1 = FB_A1 + (((ACC1 - FB_A1) * rvb.FB_ALPHA - FB_B1 * rvb.FB_X) >> 15);\r
+\r
+ s_buffer(MIX_DEST_A0, mix_dest_a0);\r
+ s_buffer(MIX_DEST_A1, mix_dest_a1);\r
+ s_buffer(MIX_DEST_B0, mix_dest_b0);\r
+ s_buffer(MIX_DEST_B1, mix_dest_b1);\r
+\r
+ l = (mix_dest_a0 + mix_dest_b0) / 2;\r
+ r = (mix_dest_a1 + mix_dest_b1) / 2;\r
+\r
+ l = (l * rvb.VolLeft) >> 15; // 15?\r
+ r = (r * rvb.VolRight) >> 15;\r
+\r
+ SSumLR[ns++] += (l + l_old) / 2;\r
+ SSumLR[ns++] += (r + r_old) / 2;\r
+ SSumLR[ns++] += l;\r
+ SSumLR[ns++] += r;\r
+\r
+ l_old = l;\r
+ r_old = r;\r
+\r
+ curr_addr++;\r
+ if (curr_addr >= 0x40000) curr_addr = rvb.StartAddr;\r