From 2f457ae8913e585e45e12a8eb887c09c410ed401 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Mon, 13 Feb 2017 19:56:30 -0500 Subject: [PATCH] add packet queue to AudioMixerClientData --- assignment-client/src/audio/AudioMixer.cpp | 22 ++++++++++++++----- assignment-client/src/audio/AudioMixer.h | 1 + .../src/audio/AudioMixerClientData.cpp | 8 +++++++ .../src/audio/AudioMixerClientData.h | 8 ++++++- 4 files changed, 32 insertions(+), 7 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index b9cac208b7..e231d63d87 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -323,6 +323,7 @@ void AudioMixer::sendStatsPacket() { addTiming(_prepareTiming, "prepare"); addTiming(_mixTiming, "mix"); addTiming(_eventsTiming, "events"); + addTiming(_packetsTiming, "packets"); #ifdef HIFI_AUDIO_MIXER_DEBUG timingStats["ns_per_mix"] = (_stats.totalMixes > 0) ? (float)(_stats.mixTime / _stats.totalMixes) : 0; @@ -452,18 +453,27 @@ void AudioMixer::start() { ++frame; ++_numStatFrames; - // play nice with qt event-looping + // process queued events (networking, &c.) { auto eventsTimer = _eventsTiming.timer(); // since we're a while loop we need to yield to qt's event processing QCoreApplication::processEvents(); + } - if (_isFinished) { - // alert qt eventing that this is finished - QCoreApplication::sendPostedEvents(this, QEvent::DeferredDelete); - break; - } + // process audio packets + { + auto packetsTimer = _packetsTiming.timer(); + nodeList->eachNode([&](SharedNodePointer& node) { + AudioMixerClientData* data = getOrCreateClientData(node.data()); + data->processPackets(); + }); + } + + if (_isFinished) { + // alert qt eventing that this is finished + QCoreApplication::sendPostedEvents(this, QEvent::DeferredDelete); + break; } } } diff --git a/assignment-client/src/audio/AudioMixer.h b/assignment-client/src/audio/AudioMixer.h index 07359f4aef..9589e71ecb 100644 --- a/assignment-client/src/audio/AudioMixer.h +++ b/assignment-client/src/audio/AudioMixer.h @@ -124,6 +124,7 @@ private: Timer _prepareTiming; Timer _mixTiming; Timer _eventsTiming; + Timer _packetsTiming; static int _numStaticJitterFrames; // -1 denotes dynamic jitter buffering static float _noiseMutingThreshold; diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index 791ccb8b03..8ca3379e56 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -47,6 +47,14 @@ AudioMixerClientData::~AudioMixerClientData() { } } +void AudioMixerClientData::queuePacket(QSharedPointer packet) { + _queuedPackets.push(packet); +} + +void AudioMixerClientData::processPackets() { + // TODO: process the queue + assert(_queuedPackets.empty()); +} AvatarAudioStream* AudioMixerClientData::getAvatarAudioStream() { QReadLocker readLocker { &_streamsLock }; diff --git a/assignment-client/src/audio/AudioMixerClientData.h b/assignment-client/src/audio/AudioMixerClientData.h index c30923f411..ff2afe7769 100644 --- a/assignment-client/src/audio/AudioMixerClientData.h +++ b/assignment-client/src/audio/AudioMixerClientData.h @@ -12,6 +12,8 @@ #ifndef hifi_AudioMixerClientData_h #define hifi_AudioMixerClientData_h +#include + #include #include @@ -34,6 +36,9 @@ public: using SharedStreamPointer = std::shared_ptr; using AudioStreamMap = std::unordered_map; + void queuePacket(QSharedPointer packet); + void processPackets(); + // locks the mutex to make a copy AudioStreamMap getAudioStreams() { QReadLocker readLock { &_streamsLock }; return _audioStreams; } AvatarAudioStream* getAvatarAudioStream(); @@ -105,11 +110,12 @@ public slots: void sendSelectAudioFormat(SharedNodePointer node, const QString& selectedCodecName); private: - using IgnoreZone = AABox; + std::queue> _queuedPackets; QReadWriteLock _streamsLock; AudioStreamMap _audioStreams; // microphone stream from avatar is stored under key of null UUID + using IgnoreZone = AABox; class IgnoreZoneMemo { public: IgnoreZoneMemo(AudioMixerClientData& data) : _data(data) {}