From 7ec4f6a67cc6e7ef45516cb1decaa946542f2bd4 Mon Sep 17 00:00:00 2001 From: Benjamin Jemlich Date: Fri, 8 Jun 2012 23:42:17 +0200 Subject: [PATCH] Murmur: Add codec warnings and ignore non-Opus packets if Opus is enabled Also includes the CELT warning for "broken" clients by Nicos Gollan. --- src/murmur/Messages.cpp | 8 ++++++++ src/murmur/Server.cpp | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/src/murmur/Messages.cpp b/src/murmur/Messages.cpp index 3e298b9e2..c0c108a9f 100644 --- a/src/murmur/Messages.cpp +++ b/src/murmur/Messages.cpp @@ -200,11 +200,13 @@ void Server::msgAuthenticate(ServerUser *uSource, MumbleProto::Authenticate &msg mpcrypt.set_client_nonce(std::string(reinterpret_cast(uSource->csCrypt.decrypt_iv), AES_BLOCK_SIZE)); sendMessage(uSource, mpcrypt); + bool fake_celt_support = false; if (msg.celt_versions_size() > 0) { for (int i=0;i < msg.celt_versions_size(); ++i) uSource->qlCodecs.append(msg.celt_versions(i)); } else { uSource->qlCodecs.append(static_cast(0x8000000b)); + fake_celt_support = true; } uSource->bOpus = msg.opus(); recheckCodecVersions(); @@ -216,6 +218,12 @@ void Server::msgAuthenticate(ServerUser *uSource, MumbleProto::Authenticate &msg mpcv.set_opus(bOpus); sendMessage(uSource, mpcv); + if (!bOpus && uSource->bOpus && fake_celt_support) { + sendTextMessage(NULL, uSource, false, QLatin1String("WARNING: Your client doesn't support the CELT codec, you won't be able to talk to or hear most clients. Please make sure your client was built with CELT support.")); + } else if (bOpus && !uSource->bOpus) { + sendTextMessage(NULL, uSource, false, QLatin1String("WARNING: Your client doesn't support the Opus codec, you won't be able to talk or hear anyone. Please upgrade to a client with Opus support.")); + } + // Transmit channel tree QQueue q; QSet chans; diff --git a/src/murmur/Server.cpp b/src/murmur/Server.cpp index d1bebec38..34a029f99 100644 --- a/src/murmur/Server.cpp +++ b/src/murmur/Server.cpp @@ -772,6 +772,8 @@ void Server::run() { case MessageHandler::UDPVoiceSpeex: case MessageHandler::UDPVoiceCELTAlpha: case MessageHandler::UDPVoiceCELTBeta: + if (bOpus) + break; case MessageHandler::UDPVoiceOpus: { u->bUdp = true; processMsg(u, buffer, len); @@ -1274,6 +1276,8 @@ void Server::message(unsigned int uiType, const QByteArray &qbaMsg, ServerUser * case MessageHandler::UDPVoiceCELTAlpha: case MessageHandler::UDPVoiceCELTBeta: case MessageHandler::UDPVoiceSpeex: + if (bOpus) + break; case MessageHandler::UDPVoiceOpus: processMsg(u, buffer, l); break;