DRY audio-mixer all-stream mixes

This commit is contained in:
Zach Pomerantz 2017-01-25 20:53:36 +00:00
parent 1153c1900f
commit 46afa7e764
2 changed files with 25 additions and 18 deletions

View file

@ -122,10 +122,20 @@ bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) {
bool isThrottling = _throttlingRatio > 0.0f; bool isThrottling = _throttlingRatio > 0.0f;
std::vector<std::pair<float, SharedNodePointer>> throttledNodes; std::vector<std::pair<float, SharedNodePointer>> throttledNodes;
std::for_each(_begin, _end, [&](const SharedNodePointer& node) { typedef void (AudioMixerSlave::*MixFunctor)(
AudioMixerClientData&, const QUuid&, const AvatarAudioStream&, const PositionalAudioStream&);
auto allStreams = [&](const SharedNodePointer& node, MixFunctor mixFunctor) {
AudioMixerClientData* nodeData = static_cast<AudioMixerClientData*>(node->getLinkedData()); AudioMixerClientData* nodeData = static_cast<AudioMixerClientData*>(node->getLinkedData());
for (auto& streamPair : nodeData->getAudioStreams()) {
auto nodeStream = streamPair.second;
(this->*mixFunctor)(*listenerData, node->getUUID(), *listenerAudioStream, *nodeStream);
}
};
std::for_each(_begin, _end, [&](const SharedNodePointer& node) {
if (*node == *listener) { if (*node == *listener) {
AudioMixerClientData* nodeData = static_cast<AudioMixerClientData*>(node->getLinkedData());
// only mix the echo, if requested // only mix the echo, if requested
for (auto& streamPair : nodeData->getAudioStreams()) { for (auto& streamPair : nodeData->getAudioStreams()) {
auto nodeStream = streamPair.second; auto nodeStream = streamPair.second;
@ -135,12 +145,10 @@ bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) {
} }
} else if (!shouldIgnoreNode(listener, node)) { } else if (!shouldIgnoreNode(listener, node)) {
if (!isThrottling) { if (!isThrottling) {
// mix all the streams allStreams(node, &AudioMixerSlave::mixStream);
for (auto& streamPair : nodeData->getAudioStreams()) {
auto nodeStream = streamPair.second;
mixStream(*listenerData, node->getUUID(), *listenerAudioStream, *nodeStream);
}
} else { } else {
AudioMixerClientData* nodeData = static_cast<AudioMixerClientData*>(node->getLinkedData());
// compute the node's max relative volume // compute the node's max relative volume
float nodeVolume; float nodeVolume;
for (auto& streamPair : nodeData->getAudioStreams()) { for (auto& streamPair : nodeData->getAudioStreams()) {
@ -169,11 +177,7 @@ bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) {
std::pop_heap(throttledNodes.begin(), throttledNodes.end()); std::pop_heap(throttledNodes.begin(), throttledNodes.end());
auto& node = throttledNodes.back().second; auto& node = throttledNodes.back().second;
AudioMixerClientData* nodeData = static_cast<AudioMixerClientData*>(node->getLinkedData()); allStreams(node, &AudioMixerSlave::mixStream);
for (auto& streamPair : nodeData->getAudioStreams()) {
auto nodeStream = streamPair.second;
mixStream(*listenerData, node->getUUID(), *listenerAudioStream, *nodeStream);
}
throttledNodes.pop_back(); throttledNodes.pop_back();
} }
@ -181,11 +185,7 @@ bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) {
// throttle the remaining nodes' streams // throttle the remaining nodes' streams
for (const std::pair<float, SharedNodePointer>& nodePair : throttledNodes) { for (const std::pair<float, SharedNodePointer>& nodePair : throttledNodes) {
auto& node = nodePair.second; auto& node = nodePair.second;
AudioMixerClientData* nodeData = static_cast<AudioMixerClientData*>(node->getLinkedData()); allStreams(node, &AudioMixerSlave::throttleStream);
for (auto& streamPair : nodeData->getAudioStreams()) {
auto nodeStream = streamPair.second;
throttleStream(*listenerData, node->getUUID(), *listenerAudioStream, *nodeStream);
}
} }
} }
@ -205,10 +205,15 @@ bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) {
void AudioMixerSlave::throttleStream(AudioMixerClientData& listenerNodeData, const QUuid& sourceNodeID, void AudioMixerSlave::throttleStream(AudioMixerClientData& listenerNodeData, const QUuid& sourceNodeID,
const AvatarAudioStream& listeningNodeStream, const PositionalAudioStream& streamToAdd) { const AvatarAudioStream& listeningNodeStream, const PositionalAudioStream& streamToAdd) {
mixStream(listenerNodeData, sourceNodeID, listeningNodeStream, streamToAdd, true); addStream(listenerNodeData, sourceNodeID, listeningNodeStream, streamToAdd, true);
} }
void AudioMixerSlave::mixStream(AudioMixerClientData& listenerNodeData, const QUuid& sourceNodeID, void AudioMixerSlave::mixStream(AudioMixerClientData& listenerNodeData, const QUuid& sourceNodeID,
const AvatarAudioStream& listeningNodeStream, const PositionalAudioStream& streamToAdd) {
addStream(listenerNodeData, sourceNodeID, listeningNodeStream, streamToAdd, false);
}
void AudioMixerSlave::addStream(AudioMixerClientData& listenerNodeData, const QUuid& sourceNodeID,
const AvatarAudioStream& listeningNodeStream, const PositionalAudioStream& streamToAdd, const AvatarAudioStream& listeningNodeStream, const PositionalAudioStream& streamToAdd,
bool throttle) { bool throttle) {
++stats.totalMixes; ++stats.totalMixes;

View file

@ -44,8 +44,10 @@ private:
void throttleStream(AudioMixerClientData& listenerData, const QUuid& streamerID, void throttleStream(AudioMixerClientData& listenerData, const QUuid& streamerID,
const AvatarAudioStream& listenerStream, const PositionalAudioStream& streamer); const AvatarAudioStream& listenerStream, const PositionalAudioStream& streamer);
void mixStream(AudioMixerClientData& listenerData, const QUuid& streamerID, void mixStream(AudioMixerClientData& listenerData, const QUuid& streamerID,
const AvatarAudioStream& listenerStream, const PositionalAudioStream& streamer);
void addStream(AudioMixerClientData& listenerData, const QUuid& streamerID,
const AvatarAudioStream& listenerStream, const PositionalAudioStream& streamer, const AvatarAudioStream& listenerStream, const PositionalAudioStream& streamer,
bool throttle = false); bool throttle);
// mixing buffers // mixing buffers
float _mixSamples[AudioConstants::NETWORK_FRAME_SAMPLES_STEREO]; float _mixSamples[AudioConstants::NETWORK_FRAME_SAMPLES_STEREO];