pull out removal and adding of streams to sep functions

This commit is contained in:
Stephen Birarda 2018-09-25 10:41:21 -07:00 committed by Clement
parent 7e4cfd3c78
commit b18d8e2254
2 changed files with 78 additions and 60 deletions

View file

@ -132,27 +132,14 @@ bool containsNodeID(const V& vector, QUuid nodeID) {
});
}
bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) {
AvatarAudioStream* listenerAudioStream = static_cast<AudioMixerClientData*>(listener->getLinkedData())->getAvatarAudioStream();
AudioMixerClientData* listenerData = static_cast<AudioMixerClientData*>(listener->getLinkedData());
void AudioMixerSlave::addStreams(Node& listener, AudioMixerClientData& listenerData) {
auto& ignoredNodeIDs = listener.getIgnoredNodeIDs();
auto& ignoringNodeIDs = listenerData.getIgnoringNodeIDs();
// zero out the mix for this listener
memset(_mixSamples, 0, sizeof(_mixSamples));
bool isThrottling = _throttlingRatio > 0.0f;
auto nodeList = DependencyManager::get<NodeList>();
#ifdef HIFI_AUDIO_MIXER_DEBUG
auto mixStart = p_high_resolution_clock::now();
#endif
auto& mixableStreams = listenerData->getMixableStreams();
auto& ignoredNodeIDs = listener->getIgnoredNodeIDs();
auto& ignoringNodeIDs = listenerData->getIgnoringNodeIDs();
auto& mixableStreams = listenerData.getMixableStreams();
// add data for newly created streams to our vector
if (!listenerData->getHasReceivedFirstMix()) {
if (!listenerData.getHasReceivedFirstMix()) {
// when this listener is new, we need to fill its added streams object with all available streams
std::for_each(_begin, _end, [&](const SharedNodePointer& node) {
AudioMixerClientData* nodeData = static_cast<AudioMixerClientData*>(node->getLinkedData());
@ -169,7 +156,7 @@ bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) {
});
// flag this listener as having received their first mix so we know we don't need to enumerate all nodes again
listenerData->setHasReceivedFirstMix(true);
listenerData.setHasReceivedFirstMix(true);
} else {
for (const auto& newStream : _sharedData.addedStreams) {
mixableStreams.emplace_back(newStream.nodeIDStreamID, newStream.positionalStream);
@ -179,18 +166,15 @@ bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) {
mixableStreams.back().ignoringListener = containsNodeID(ignoringNodeIDs, newStream.nodeIDStreamID.nodeID);
}
}
}
// grab the unprocessed ignores and unignores from and for this listener
const auto& nodesIgnoredByListener = listenerData->getNewIgnoredNodeIDs();
const auto& nodesUnignoredByListener = listenerData->getNewUnignoredNodeIDs();
const auto& nodesIgnoringListener = listenerData->getNewIgnoringNodeIDs();
const auto& nodesUnignoringListener = listenerData->getNewUnignoringNodeIDs();
void AudioMixerSlave::removeStreams(AudioMixerClientData::MixableStreamsVector& mixableStreams) {
if (_sharedData.removedNodes.size() > 0) {
// enumerate the available streams
auto it = mixableStreams.begin();
auto end = mixableStreams.end();
while (it != end) {
while (it != end) {
// check if this node (and therefore all of the node's streams) has been removed
auto& nodeIDStreamID = it->nodeStreamID;
auto matchedRemovedNode = std::find(_sharedData.removedNodes.cbegin(), _sharedData.removedNodes.cend(),
@ -212,6 +196,40 @@ bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) {
// process the it element (which is now the element that was the last item before the swap)
continue;
}
}
// erase any removed streams that were swapped to the end
mixableStreams.erase(end, mixableStreams.end());
}
}
bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) {
AvatarAudioStream* listenerAudioStream = static_cast<AudioMixerClientData*>(listener->getLinkedData())->getAvatarAudioStream();
AudioMixerClientData* listenerData = static_cast<AudioMixerClientData*>(listener->getLinkedData());
// zero out the mix for this listener
memset(_mixSamples, 0, sizeof(_mixSamples));
bool isThrottling = _throttlingRatio > 0.0f;
auto nodeList = DependencyManager::get<NodeList>();
auto& mixableStreams = listenerData->getMixableStreams();
// grab the unprocessed ignores and unignores from and for this listener
const auto& nodesIgnoredByListener = listenerData->getNewIgnoredNodeIDs();
const auto& nodesUnignoredByListener = listenerData->getNewUnignoredNodeIDs();
const auto& nodesIgnoringListener = listenerData->getNewIgnoringNodeIDs();
const auto& nodesUnignoringListener = listenerData->getNewUnignoringNodeIDs();
removeStreams(mixableStreams);
addStreams(*listener, *listenerData);
// enumerate the available streams
auto it = mixableStreams.begin();
while (it != mixableStreams.end()) {
auto& nodeIDStreamID = it->nodeStreamID;
if (it->nodeStreamID.nodeLocalID == listener->getLocalID()) {
// streams from this node should be skipped unless loopback is specifically requested
@ -297,9 +315,6 @@ bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) {
++it;
}
// erase any removed streams that were swapped to the end
mixableStreams.erase(end, mixableStreams.end());
if (isThrottling) {
// since we're throttling, we need to partition the mixable into throttled and unthrottled streams
auto numToRetain = std::distance(_begin, _end) * (1 - _throttlingRatio);

View file

@ -58,6 +58,9 @@ private:
void addStream(AudioMixerClientData::MixableStream& mixableStream, AvatarAudioStream& listeningNodeStream,
float masterListenerGain, bool throttle);
void removeStreams(AudioMixerClientData::MixableStreamsVector& mixableStreams);
void addStreams(Node& listener, AudioMixerClientData& listenerData);
// mixing buffers
float _mixSamples[AudioConstants::NETWORK_FRAME_SAMPLES_STEREO];
int16_t _bufferSamples[AudioConstants::NETWORK_FRAME_SAMPLES_STEREO];