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-05-04 18:40:15 +0400
committerThorvald Natvig <slicer@users.sourceforge.net>2009-05-04 18:40:15 +0400
commit534753f65e3851a66cbfea550ac40b8a5570d137 (patch)
treeaea5b74fa3aef72c8d7be3b45f8b3f7a3dbe582d /src
parentc6b204cad190ab71cfd9e1e43b2692dd34310902 (diff)
Optimize audio framing, and preserve flags
Diffstat (limited to 'src')
-rw-r--r--src/PacketDataStream.h9
-rw-r--r--src/mumble/Audio.cpp14
-rw-r--r--src/mumble/AudioConfigDialog.cpp2
-rw-r--r--src/mumble/AudioInput.cpp17
-rw-r--r--src/mumble/AudioOutput.cpp47
-rw-r--r--src/mumble/ServerHandler.cpp8
6 files changed, 75 insertions, 22 deletions
diff --git a/src/PacketDataStream.h b/src/PacketDataStream.h
index eb1d99652..03c1105b8 100644
--- a/src/PacketDataStream.h
+++ b/src/PacketDataStream.h
@@ -154,6 +154,15 @@ class PacketDataStream {
setup(d, msize);
};
+ PacketDataStream(const QByteArray &qba) {
+ setup(const_cast<unsigned char *>(reinterpret_cast<const unsigned char *>(qba.constData())), qba.size());
+ }
+
+ PacketDataStream(QByteArray &qba) {
+ unsigned char *ptr=reinterpret_cast<unsigned char *>(qba.data());
+ setup(ptr, qba.capacity());
+ }
+
PacketDataStream &operator <<(const quint64 value) {
quint64 i = value;
diff --git a/src/mumble/Audio.cpp b/src/mumble/Audio.cpp
index e93636fbf..61591f7a0 100644
--- a/src/mumble/Audio.cpp
+++ b/src/mumble/Audio.cpp
@@ -100,11 +100,19 @@ void LoopUser::fetchFrames() {
break;
int iSeq;
- const QByteArray &qba = i.value();
- PacketDataStream pds(qba.constData(), qba.size());
+ const QByteArray &data = i.value();
+ PacketDataStream pds(data.constData(), data.size());
+
+ unsigned int msgFlags = pds.next();
+
pds >> iSeq;
- ao->addFrameToBuffer(this, pds.dataBlock(pds.left()), iSeq);
+ QByteArray qba;
+ qba.reserve(pds.left() + 1);
+ qba.append(static_cast<char>(msgFlags));
+ qba.append(pds.dataBlock(pds.left()));
+
+ ao->addFrameToBuffer(this, qba, iSeq);
i = qmPackets.erase(i);
}
diff --git a/src/mumble/AudioConfigDialog.cpp b/src/mumble/AudioConfigDialog.cpp
index d0e50aec0..f0cdd0f23 100644
--- a/src/mumble/AudioConfigDialog.cpp
+++ b/src/mumble/AudioConfigDialog.cpp
@@ -174,7 +174,7 @@ bool AudioInputDialog::expert(bool b) {
}
void AudioInputDialog::on_qsFrames_valueChanged(int v) {
- qlFrames->setText(tr("%1 ms").arg(v*20));
+ qlFrames->setText(tr("%1 ms").arg(v*10));
updateBitrate();
}
diff --git a/src/mumble/AudioInput.cpp b/src/mumble/AudioInput.cpp
index fbd9ecb50..9ab16e74d 100644
--- a/src/mumble/AudioInput.cpp
+++ b/src/mumble/AudioInput.cpp
@@ -672,7 +672,7 @@ void AudioInput::encodeAudioFrame() {
memset(psMic, 0, sizeof(short) * iFrameSize);
}
unsigned char buffer[512];
- int len = celt_encode(ceEncoder, psSource, NULL, buffer, 75);
+ int len = celt_encode(ceEncoder, psSource, NULL, buffer, 50);
iBitrate = len * 100 * 8;
flushCheck(QByteArray(reinterpret_cast<const char *>(buffer), len));
@@ -694,7 +694,18 @@ void AudioInput::flushCheck(const QByteArray &qba) {
PacketDataStream pds(data + 1, 1023);
pds << iFrameCounter;
- pds << qlFrames;
+
+ for(int i=0;i<qlFrames.count(); ++i) {
+ const QByteArray &qba = qlFrames.at(i);
+ unsigned char head = qba.size();
+ if ((i < qlFrames.count() - 1) || !bPreviousVoice)
+ head |= 0x80;
+ pds.append(head);
+ pds.append(qba.constData(), qba.size());
+ }
+
+ if (! bPreviousVoice)
+ pds.append(0x00);
if (g.s.bTransmitPosition && g.p && ! g.bCenterPosition && g.p->fetch()) {
pds << g.p->fPosition[0];
@@ -703,7 +714,7 @@ void AudioInput::flushCheck(const QByteArray &qba) {
}
if (g.s.lmLoopMode == Settings::Local)
- LoopUser::lpLoopy.addFrame(QByteArray(data+1, pds.size()));
+ LoopUser::lpLoopy.addFrame(QByteArray(data, pds.size() + 1));
else if (g.sh)
g.sh->sendMessage(data, pds.size() + 1);
diff --git a/src/mumble/AudioOutput.cpp b/src/mumble/AudioOutput.cpp
index 725bd1677..ef63809db 100644
--- a/src/mumble/AudioOutput.cpp
+++ b/src/mumble/AudioOutput.cpp
@@ -303,21 +303,30 @@ AudioOutputSpeech::~AudioOutputSpeech() {
void AudioOutputSpeech::addFrameToBuffer(const QByteArray &qbaPacket, unsigned int iSeq) {
QMutexLocker lock(&qmJitter);
- if (qbaPacket.size() < 1)
+ if (qbaPacket.size() < 2)
return;
- // FIXME: This is wrong, flags aren't at byte 0, that's just the frames. Need the complete packet here.
+ PacketDataStream pds(qbaPacket);
- unsigned int flags = qbaPacket.at(0);
- unsigned int frames = flags & 0xf;
+ pds.next();
- JitterBufferPacket jbp;
- jbp.data = const_cast<char *>(qbaPacket.constData());
- jbp.len = qbaPacket.size();
- jbp.span = iFrameSize * frames;
- jbp.timestamp = iFrameSize * iSeq;
+ int frames = 0;
+ unsigned int header = 0;
+ do {
+ header = pds.next();
+ frames++;
+ pds.skip(header & 0x7f);
+ } while ((header & 0x80) && pds.isValid());
- jitter_buffer_put(jbJitter, &jbp);
+ if (pds.isValid()) {
+ JitterBufferPacket jbp;
+ jbp.data = const_cast<char *>(qbaPacket.constData());
+ jbp.len = qbaPacket.size();
+ jbp.span = iFrameSize * frames;
+ jbp.timestamp = iFrameSize * iSeq;
+
+ jitter_buffer_put(jbJitter, &jbp);
+ }
}
bool AudioOutputSpeech::needSamples(unsigned int snum) {
@@ -353,7 +362,15 @@ bool AudioOutputSpeech::needSamples(unsigned int snum) {
if (jitter_buffer_get(jbJitter, &jbp, iFrameSize, &startofs) == JITTER_BUFFER_OK) {
PacketDataStream pds(jbp.data, jbp.len);
- pds >> qlFrames;
+
+ ucFlags = pds.next();
+
+ unsigned int header = 0;
+ do {
+ header = pds.next();
+ qlFrames << pds.dataBlock(header & 0x7f);
+ } while ((header & 0x80) && pds.isValid());
+
if (pds.left()) {
pds >> fPos[0];
pds >> fPos[1];
@@ -380,8 +397,12 @@ bool AudioOutputSpeech::needSamples(unsigned int snum) {
if (! qlFrames.isEmpty()) {
QByteArray qba = qlFrames.takeFirst();
- celt_decode_float(cdDecoder, reinterpret_cast<unsigned char *>(qba.data()), qba.size(), pOut);
- bLastAlive = true;
+ if (! qba.isEmpty()) {
+ celt_decode_float(cdDecoder, reinterpret_cast<unsigned char *>(qba.data()), qba.size(), pOut);
+ bLastAlive = true;
+ } else {
+ bLastAlive = false;
+ }
} else {
celt_decode_float(cdDecoder, NULL, 0, pOut);
}
diff --git a/src/mumble/ServerHandler.cpp b/src/mumble/ServerHandler.cpp
index f1986974f..aa497e46f 100644
--- a/src/mumble/ServerHandler.cpp
+++ b/src/mumble/ServerHandler.cpp
@@ -150,7 +150,6 @@ void ServerHandler::udpReady() {
unsigned int msgType = (buffer[0] >> 5) & 0x7;
unsigned int msgFlags = buffer[0] & 0x1f;
-
if (msgType == MessageHandler::UDPPing) {
quint64 t;
pds >> t;
@@ -169,7 +168,12 @@ void ServerHandler::handleVoicePacket(unsigned int msgFlags, PacketDataStream &p
if (ao && p && ! p->bLocalMute) {
unsigned int iSeq;
pds >> iSeq;
- ao->addFrameToBuffer(p, pds.dataBlock(pds.left()), iSeq);
+ QByteArray qba;
+ qba.reserve(pds.left() + 1);
+ qba.append(static_cast<char>(msgFlags));
+ qba.append(pds.dataBlock(pds.left()));
+
+ ao->addFrameToBuffer(p, qba, iSeq);
}
}