reverb.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include "reverb.h"
  2. #include <stdlib.h>
  3. void Reverb_init(Reverb* preverbobj)
  4. {
  5. preverbobj->drytime = 0.43f;
  6. preverbobj->wettime = 0.57f;
  7. preverbobj->dampness = 0.45f;
  8. preverbobj->roomwidth = 0.56f;
  9. preverbobj->roomsize = 0.56f;
  10. preverbobj->m_rate = 0;
  11. preverbobj->m_ch = 0;
  12. preverbobj->m_buffers = NULL;
  13. }
  14. void Reverb_release(Reverb* preverbobj)
  15. {
  16. if (preverbobj->m_buffers)
  17. {
  18. free(preverbobj->m_buffers);
  19. }
  20. }
  21. void Reverb_Process(Reverb* preverbobj,
  22. short *audio_data,
  23. const int length,
  24. const int samplingFreqHz,
  25. const int channelnum)
  26. {
  27. int i=0;
  28. unsigned j=0,k=0;
  29. if ( samplingFreqHz != preverbobj->m_rate || channelnum != preverbobj->m_ch)
  30. {
  31. preverbobj->m_rate = samplingFreqHz;
  32. preverbobj->m_ch = channelnum;
  33. if (preverbobj->m_buffers)
  34. {
  35. free(preverbobj->m_buffers);
  36. }
  37. preverbobj->m_buffers = (revmodel*)malloc(preverbobj->m_ch*sizeof(revmodel));
  38. for ( i = 0; i < preverbobj->m_ch; i++ )
  39. {
  40. revmodel * e = preverbobj->m_buffers+i;
  41. revmodel_init(e);
  42. revmodel_setwet(e,preverbobj->wettime);
  43. revmodel_setdry(e,preverbobj->drytime);
  44. revmodel_setdamp(e,preverbobj->dampness);
  45. revmodel_setroomsize(e,preverbobj->roomsize);
  46. revmodel_setwidth(e,preverbobj->roomwidth);
  47. }
  48. }
  49. for (i = 0; i < preverbobj->m_ch; i++ )
  50. {
  51. revmodel * e = preverbobj->m_buffers+i;
  52. short * data = audio_data + i;
  53. for (j = 0, k = length/preverbobj->m_ch; j < k; j++ )
  54. {
  55. *data = (short)revmodel_processsample(e,*data );
  56. data += preverbobj->m_ch;
  57. }
  58. }
  59. }
  60. int Reverb_SetProperty(Reverb* preverbobj,float drytime, float wettime, float dampness, float roomwidth, float roomsize)
  61. {
  62. int i=0;
  63. if (drytime>1||drytime<0
  64. ||wettime>1||wettime<0
  65. ||dampness>1||dampness<0
  66. ||roomwidth>1||roomwidth<0
  67. ||roomsize>1||roomwidth<0)
  68. {
  69. return -1;
  70. }
  71. preverbobj->drytime = drytime;
  72. preverbobj->wettime = wettime;
  73. preverbobj->dampness = dampness;
  74. preverbobj->roomwidth = roomwidth;
  75. preverbobj->roomsize = roomsize;
  76. for ( i = 0; i < preverbobj->m_ch; i++ )
  77. {
  78. revmodel * e = preverbobj->m_buffers+i;
  79. revmodel_setwet(e,preverbobj->wettime);
  80. revmodel_setdry(e,preverbobj->drytime);
  81. revmodel_setdamp(e,preverbobj->dampness);
  82. revmodel_setroomsize(e,preverbobj->roomsize);
  83. revmodel_setwidth(e,preverbobj->roomwidth);
  84. }
  85. return 0;
  86. }
  87. int Reverb_GetProperty(Reverb* preverbobj,float* drytime, float* wettime, float* dampness, float* roomwidth, float* roomsize)
  88. {
  89. *drytime = preverbobj->drytime;
  90. *wettime = preverbobj->wettime;
  91. *dampness = preverbobj->dampness;
  92. *roomwidth = preverbobj->roomwidth;
  93. *roomsize = preverbobj->roomsize;
  94. return 0;
  95. }