added seqnum stats to AudioMixerClientData; added seqnums to Audio.cpp

This commit is contained in:
wangyix 2014-06-25 18:01:34 -07:00
parent 2ec04fb756
commit 37ce693153
5 changed files with 25 additions and 3 deletions

View file

@ -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<const quint16*>(sequenceAt));
_sequenceNumberStats.sequenceNumberReceived(sequence);
PacketType packetType = packetTypeForPacket(packet);
if (packetType == PacketTypeMicrophoneAudioWithEcho
|| packetType == PacketTypeMicrophoneAudioNoEcho

View file

@ -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<PositionalAudioRingBuffer*> _ringBuffers;
SequenceNumberStats _sequenceNumberStats;
};
#endif // hifi_AudioMixerClientData_h

View file

@ -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;
}

View file

@ -238,6 +238,8 @@ private:
QByteArray* _scopeOutputRight;
AudioMixerJitterBuffersStats _audioMixerJitterBufferStats;
quint16 _sequenceNumber;
};

View file

@ -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);
}