From 3d874f6ad2b4e2c9147e58ea5fb4e2f343509725 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Tue, 14 Feb 2017 14:12:22 -0800 Subject: [PATCH] more hacking --- assignment-client/src/avatars/AvatarMixer.cpp | 99 +++++++------------ assignment-client/src/avatars/AvatarMixer.h | 4 + .../src/avatars/AvatarMixerClientData.cpp | 8 ++ .../src/avatars/AvatarMixerClientData.h | 5 +- 4 files changed, 52 insertions(+), 64 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 87952f3264..0fada86499 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -89,75 +89,29 @@ void AvatarMixer::sendIdentityPacket(AvatarMixerClientData* nodeData, const Shar void AvatarMixer::start() { auto nodeList = DependencyManager::get(); - -/**** - // prepare the NodeList - nodeList->addSetOfNodeTypesToNodeInterestSet({ NodeType::Agent, NodeType::EntityScriptServer }); - nodeList->linkedDataCreateCallback = [&](Node* node) { getOrCreateClientData(node); }; - - // parse out any AudioMixer settings - { - DomainHandler& domainHandler = nodeList->getDomainHandler(); - const QJsonObject& settingsObject = domainHandler.getSettingsObject(); - parseSettingsObject(settingsObject); - } - - // mix state - unsigned int frame = 1; - auto frameTimestamp = p_high_resolution_clock::now(); -****/ - while (!_isFinished) { _loopRate.increment(); + // FIXME - we really should sleep for the remainder of what we haven't spent time processing auto sleepAmount = std::chrono::milliseconds(AVATAR_DATA_SEND_INTERVAL_MSECS); std::this_thread::sleep_for(sleepAmount); - /* - auto ticTimer = _ticTiming.timer(); - + // Allow nodes to process any pending/queued packets across our worker threads { - auto timer = _sleepTiming.timer(); - auto frameDuration = timeFrame(frameTimestamp); - throttle(frameDuration, frame); + auto start = usecTimestampNow(); + auto nodeList = DependencyManager::get(); + nodeList->eachNode([](const SharedNodePointer& node) { + auto nodeData = dynamic_cast(node->getLinkedData()); + if (nodeData) { + nodeData->processQueuedAvatarDataPackets(); + } + }); + auto end = usecTimestampNow(); + _processQueuedAvatarDataPacketsElapsedTime += (end - start); } - auto frameTimer = _frameTiming.timer(); - - nodeList->nestedEach([&](NodeList::const_iterator cbegin, NodeList::const_iterator cend) { - // prepare frames; pop off any new audio from their streams - { - auto prepareTimer = _prepareTiming.timer(); - std::for_each(cbegin, cend, [&](const SharedNodePointer& node) { - _stats.sumStreams += prepareFrame(node, frame); - }); - } - - // mix across slave threads - { - auto mixTimer = _mixTiming.timer(); - _slavePool.mix(cbegin, cend, frame, _throttlingRatio); - } - }); - */ - - // gather stats - /* - _slavePool.each([&](AudioMixerSlave& slave) { - _stats.accumulate(slave.stats); - slave.stats.reset(); - }); - */ - - /* - ++frame; - ++_numStatFrames; - */ - // play nice with qt event-looping { - //auto eventsTimer = _eventsTiming.timer(); - // since we're a while loop we need to yield to qt's event processing auto start = usecTimestampNow(); QCoreApplication::processEvents(); @@ -723,8 +677,15 @@ void AvatarMixer::handleRequestsDomainListDataPacket(QSharedPointer message, SharedNodePointer senderNode) { auto start = usecTimestampNow(); + auto nodeList = DependencyManager::get(); - nodeList->updateNodeWithDataFromPacket(message, senderNode); + AvatarMixerClientData* nodeData = dynamic_cast(nodeList->getOrCreateLinkedData(senderNode)); + + if (nodeData) { + QMutexLocker linkedDataLocker(&nodeData->getMutex()); // NOTE: we might be able to safely assume this doesn't need to be locked! + nodeData->queueAvatarDataPacket(message); + } + auto end = usecTimestampNow(); _handleAvatarDataPacketElapsedTime += (end - start); } @@ -780,6 +741,9 @@ void AvatarMixer::handleRadiusIgnoreRequestPacket(QSharedPointer _loopRate; // this is the rate that the main thread tight loop runs + std::unordered_map>> _pendingAvatarDataPackets; + }; #endif // hifi_AvatarMixer_h diff --git a/assignment-client/src/avatars/AvatarMixerClientData.cpp b/assignment-client/src/avatars/AvatarMixerClientData.cpp index a7a506e1d8..ffa525bc35 100644 --- a/assignment-client/src/avatars/AvatarMixerClientData.cpp +++ b/assignment-client/src/avatars/AvatarMixerClientData.cpp @@ -16,6 +16,14 @@ #include "AvatarMixerClientData.h" +void AvatarMixerClientData::processQueuedAvatarDataPackets() { + for (auto message : _queuedAvatarDataPackets) { + parseData(*message); + } + _queuedAvatarDataPackets.clear(); +} + + int AvatarMixerClientData::parseData(ReceivedMessage& message) { // pull the sequence number from the data first message.readPrimitive(&_lastReceivedSequenceNumber); diff --git a/assignment-client/src/avatars/AvatarMixerClientData.h b/assignment-client/src/avatars/AvatarMixerClientData.h index aa011f8baf..611af1701d 100644 --- a/assignment-client/src/avatars/AvatarMixerClientData.h +++ b/assignment-client/src/avatars/AvatarMixerClientData.h @@ -118,9 +118,12 @@ public: return _lastOtherAvatarSentJoints[otherAvatar]; } - + void queueAvatarDataPacket(QSharedPointer message) { _queuedAvatarDataPackets.push_back(message); } + void processQueuedAvatarDataPackets(); private: + std::vector> _queuedAvatarDataPackets; + AvatarSharedPointer _avatar { new AvatarData() }; uint16_t _lastReceivedSequenceNumber { 0 };