mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-09 00:47:39 +02:00
DRY audio-mixer all-stream mixes
This commit is contained in:
parent
1153c1900f
commit
46afa7e764
2 changed files with 25 additions and 18 deletions
|
@ -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;
|
||||||
|
|
|
@ -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];
|
||||||
|
|
Loading…
Reference in a new issue