AudioMixer.cpp 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. #include "AudioMixer.h"
  2. using namespace bell;
  3. AudioMixer::AudioMixer() {
  4. }
  5. std::unique_ptr<StreamInfo> AudioMixer::process(std::unique_ptr<StreamInfo> info) {
  6. std::scoped_lock lock(this->accessMutex);
  7. if (info->numChannels != from) {
  8. throw std::runtime_error("AudioMixer: Input channel count does not match configuration");
  9. }
  10. info->numChannels = to;
  11. for (auto &singleConf : mixerConfig) {
  12. if (singleConf.source.size() == 1) {
  13. if (singleConf.source[0] == singleConf.destination) {
  14. continue;
  15. }
  16. // Copy channel
  17. for (int i = 0; i < info->numSamples; i++) {
  18. info->data[singleConf.destination][i] = info->data[singleConf.source[0]][i];
  19. }
  20. } else {
  21. // Mix channels
  22. float sample = 0.0f;
  23. for (int i = 0; i < info->numSamples; i++) {
  24. sample = 0.0;
  25. for (auto &source : singleConf.source) {
  26. sample += info->data[source][i];
  27. }
  28. info->data[singleConf.destination][i] = sample / (float) singleConf.source.size();
  29. }
  30. }
  31. }
  32. return info;
  33. }