| 1234567891011121314151617181920212223242526272829303132333435363738394041424344 | #include "AudioMixer.h"#include <mutex>  // for scoped_lockusing namespace bell;AudioMixer::AudioMixer() {}std::unique_ptr<StreamInfo> AudioMixer::process(    std::unique_ptr<StreamInfo> info) {  std::scoped_lock lock(this->accessMutex);  if (info->numChannels != from) {    throw std::runtime_error(        "AudioMixer: Input channel count does not match configuration");  }  info->numChannels = to;  for (auto& singleConf : mixerConfig) {    if (singleConf.source.size() == 1) {      if (singleConf.source[0] == singleConf.destination) {        continue;      }      // Copy channel      for (int i = 0; i < info->numSamples; i++) {        info->data[singleConf.destination][i] =            info->data[singleConf.source[0]][i];      }    } else {      // Mix channels      float sample = 0.0f;      for (int i = 0; i < info->numSamples; i++) {        sample = 0.0;        for (auto& source : singleConf.source) {          sample += info->data[source][i];        }        info->data[singleConf.destination][i] =            sample / (float)singleConf.source.size();      }    }  }  return info;}
 |