From 446c88824285e045da519a4b8c4424aeb8ce4ccf Mon Sep 17 00:00:00 2001 From: wangyix Date: Tue, 12 Aug 2014 12:22:32 -0700 Subject: [PATCH] AudioMixer print added; untested --- assignment-client/src/audio/AudioMixer.cpp | 11 ++++- assignment-client/src/audio/AudioMixer.h | 2 + .../src/audio/AudioMixerClientData.cpp | 45 ++++++++++++++++++- .../src/audio/AudioMixerClientData.h | 5 +++ .../resources/web/settings/describe.json | 6 +++ 5 files changed, 67 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 5900e1f151..fb1f3333a4 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -71,6 +71,8 @@ bool AudioMixer::_useDynamicJitterBuffers = false; int AudioMixer::_staticDesiredJitterBufferFrames = 0; int AudioMixer::_maxFramesOverDesired = 0; +bool AudioMixer::_printStreamStats = false; + AudioMixer::AudioMixer(const QByteArray& packet) : ThreadedAssignment(packet), _trailingSleepRatio(1.0f), @@ -448,7 +450,11 @@ void AudioMixer::run() { } qDebug() << "Max frames over desired:" << _maxFramesOverDesired; - + const QString PRINT_STREAM_STATS_JSON_KEY = "H-print-stream-stats"; + _printStreamStats = audioGroupObject[PRINT_STREAM_STATS_JSON_KEY].toBool(); + if (_printStreamStats) { + qDebug() << "Stream stats will be printed to stdout"; + } const QString UNATTENUATED_ZONE_KEY = "D-unattenuated-zone"; @@ -581,6 +587,9 @@ void AudioMixer::run() { // send an audio stream stats packet if it's time if (sendAudioStreamStats) { nodeData->sendAudioStreamStatsPackets(node); + + printf("\nStats for agent %s\n:", node->getUUID().toString().toLatin1().data()); + nodeData->printUpstreamDownstreamStats(); } ++_sumListeners; diff --git a/assignment-client/src/audio/AudioMixer.h b/assignment-client/src/audio/AudioMixer.h index 83769a4209..d11539e22e 100644 --- a/assignment-client/src/audio/AudioMixer.h +++ b/assignment-client/src/audio/AudioMixer.h @@ -66,6 +66,8 @@ private: static int _staticDesiredJitterBufferFrames; static int _maxFramesOverDesired; + static bool _printStreamStats; + quint64 _lastSendAudioStreamStatsTime; }; diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index fb805e11d8..ade34e2dae 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -22,7 +22,8 @@ AudioMixerClientData::AudioMixerClientData() : _audioStreams(), - _outgoingMixedAudioSequenceNumber(0) + _outgoingMixedAudioSequenceNumber(0), + _downstreamAudioStreamStats() { } @@ -263,3 +264,45 @@ QString AudioMixerClientData::getAudioStreamStatsString() const { } return result; } + +void AudioMixerClientData::printUpstreamDownstreamStats() const { + // print the upstream (mic stream) stats if the mic stream exists + if (_audioStreams.contains(QUuid())) { + printf(" Upstream:\n"); + printAudioStreamStats(_audioStreams.value(QUuid())->getAudioStreamStats()); + } + // print the downstream stats if they contain valid info + if (_downstreamAudioStreamStats._packetStreamStats._received > 0) { + printf(" Downstream:\n"); + printAudioStreamStats(_downstreamAudioStreamStats); + } +} + +void AudioMixerClientData::printAudioStreamStats(const AudioStreamStats& streamStats) const { + printf(" Packet loss | overall: %5.2f%% (%d lost), last_30s: %5.2f%% (%d lost)", + streamStats._packetStreamStats.getLostRate() * 100.0f, + streamStats._packetStreamStats._lost, + streamStats._packetStreamWindowStats.getLostRate() * 100.0f, + streamStats._packetStreamWindowStats._lost); + + printf(" Ringbuffer frames | desired: %u, avg_available(10s): %u, available: %u", + streamStats._desiredJitterBufferFrames, + streamStats._framesAvailableAverage, + streamStats._framesAvailable); + + printf(" Ringbuffer stats | starves: %u, prev_starve_lasted: %u, frames_dropped: %u, overflows: %u", + streamStats._starveCount, + streamStats._consecutiveNotMixedCount, + streamStats._framesDropped, + streamStats._overflowCount); + + printf(" Inter-packet timegaps (overall) | min: %9s, max: %9s, avg: %9s", + formatUsecTime(streamStats._timeGapMin).toLatin1().data(), + formatUsecTime(streamStats._timeGapMax).toLatin1().data(), + formatUsecTime(streamStats._timeGapAverage).toLatin1().data()); + + printf(" Inter-packet timegaps (last 30s) | min: %9s, max: %9s, avg: %9s", + formatUsecTime(streamStats._timeGapWindowMin).toLatin1().data(), + formatUsecTime(streamStats._timeGapWindowMax).toLatin1().data(), + formatUsecTime(streamStats._timeGapWindowAverage).toLatin1().data()); +} diff --git a/assignment-client/src/audio/AudioMixerClientData.h b/assignment-client/src/audio/AudioMixerClientData.h index 80f3f9e3ca..0ce4ecc36a 100644 --- a/assignment-client/src/audio/AudioMixerClientData.h +++ b/assignment-client/src/audio/AudioMixerClientData.h @@ -38,6 +38,11 @@ public: void incrementOutgoingMixedAudioSequenceNumber() { _outgoingMixedAudioSequenceNumber++; } quint16 getOutgoingSequenceNumber() const { return _outgoingMixedAudioSequenceNumber; } + void printUpstreamDownstreamStats() const; + +private: + void printAudioStreamStats(const AudioStreamStats& streamStats) const; + private: QHash _audioStreams; // mic stream stored under key of null UUID diff --git a/domain-server/resources/web/settings/describe.json b/domain-server/resources/web/settings/describe.json index f4920a7b50..788a3ad551 100644 --- a/domain-server/resources/web/settings/describe.json +++ b/domain-server/resources/web/settings/describe.json @@ -21,6 +21,12 @@ "placeholder": "10", "default": "10" }, + "H-print-stream-stats": { + "type": "checkbox", + "label": "Print Stream Stats:", + "help": "If enabled, audio upstream and downstream stats of each agent will be printed each second to stdout", + "default": false + }, "D-unattenuated-zone": { "label": "Unattenuated Zone", "help": "Boxes for source and listener (corner x, corner y, corner z, size x, size y, size z, corner x, corner y, corner z, size x, size y, size z)",