Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mumble-voip/mumble.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThorvald Natvig <slicer@users.sourceforge.net>2009-11-26 02:00:43 +0300
committerThorvald Natvig <slicer@users.sourceforge.net>2009-11-26 02:01:51 +0300
commitd042b70e4817a298a4416fbfa0318b241d2b050a (patch)
tree417d5498b28ec9eb84f76d6bec5742428a5977ff /src
parentb2b8c10a85137e18967dd6d606d655c583d67b61 (diff)
Add jitter data to usage report
Diffstat (limited to 'src')
-rw-r--r--src/mumble/AudioOutput.cpp9
-rw-r--r--src/mumble/ClientUser.cpp8
-rw-r--r--src/mumble/ClientUser.h14
-rw-r--r--src/mumble/Usage.cpp37
-rw-r--r--src/mumble/Usage.h7
-rw-r--r--src/mumble/UserModel.cpp3
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;