mixer_inc.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include "config.h"
  2. #include "alMain.h"
  3. #include "alSource.h"
  4. #include "hrtf.h"
  5. #include "mixer_defs.h"
  6. #include "align.h"
  7. #include "alu.h"
  8. static inline void ApplyCoeffs(ALsizei Offset, ALfloat (*restrict Values)[2],
  9. const ALsizei irSize,
  10. const ALfloat (*restrict Coeffs)[2],
  11. ALfloat left, ALfloat right);
  12. void MixHrtf(ALfloat *restrict LeftOut, ALfloat *restrict RightOut,
  13. const ALfloat *data, ALsizei Offset, ALsizei OutPos,
  14. const ALsizei IrSize, MixHrtfParams *hrtfparams, HrtfState *hrtfstate,
  15. ALsizei BufferSize)
  16. {
  17. const ALfloat (*Coeffs)[2] = ASSUME_ALIGNED(hrtfparams->Coeffs, 16);
  18. const ALsizei Delay[2] = { hrtfparams->Delay[0], hrtfparams->Delay[1] };
  19. ALfloat gainstep = hrtfparams->GainStep;
  20. ALfloat gain = hrtfparams->Gain;
  21. ALfloat left, right;
  22. ALsizei i;
  23. LeftOut += OutPos;
  24. RightOut += OutPos;
  25. for(i = 0;i < BufferSize;i++)
  26. {
  27. hrtfstate->History[Offset&HRTF_HISTORY_MASK] = *(data++);
  28. left = hrtfstate->History[(Offset-Delay[0])&HRTF_HISTORY_MASK]*gain;
  29. right = hrtfstate->History[(Offset-Delay[1])&HRTF_HISTORY_MASK]*gain;
  30. hrtfstate->Values[(Offset+IrSize-1)&HRIR_MASK][0] = 0.0f;
  31. hrtfstate->Values[(Offset+IrSize-1)&HRIR_MASK][1] = 0.0f;
  32. ApplyCoeffs(Offset, hrtfstate->Values, IrSize, Coeffs, left, right);
  33. *(LeftOut++) += hrtfstate->Values[Offset&HRIR_MASK][0];
  34. *(RightOut++) += hrtfstate->Values[Offset&HRIR_MASK][1];
  35. gain += gainstep;
  36. Offset++;
  37. }
  38. hrtfparams->Gain = gain;
  39. }
  40. void MixHrtfBlend(ALfloat *restrict LeftOut, ALfloat *restrict RightOut,
  41. const ALfloat *data, ALsizei Offset, ALsizei OutPos,
  42. const ALsizei IrSize, const HrtfParams *oldparams,
  43. MixHrtfParams *newparams, HrtfState *hrtfstate,
  44. ALsizei BufferSize)
  45. {
  46. const ALfloat (*OldCoeffs)[2] = ASSUME_ALIGNED(oldparams->Coeffs, 16);
  47. const ALsizei OldDelay[2] = { oldparams->Delay[0], oldparams->Delay[1] };
  48. ALfloat oldGain = oldparams->Gain;
  49. ALfloat oldGainStep = -oldGain / (ALfloat)BufferSize;
  50. const ALfloat (*NewCoeffs)[2] = ASSUME_ALIGNED(newparams->Coeffs, 16);
  51. const ALsizei NewDelay[2] = { newparams->Delay[0], newparams->Delay[1] };
  52. ALfloat newGain = newparams->Gain;
  53. ALfloat newGainStep = newparams->GainStep;
  54. ALfloat left, right;
  55. ALsizei i;
  56. LeftOut += OutPos;
  57. RightOut += OutPos;
  58. for(i = 0;i < BufferSize;i++)
  59. {
  60. hrtfstate->Values[(Offset+IrSize-1)&HRIR_MASK][0] = 0.0f;
  61. hrtfstate->Values[(Offset+IrSize-1)&HRIR_MASK][1] = 0.0f;
  62. hrtfstate->History[Offset&HRTF_HISTORY_MASK] = *(data++);
  63. left = hrtfstate->History[(Offset-OldDelay[0])&HRTF_HISTORY_MASK]*oldGain;
  64. right = hrtfstate->History[(Offset-OldDelay[1])&HRTF_HISTORY_MASK]*oldGain;
  65. ApplyCoeffs(Offset, hrtfstate->Values, IrSize, OldCoeffs, left, right);
  66. left = hrtfstate->History[(Offset-NewDelay[0])&HRTF_HISTORY_MASK]*newGain;
  67. right = hrtfstate->History[(Offset-NewDelay[1])&HRTF_HISTORY_MASK]*newGain;
  68. ApplyCoeffs(Offset, hrtfstate->Values, IrSize, NewCoeffs, left, right);
  69. *(LeftOut++) += hrtfstate->Values[Offset&HRIR_MASK][0];
  70. *(RightOut++) += hrtfstate->Values[Offset&HRIR_MASK][1];
  71. oldGain += oldGainStep;
  72. newGain += newGainStep;
  73. Offset++;
  74. }
  75. newparams->Gain = newGain;
  76. }
  77. void MixDirectHrtf(ALfloat *restrict LeftOut, ALfloat *restrict RightOut,
  78. const ALfloat *data, ALsizei Offset, const ALsizei IrSize,
  79. const ALfloat (*restrict Coeffs)[2], ALfloat (*restrict Values)[2],
  80. ALsizei BufferSize)
  81. {
  82. ALfloat insample;
  83. ALsizei i;
  84. for(i = 0;i < BufferSize;i++)
  85. {
  86. Values[(Offset+IrSize)&HRIR_MASK][0] = 0.0f;
  87. Values[(Offset+IrSize)&HRIR_MASK][1] = 0.0f;
  88. Offset++;
  89. insample = *(data++);
  90. ApplyCoeffs(Offset, Values, IrSize, Coeffs, insample, insample);
  91. *(LeftOut++) += Values[Offset&HRIR_MASK][0];
  92. *(RightOut++) += Values[Offset&HRIR_MASK][1];
  93. }
  94. }