| 1234567891011121314151617181920212223242526272829303132333435363738394041424344 | 
							- #include "AudioMixer.h"
 
- #include <mutex>  // for scoped_lock
 
- using 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;
 
- }
 
 
  |