diff options
author | Thorvald Natvig <slicer@users.sourceforge.net> | 2009-11-26 02:00:43 +0300 |
---|---|---|
committer | Thorvald Natvig <slicer@users.sourceforge.net> | 2009-11-26 02:01:51 +0300 |
commit | d042b70e4817a298a4416fbfa0318b241d2b050a (patch) | |
tree | 417d5498b28ec9eb84f76d6bec5742428a5977ff /src | |
parent | b2b8c10a85137e18967dd6d606d655c583d67b61 (diff) |
Add jitter data to usage report
Diffstat (limited to 'src')
-rw-r--r-- | src/mumble/AudioOutput.cpp | 9 | ||||
-rw-r--r-- | src/mumble/ClientUser.cpp | 8 | ||||
-rw-r--r-- | src/mumble/ClientUser.h | 14 | ||||
-rw-r--r-- | src/mumble/Usage.cpp | 37 | ||||
-rw-r--r-- | src/mumble/Usage.h | 7 | ||||
-rw-r--r-- | src/mumble/UserModel.cpp | 3 |
6 files changed, 78 insertions, 0 deletions
diff --git a/src/mumble/AudioOutput.cpp b/src/mumble/AudioOutput.cpp index 7700da809..dd68d97c0 100644 --- a/src/mumble/AudioOutput.cpp +++ b/src/mumble/AudioOutput.cpp @@ -464,6 +464,15 @@ void AudioOutputSpeech::addFrameToBuffer(const QByteArray &qbaPacket, unsigned i jbp.len = qbaPacket.size(); jbp.span = iFrameSize * frames; jbp.timestamp = iFrameSize * iSeq; + + if (g.s.bUsage && (umtType != MessageHandler::UDPVoiceSpeex) && p && ! p->qsHash.isEmpty() && (p->qlTiming.count() < 3000)) { + QMutexLocker qml(& p->qmTiming); + ClientUser::JitterRecord jr; + jr.iSequence = iSeq; + jr.iFrames = frames; + jr.uiElapsed = p->tTiming.restart(); + p->qlTiming.append(jr); + } jitter_buffer_put(jbJitter, &jbp); } diff --git a/src/mumble/ClientUser.cpp b/src/mumble/ClientUser.cpp index f0571de4b..d98cb3f97 100644 --- a/src/mumble/ClientUser.cpp +++ b/src/mumble/ClientUser.cpp @@ -168,3 +168,11 @@ void Channel::addClientUser(ClientUser *p) { addUser(p); p->setParent(this); } + + +QDataStream &operator<<(QDataStream &qds, const ClientUser::JitterRecord &jr) { + qds << jr.iSequence; + qds << jr.iFrames; + qds << jr.uiElapsed; + return qds; +} diff --git a/src/mumble/ClientUser.h b/src/mumble/ClientUser.h index 1ac3e738e..9fbca320c 100644 --- a/src/mumble/ClientUser.h +++ b/src/mumble/ClientUser.h @@ -32,6 +32,7 @@ #define _CLIENTUSER_H #include "User.h" +#include "Timer.h" class ClientUser : public QObject, public User { private: @@ -39,11 +40,22 @@ class ClientUser : public QObject, public User { Q_DISABLE_COPY(ClientUser) public: enum TalkState { TalkingOff, Talking, TalkingWhisperChannel, TalkingWhisper }; + + struct JitterRecord { + int iSequence; + int iFrames; + quint64 uiElapsed; + }; + TalkState tsState; bool bLocalMute; float fPowerMin, fPowerMax; float fAverageAvailable; + + QMutex qmTiming; + Timer tTiming; + QList<JitterRecord> qlTiming; QString qsFriendName; int iTextureWidth; @@ -69,4 +81,6 @@ class ClientUser : public QObject, public User { void muteDeafChanged(); }; +QDataStream &operator<<(QDataStream &, const ClientUser::JitterRecord &); + #endif diff --git a/src/mumble/Usage.cpp b/src/mumble/Usage.cpp index 9313b2f90..516043f6d 100644 --- a/src/mumble/Usage.cpp +++ b/src/mumble/Usage.cpp @@ -35,10 +35,26 @@ #include "Global.h" #include "OSInfo.h" #include "LCD.h" +#include "ClientUser.h" Usage::Usage(QObject *p) : QObject(p) { + qbReport.open(QBuffer::ReadWrite); + qdsReport.setDevice(&qbReport); + qdsReport.setVersion(QDataStream::Qt_4_5); + qdsReport << static_cast<unsigned int>(1); + // Wait 10 minutes (so we know they're actually using this), then... QTimer::singleShot(60 * 10 * 1000, this, SLOT(registerUsage())); + QTimer::singleShot(60 * 10 * 1000, this, SLOT(reportJitter())); +} + +void Usage::addJitter(ClientUser *cu) { + QMutexLocker qml(& cu->qmTiming); + if (! cu->qlTiming.isEmpty()) { + qdsReport << cu->qsHash; + + qdsReport << cu->qlTiming; + } } void Usage::registerUsage() { @@ -81,3 +97,24 @@ void Usage::registerUsage() { connect(rep, SIGNAL(finished()), rep, SLOT(deleteLater())); } + +void Usage::reportJitter() { + QTimer::singleShot(60 * 10 * 1000, this, SLOT(reportJitter())); + + if (qbReport.size() == 0) + return; + + QNetworkRequest req(QUrl(QLatin1String("http://mumble.info/jitter.cgi"))); + req.setHeader(QNetworkRequest::ContentTypeHeader, QLatin1String("application/octet-stream")); + + QNetworkReply *rep = g.nam->post(req, qCompress(qbReport.buffer(), 9)); + connect(rep, SIGNAL(finished()), rep, SLOT(deleteLater())); + + qbReport.close(); + qbReport.setData(QByteArray()); + + qbReport.open(QBuffer::ReadWrite); + qdsReport.setDevice(&qbReport); + qdsReport.setVersion(QDataStream::Qt_4_5); + qdsReport << static_cast<unsigned int>(1); +} diff --git a/src/mumble/Usage.h b/src/mumble/Usage.h index a6ff1b56d..03428c907 100644 --- a/src/mumble/Usage.h +++ b/src/mumble/Usage.h @@ -33,12 +33,19 @@ #include "mumble_pch.hpp" +class ClientUser; + class Usage : public QObject { Q_OBJECT + protected: + QBuffer qbReport; + QDataStream qdsReport; public: Usage(QObject *p = NULL); + void addJitter(ClientUser *cu); public slots: void registerUsage(); + void reportJitter(); }; #endif diff --git a/src/mumble/UserModel.cpp b/src/mumble/UserModel.cpp index 30ca94833..559f0c88b 100644 --- a/src/mumble/UserModel.cpp +++ b/src/mumble/UserModel.cpp @@ -40,6 +40,7 @@ #include "LCD.h" #include "Log.h" #include "Database.h" +#include "Usage.h" QHash <Channel *, ModelItem *> ModelItem::c_qhChannels; QHash <ClientUser *, ModelItem *> ModelItem::c_qhUsers; @@ -829,6 +830,8 @@ void UserModel::removeUser(ClientUser *p) { if (g.uiSession && (c == ClientUser::get(g.uiSession)->cChannel)) updateOverlay(); + + g.mw->uUsage.addJitter(p); delete p; delete item; |