diff options
author | Thorvald Natvig <slicer@users.sourceforge.net> | 2009-05-04 18:40:15 +0400 |
---|---|---|
committer | Thorvald Natvig <slicer@users.sourceforge.net> | 2009-05-04 18:40:15 +0400 |
commit | 534753f65e3851a66cbfea550ac40b8a5570d137 (patch) | |
tree | aea5b74fa3aef72c8d7be3b45f8b3f7a3dbe582d /src | |
parent | c6b204cad190ab71cfd9e1e43b2692dd34310902 (diff) |
Optimize audio framing, and preserve flags
Diffstat (limited to 'src')
-rw-r--r-- | src/PacketDataStream.h | 9 | ||||
-rw-r--r-- | src/mumble/Audio.cpp | 14 | ||||
-rw-r--r-- | src/mumble/AudioConfigDialog.cpp | 2 | ||||
-rw-r--r-- | src/mumble/AudioInput.cpp | 17 | ||||
-rw-r--r-- | src/mumble/AudioOutput.cpp | 47 | ||||
-rw-r--r-- | src/mumble/ServerHandler.cpp | 8 |
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); } } |