From 37ce6931532f5c40e0851587559f7b36e7f927c3 Mon Sep 17 00:00:00 2001 From: wangyix Date: Wed, 25 Jun 2014 18:01:34 -0700 Subject: [PATCH] added seqnum stats to AudioMixerClientData; added seqnums to Audio.cpp --- .../src/audio/AudioMixerClientData.cpp | 7 +++++++ assignment-client/src/audio/AudioMixerClientData.h | 4 ++++ interface/src/Audio.cpp | 13 +++++++++++-- interface/src/Audio.h | 2 ++ libraries/audio/src/AudioRingBuffer.cpp | 2 +- 5 files changed, 25 insertions(+), 3 deletions(-) diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index 25b2295822..f35034eab3 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -44,6 +44,13 @@ AvatarAudioRingBuffer* AudioMixerClientData::getAvatarAudioRingBuffer() const { } int AudioMixerClientData::parseData(const QByteArray& packet) { + + // parse sequence number for this packet + int numBytesPacketHeader = numBytesForPacketHeader(packet); + const char* sequenceAt = packet.constData() + numBytesPacketHeader; + quint16 sequence = *(reinterpret_cast(sequenceAt)); + _sequenceNumberStats.sequenceNumberReceived(sequence); + PacketType packetType = packetTypeForPacket(packet); if (packetType == PacketTypeMicrophoneAudioWithEcho || packetType == PacketTypeMicrophoneAudioNoEcho diff --git a/assignment-client/src/audio/AudioMixerClientData.h b/assignment-client/src/audio/AudioMixerClientData.h index cbf10f8fdc..508572db43 100644 --- a/assignment-client/src/audio/AudioMixerClientData.h +++ b/assignment-client/src/audio/AudioMixerClientData.h @@ -18,6 +18,7 @@ #include "AvatarAudioRingBuffer.h" #include "AudioStreamStats.h" +#include "SequenceNumbersStats.h" class AudioMixerClientData : public NodeData { public: @@ -37,8 +38,11 @@ public: QString getJitterBufferStatsString() const; + const SequenceNumberStats& getSequenceNumberStats() const { return _sequenceNumberStats; } + private: QList _ringBuffers; + SequenceNumberStats _sequenceNumberStats; }; #endif // hifi_AudioMixerClientData_h diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index f66d11085e..c4f0e27a04 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -103,7 +103,8 @@ Audio::Audio(int16_t initialJitterBufferSamples, QObject* parent) : _scopeInput(0), _scopeOutputLeft(0), _scopeOutputRight(0), - _audioMixerJitterBufferStats() + _audioMixerJitterBufferStats(), + _sequenceNumber(0) { // clear the array of locally injected samples memset(_localProceduralSamples, 0, NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL); @@ -119,6 +120,7 @@ void Audio::init(QGLWidget *parent) { void Audio::reset() { _ringBuffer.reset(); + _sequenceNumber = 0; } QAudioDeviceInfo getNamedAudioDeviceForMode(QAudio::Mode mode, const QString& deviceName) { @@ -422,7 +424,7 @@ void Audio::handleAudioInput() { static char audioDataPacket[MAX_PACKET_SIZE]; static int numBytesPacketHeader = numBytesForPacketHeaderGivenPacketType(PacketTypeMicrophoneAudioNoEcho); - static int leadingBytes = numBytesPacketHeader + sizeof(glm::vec3) + sizeof(glm::quat) + sizeof(quint8); + static int leadingBytes = numBytesPacketHeader + sizeof(quint16) + sizeof(glm::vec3) + sizeof(glm::quat) + sizeof(quint8); static int16_t* networkAudioSamples = (int16_t*) (audioDataPacket + leadingBytes); @@ -654,6 +656,10 @@ void Audio::handleAudioInput() { char* currentPacketPtr = audioDataPacket + populatePacketHeader(audioDataPacket, packetType); + // pack seq number + memcpy(currentPacketPtr, &_sequenceNumber, sizeof(quint16)); + currentPacketPtr += sizeof(quint16); + // set the mono/stereo byte *currentPacketPtr++ = isStereo; @@ -669,6 +675,9 @@ void Audio::handleAudioInput() { Application::getInstance()->getBandwidthMeter()->outputStream(BandwidthMeter::AUDIO) .updateValue(numAudioBytes + leadingBytes); + } else { + // reset seq numbers if there's no connection with an audiomixer + _sequenceNumber = 0; } delete[] inputAudioSamples; } diff --git a/interface/src/Audio.h b/interface/src/Audio.h index a69423fdfd..c6fde709b8 100644 --- a/interface/src/Audio.h +++ b/interface/src/Audio.h @@ -238,6 +238,8 @@ private: QByteArray* _scopeOutputRight; AudioMixerJitterBuffersStats _audioMixerJitterBufferStats; + + quint16 _sequenceNumber; }; diff --git a/libraries/audio/src/AudioRingBuffer.cpp b/libraries/audio/src/AudioRingBuffer.cpp index fd9ba0150b..947c49905c 100644 --- a/libraries/audio/src/AudioRingBuffer.cpp +++ b/libraries/audio/src/AudioRingBuffer.cpp @@ -67,7 +67,7 @@ void AudioRingBuffer::resizeForFrameSize(qint64 numFrameSamples) { } int AudioRingBuffer::parseData(const QByteArray& packet) { - int numBytesBeforeAudioData = numBytesForPacketHeader(packet); + int numBytesBeforeAudioData = numBytesForPacketHeader(packet) + sizeof(quint16); return writeData(packet.data() + numBytesBeforeAudioData, packet.size() - numBytesBeforeAudioData); }