Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

79 Zeilen
1.8KB

  1. #include "Audio.h"
  2. #include "arm_math.h"
  3. #include "utility/dspinst.h"
  4. void applyGain(int16_t *data, int32_t mult)
  5. {
  6. uint32_t *p = (uint32_t *)data;
  7. const uint32_t *end = (uint32_t *)(data + AUDIO_BLOCK_SAMPLES);
  8. do {
  9. uint32_t tmp32 = *p; // read 2 samples from *data
  10. int32_t val1 = signed_multiply_32x16b(mult, tmp32);
  11. int32_t val2 = signed_multiply_32x16t(mult, tmp32);
  12. val1 = signed_saturate_rshift(val1, 16, 0);
  13. val2 = signed_saturate_rshift(val2, 16, 0);
  14. *p++ = pack_16x16(val2, val1);
  15. } while (p < end);
  16. }
  17. // page 133
  18. void applyGainThenAdd(int16_t *data, const int16_t *in, int32_t mult)
  19. {
  20. uint32_t *dst = (uint32_t *)data;
  21. const uint32_t *src = (uint32_t *)in;
  22. const uint32_t *end = (uint32_t *)(data + AUDIO_BLOCK_SAMPLES);
  23. if (mult == 65536) {
  24. do {
  25. uint32_t tmp32 = *dst;
  26. *dst++ = signed_add_16_and_16(tmp32, *src++);
  27. tmp32 = *dst;
  28. *dst++ = signed_add_16_and_16(tmp32, *src++);
  29. } while (dst < end);
  30. } else {
  31. do {
  32. uint32_t tmp32 = *src++; // read 2 samples from *data
  33. int32_t val1 = signed_multiply_32x16b(mult, tmp32);
  34. int32_t val2 = signed_multiply_32x16t(mult, tmp32);
  35. val1 = signed_saturate_rshift(val1, 16, 0);
  36. val2 = signed_saturate_rshift(val2, 16, 0);
  37. tmp32 = pack_16x16(val2, val1);
  38. uint32_t tmp32b = *dst;
  39. *dst++ = signed_add_16_and_16(tmp32, tmp32b);
  40. } while (dst < end);
  41. }
  42. }
  43. void AudioMixer4::update(void)
  44. {
  45. audio_block_t *in, *out=NULL;
  46. unsigned int channel;
  47. for (channel=0; channel < 4; channel++) {
  48. if (!out) {
  49. out = receiveWritable(channel);
  50. if (out) {
  51. int32_t mult = multiplier[channel];
  52. if (mult != 65536) applyGain(out->data, mult);
  53. }
  54. } else {
  55. in = receiveReadOnly(channel);
  56. if (in) {
  57. applyGainThenAdd(out->data, in->data, multiplier[channel]);
  58. release(in);
  59. }
  60. }
  61. }
  62. if (out) {
  63. transmit(out);
  64. release(out);
  65. }
  66. }