Sisyphus repositório
Última atualização: 1 outubro 2023 | SRPMs: 18631 | Visitas: 37635989
en ru br
ALT Linux repositórios
S:1.4.287-alt2
D:1.1.3-alt0.1

Group :: Rede/Chat
RPM: mumble

 Main   Changelog   Spec   Patches   Sources   Download   Gear   Bugs e FR  Repocop 

Patch: upstream-0002-CHANGE-client-Drop-support-for-all-legacy-codecs.patch
Download


From ae52dd292259c4323d7a55ffb5c17beda3b0f898 Mon Sep 17 00:00:00 2001
From: Robert Adam <dev@robert-adam.de>
Date: Sat, 10 Sep 2022 10:03:01 +0200
Subject: [PATCH] CHANGE(client): Drop support for all legacy codecs
Opus has been the go-to codec for years now and there is absolutely no
reason why one would want to use any of the legacy codecs (Speex or
CELT) its stead.
Thus, this commit completely removes the support for these codecs from
the Mumble client.
Incidentally, having different codecs available somehow even caused some
audio artifacts, which should now be resolved as well.
Fixes #4538
Backported-by: Arseny Maslennikov <arseny@altlinux.org>
---
 3rdparty/celt-0.7.0-build/CMakeLists.txt      |  80 ----
 3rdparty/celt-0.7.0-build/celt-0.7.0.rc       |  42 --
 3rdparty/celt-0.7.0-build/config.h            | 175 --------
 3rdparty/celt-0.7.0-build/win32/config.h      | 168 --------
 3rdparty/speex-build/AGC.cpp                  | 153 -------
 3rdparty/speex-build/CMakeLists.txt           |  97 -----
 3rdparty/speex-build/ResampMark.cpp           | 383 ------------------
 3rdparty/speex-build/SpeexMark.cpp            | 179 --------
 3rdparty/speex-build/speex_config_types.h     |  11 -
 3rdparty/speexdsp-build/CMakeLists.txt        |  59 +++
 .../{speex-build => speexdsp-build}/config.h  |   0
 .../mumble_speex_init.c                       |   0
 .../speex.def => speexdsp-build/speexdsp.def} |  64 +--
 .../speexdsp_config_types.h                   |   0
 .../win32/config.h                            |   0
 docs/dev/build-instructions/cmake_options.md  |   5 -
 installer/ClientInstaller.cs                  |   6 +-
 src/mumble/Audio.cpp                          |  41 +-
 src/mumble/AudioInput.cpp                     | 193 ++-------
 src/mumble/AudioInput.h                       |  17 +-
 src/mumble/AudioOutputSpeech.cpp              | 238 ++++-------
 src/mumble/AudioOutputSpeech.h                |   9 -
 src/mumble/CELTCodec.cpp                      | 159 --------
 src/mumble/CELTCodec.h                        |  87 ----
 src/mumble/CMakeLists.txt                     |  47 +--
 src/mumble/Global.cpp                         |   7 -
 src/mumble/Global.h                           |   4 -
 src/mumble/MainWindow.cpp                     |  12 +-
 src/mumble/Messages.cpp                       |  55 +--
 src/mumble/ServerHandler.cpp                  |  12 +-
 src/mumble/ServerInformation.cpp              |  12 +-
 src/mumble/Settings.cpp                       |   3 -
 src/mumble/Settings.h                         |   3 -
 src/mumble/UserInformation.cpp                |  13 -
 src/mumble/UserInformation.ui                 |  99 ++---
 35 files changed, 241 insertions(+), 2192 deletions(-)
 delete mode 100644 3rdparty/celt-0.7.0-build/CMakeLists.txt
 delete mode 100644 3rdparty/celt-0.7.0-build/celt-0.7.0.rc
 delete mode 100644 3rdparty/celt-0.7.0-build/config.h
 delete mode 100644 3rdparty/celt-0.7.0-build/win32/config.h
 delete mode 100644 3rdparty/speex-build/AGC.cpp
 delete mode 100644 3rdparty/speex-build/CMakeLists.txt
 delete mode 100644 3rdparty/speex-build/ResampMark.cpp
 delete mode 100644 3rdparty/speex-build/SpeexMark.cpp
 delete mode 100644 3rdparty/speex-build/speex_config_types.h
 create mode 100644 3rdparty/speexdsp-build/CMakeLists.txt
 rename 3rdparty/{speex-build => speexdsp-build}/config.h (100%)
 rename 3rdparty/{speex-build => speexdsp-build}/mumble_speex_init.c (100%)
 rename 3rdparty/{speex-build/speex.def => speexdsp-build/speexdsp.def} (55%)
 rename 3rdparty/{speex-build => speexdsp-build}/speexdsp_config_types.h (100%)
 rename 3rdparty/{speex-build => speexdsp-build}/win32/config.h (100%)
 delete mode 100644 src/mumble/CELTCodec.cpp
 delete mode 100644 src/mumble/CELTCodec.h
diff --git a/3rdparty/celt-0.7.0-build/CMakeLists.txt b/3rdparty/celt-0.7.0-build/CMakeLists.txt
deleted file mode 100644
index 9f46276d5..000000000
--- a/3rdparty/celt-0.7.0-build/CMakeLists.txt
+++ /dev/null
@@ -1,80 +0,0 @@
-set(CELT_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../celt-0.7.0-src")
-set(LIBCELT_SRC_DIR "${CELT_SRC_DIR}/libcelt")
-
-if(NOT EXISTS "${CELT_SRC_DIR}/COPYING")
-	message(FATAL_ERROR
-		"${CELT_SRC_DIR} was not found.\n"
-		"Please checkout the submodule:\n"
-		"git submodule update --init --recursive"
-	)
-endif()
-
-add_library(celt SHARED)
-
-# Celt doesn't work in unity builds
-set_target_properties(celt PROPERTIES UNITY_BUILD FALSE)
-
-set_target_properties(celt PROPERTIES VERSION "0.7.0")
-
-target_compile_definitions(celt PRIVATE "HAVE_CONFIG_H")
-
-target_include_directories(celt PUBLIC SYSTEM "${CELT_SRC_DIR}/libcelt")
-
-if(MSVC)
-	# We include "win32" only for MSVC because MinGW uses the "config.h" for Unix-like systems.
-	target_include_directories(celt PRIVATE SYSTEM BEFORE "${CMAKE_CURRENT_SOURCE_DIR}/win32")
-else()
-	target_include_directories(celt PRIVATE SYSTEM ${CMAKE_CURRENT_SOURCE_DIR})
-endif()
-
-if(WIN32)
-	set_target_properties(celt
-		PROPERTIES
-			OUTPUT_NAME "celt0.0.7.0"
-			RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}
-	)
-	if(MINGW)
-		# Remove "lib" prefix.
-		set_target_properties(celt PROPERTIES PREFIX "")
-	endif()
-else()
-	set_target_properties(celt
-		PROPERTIES
-			OUTPUT_NAME "celt0"
-			LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}
-	)
-endif()
-
-target_sources(celt PRIVATE
-	"${LIBCELT_SRC_DIR}/bands.c"
-	"${LIBCELT_SRC_DIR}/celt.c"
-	"${LIBCELT_SRC_DIR}/cwrs.c"
-	"${LIBCELT_SRC_DIR}/entcode.c"
-	"${LIBCELT_SRC_DIR}/entdec.c"
-	"${LIBCELT_SRC_DIR}/entenc.c"
-	"${LIBCELT_SRC_DIR}/header.c"
-	"${LIBCELT_SRC_DIR}/kiss_fft.c"
-	"${LIBCELT_SRC_DIR}/kiss_fftr.c"
-	"${LIBCELT_SRC_DIR}/laplace.c"
-	"${LIBCELT_SRC_DIR}/mdct.c"
-	"${LIBCELT_SRC_DIR}/modes.c"
-	"${LIBCELT_SRC_DIR}/pitch.c"
-	"${LIBCELT_SRC_DIR}/psy.c"
-	"${LIBCELT_SRC_DIR}/quant_bands.c"
-	"${LIBCELT_SRC_DIR}/rangedec.c"
-	"${LIBCELT_SRC_DIR}/rangeenc.c"
-	"${LIBCELT_SRC_DIR}/rate.c"
-	"${LIBCELT_SRC_DIR}/vq.c"
-)
-
-target_disable_warnings(celt)
-
-# We have to explicitly link to the "m" (math) library.
-# See https://stackoverflow.com/q/1033898/3907364 for why
-find_library(MATH_LIBRARY m)
-
-# If -lm exists
-if(MATH_LIBRARY)
-	# Link it to prevent "contains an unresolvable reference to symbol sin: it's probably a plugin"
-	target_link_libraries(celt PUBLIC ${MATH_LIBRARY})
-endif()
diff --git a/3rdparty/celt-0.7.0-build/celt-0.7.0.rc b/3rdparty/celt-0.7.0-build/celt-0.7.0.rc
deleted file mode 100644
index cbec28050..000000000
--- a/3rdparty/celt-0.7.0-build/celt-0.7.0.rc
+++ /dev/null
@@ -1,42 +0,0 @@
-#include <winver.h>
-
-#ifndef DEBUG
-#define VER_DEBUG                   0L
-#else
-#define VER_DEBUG                   VS_FF_DEBUG
-#endif
-
-#ifdef SNAPSHOT_BUILD
-#define	VER_RELEASE	VS_FF_SPECIALBUILD|VS_FF_PRERELEASE
-#else
-#define VER_RELEASE 0L
-#endif
-
-VS_VERSION_INFO VERSIONINFO
-	FILEVERSION		1,3,0,0
-	PRODUCTVERSION	1,3,0,0
-	FILEFLAGSMASK	VS_FFI_FILEFLAGSMASK
-	FILEFLAGS		(VER_DEBUG|VER_RELEASE)
-	FILEOS			VOS_NT_WINDOWS32
-	FILETYPE		VFT_DLL
-	FILESUBTYPE		0L
-	BEGIN
-		BLOCK "StringFileInfo"
-		BEGIN
-			BLOCK "040904E4"
-			BEGIN
-				VALUE "FileDescription", "Mumble CELT 0.7.0 DLL"
-				VALUE "FileVersion", "1.3.0"
-				VALUE "ProductVersion", "1.3.0"
-				VALUE "OriginalFilename", "celt0.0.7.0.dll"
-				VALUE "ProductName", "Mumble"
-#ifdef SNAPSHOT_BUILD
-				VALUE "SpecialBuild", "Snapshot development release"
-#endif
-			END
-		END
-		BLOCK "VarFileInfo"
-		BEGIN
-			VALUE "Translation", 0x409, 1252
-		END
-	END
diff --git a/3rdparty/celt-0.7.0-build/config.h b/3rdparty/celt-0.7.0-build/config.h
deleted file mode 100644
index f2af5dc12..000000000
--- a/3rdparty/celt-0.7.0-build/config.h
+++ /dev/null
@@ -1,175 +0,0 @@
-/* config.h.  Generated from config.h.in by configure.  */
-/* config.h.in.  Generated from configure.ac by autoheader.  */
-
-/* Define if building universal (internal helper macro) */
-/* #undef AC_APPLE_UNIVERSAL_BUILD */
-
-/* This is a build of CELT */
-#define CELT_BUILD /**/
-
-/* Version extra */
-#define CELT_EXTRA_VERSION ""
-
-/* Version major */
-#define CELT_MAJOR_VERSION 0
-
-/* Version micro */
-#define CELT_MICRO_VERSION 0
-
-/* Version minor */
-#define CELT_MINOR_VERSION 7
-
-/* Complete version string */
-#define CELT_VERSION "0.7.0"
-
-/* Compile as fixed-point */
-/* #undef DOUBLE_PRECISION */
-
-/* Assertions */
-/* #undef ENABLE_ASSERTIONS */
-
-/* Debug fixed-point implementation */
-/* #undef FIXED_DEBUG */
-
-/* Compile as fixed-point */
-/* #undef FIXED_POINT */
-
-/* Compile as floating-point */
-#define FLOATING_POINT /**/
-
-/* Define to 1 if you have the <alloca.h> header file. */
-#define HAVE_ALLOCA_H 1
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#define HAVE_DLFCN_H 1
-
-/* Define to 1 if you have the <getopt.h> header file. */
-#define HAVE_GETOPT_H 1
-
-/* Define to 1 if you have the `getopt_long' function. */
-#define HAVE_GETOPT_LONG 1
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#define HAVE_INTTYPES_H 1
-
-/* Define to 1 if you have the `m' library (-lm). */
-#define HAVE_LIBM 1
-
-/* Define to 1 if you have the `winmm' library (-lwinmm). */
-/* #undef HAVE_LIBWINMM */
-
-/* Define if you have C99's lrint function. */
-#define HAVE_LRINT 1
-
-/* Define if you have C99's lrintf function. */
-#define HAVE_LRINTF 1
-
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#define HAVE_STDINT_H 1
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the <strings.h> header file. */
-#define HAVE_STRINGS_H 1
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have the <sys/audioio.h> header file. */
-/* #undef HAVE_SYS_AUDIOIO_H */
-
-/* Define to 1 if you have the <sys/soundcard.h> header file. */
-#define HAVE_SYS_SOUNDCARD_H 1
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#define HAVE_UNISTD_H 1
-
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
-   */
-#define LT_OBJDIR ".libs/"
-
-/* Compile as fixed-point */
-/* #undef MIXED_PRECISION */
-
-/* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT ""
-
-/* Define to the full name of this package. */
-#define PACKAGE_NAME ""
-
-/* Define to the full name and version of this package. */
-#define PACKAGE_STRING ""
-
-/* Define to the one symbol short name of this package. */
-#define PACKAGE_TARNAME ""
-
-/* Define to the version of this package. */
-#define PACKAGE_VERSION ""
-
-/* The size of `int', as computed by sizeof. */
-#define SIZEOF_INT 4
-
-/* The size of `long', as computed by sizeof. */
-#define SIZEOF_LONG 8
-
-/* The size of `long long', as computed by sizeof. */
-#define SIZEOF_LONG_LONG 8
-
-/* The size of `short', as computed by sizeof. */
-#define SIZEOF_SHORT 2
-
-/* Static modes */
-/* #undef STATIC_MODES */
-
-/* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Make use of alloca */
-/* #undef USE_ALLOCA */
-
-/* Use C99 variable-size arrays */
-#define VAR_ARRAYS /**/
-
-/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
-   significant byte first (like Motorola and SPARC, unlike Intel). */
-#if defined AC_APPLE_UNIVERSAL_BUILD
-# if defined __BIG_ENDIAN__
-#  define WORDS_BIGENDIAN 1
-# endif
-#else
-# ifndef WORDS_BIGENDIAN
-/* #  undef WORDS_BIGENDIAN */
-# endif
-#endif
-
-/* Define to empty if `const' does not conform to ANSI C. */
-/* #undef const */
-
-/* Define to `__inline__' or `__inline' if that's what the C compiler
-   calls it, or to nothing if 'inline' is not supported under any name.  */
-#ifndef __cplusplus
-/* #undef inline */
-#endif
-
-/* Define to the equivalent of the C99 'restrict' keyword, or to
-   nothing if this is not supported.  Do not define if restrict is
-   supported directly.  */
-#define restrict __restrict
-/* Work around a bug in Sun C++: it does not support _Restrict, even
-   though the corresponding Sun C compiler does, which causes
-   "#define restrict _Restrict" in the previous line.  Perhaps some future
-   version of Sun C++ will work with _Restrict; if so, it'll probably
-   define __RESTRICT, just as Sun C does.  */
-#if defined __SUNPRO_CC && !defined __RESTRICT
-# define _Restrict
-#endif
diff --git a/3rdparty/celt-0.7.0-build/win32/config.h b/3rdparty/celt-0.7.0-build/win32/config.h
deleted file mode 100644
index 21f701047..000000000
--- a/3rdparty/celt-0.7.0-build/win32/config.h
+++ /dev/null
@@ -1,168 +0,0 @@
-/* config.h.  Generated from config.h.in by configure.  */
-/* config.h.in.  Generated from configure.ac by autoheader.  */
-
-/* Define if building universal (internal helper macro) */
-/* #undef AC_APPLE_UNIVERSAL_BUILD */
-
-/* This is a build of CELT */
-#define CELT_BUILD /**/
-
-/* Version extra */
-#define CELT_EXTRA_VERSION ""
-
-/* Version major */
-#define CELT_MAJOR_VERSION 0
-
-/* Version micro */
-#define CELT_MICRO_VERSION 2
-
-/* Version minor */
-#define CELT_MINOR_VERSION 5
-
-/* Complete version string */
-#define CELT_VERSION "0.5.2"
-
-/* Compile as fixed-point */
-/* #undef DOUBLE_PRECISION */
-
-/* Assertions */
-/* #undef ENABLE_ASSERTIONS */
-
-/* Debug fixed-point implementation */
-/* #undef FIXED_DEBUG */
-
-/* Compile as fixed-point */
-/* #undef FIXED_POINT */
-
-/* Compile as floating-point */
-#define FLOATING_POINT /**/
-
-/* Define to 1 if you have the <alloca.h> header file. */
-#define HAVE_ALLOCA_H 1
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#define HAVE_DLFCN_H 1
-
-/* Define to 1 if you have the <getopt.h> header file. */
-#define HAVE_GETOPT_H 1
-
-/* Define to 1 if you have the `getopt_long' function. */
-#define HAVE_GETOPT_LONG 1
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-// #define HAVE_INTTYPES_H 1
-
-/* Define to 1 if you have the `m' library (-lm). */
-#define HAVE_LIBM 1
-
-/* Define to 1 if you have the `winmm' library (-lwinmm). */
-/* #undef HAVE_LIBWINMM */
-
-/* Define if you have C99's lrint function. */
-// #define HAVE_LRINT 1
-
-/* Define if you have C99's lrintf function. */
-// #define HAVE_LRINTF 1
-
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define to 1 if you have the <stdint.h> header file. */
-// #define HAVE_STDINT_H 1
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the <strings.h> header file. */
-#define HAVE_STRINGS_H 1
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have the <sys/audioio.h> header file. */
-/* #undef HAVE_SYS_AUDIOIO_H */
-
-/* Define to 1 if you have the <sys/soundcard.h> header file. */
-#define HAVE_SYS_SOUNDCARD_H 1
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#define HAVE_UNISTD_H 1
-
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
-   */
-#define LT_OBJDIR ".libs/"
-
-/* Compile as fixed-point */
-/* #undef MIXED_PRECISION */
-
-/* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT ""
-
-/* Define to the full name of this package. */
-#define PACKAGE_NAME ""
-
-/* Define to the full name and version of this package. */
-#define PACKAGE_STRING ""
-
-/* Define to the one symbol short name of this package. */
-#define PACKAGE_TARNAME ""
-
-/* Define to the version of this package. */
-#define PACKAGE_VERSION ""
-
-/* The size of `int', as computed by sizeof. */
-#define SIZEOF_INT 4
-
-/* The size of `long', as computed by sizeof. */
-#define SIZEOF_LONG 8
-
-/* The size of `long long', as computed by sizeof. */
-#define SIZEOF_LONG_LONG 8
-
-/* The size of `short', as computed by sizeof. */
-#define SIZEOF_SHORT 2
-
-/* Static modes */
-/* #undef STATIC_MODES */
-
-/* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Make use of alloca */
-/* #undef USE_ALLOCA */
-#define USE_ALLOCA 1
-
-/* Use C99 variable-size arrays */
-// #define VAR_ARRAYS /**/
-
-/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
-   significant byte first (like Motorola and SPARC, unlike Intel). */
-#if defined AC_APPLE_UNIVERSAL_BUILD
-# if defined __BIG_ENDIAN__
-#  define WORDS_BIGENDIAN 1
-# endif
-#else
-# ifndef WORDS_BIGENDIAN
-/* #  undef WORDS_BIGENDIAN */
-# endif
-#endif
-
-/* Define to empty if `const' does not conform to ANSI C. */
-/* #undef const */
-
-/* Define to `__inline__' or `__inline' if that's what the C compiler
-   calls it, or to nothing if 'inline' is not supported under any name.  */
-#ifndef __cplusplus
-#define inline
-#endif
-
-/* Define to the equivalent of the C99 'restrict' keyword, or to
-   nothing if this is not supported.  Do not define if restrict is
-   supported directly.  */
-#define restrict
diff --git a/3rdparty/speex-build/AGC.cpp b/3rdparty/speex-build/AGC.cpp
deleted file mode 100644
index b4faa19e2..000000000
--- a/3rdparty/speex-build/AGC.cpp
+++ /dev/null
@@ -1,153 +0,0 @@
-#include <QtCore>
-
-#ifdef Q_OS_WIN
-#define _WIN32_IE 0x0600
-#include <windows.h>
-#include <shellapi.h>
-#define CALLGRIND_START_INSTRUMENTATION
-#define CALLGRIND_STOP_INSTRUMENTATION
-#define CALLGRIND_ZERO_STATS
-#else
-#include <valgrind/callgrind.h>
-#endif
-
-#include <math.h>
-#include <speex/speex.h>
-#include <speex/speex_preprocess.h>
-
-#include "Timer.h"
-
-template<class T>
-static inline double veccomp(const QVector<T> &a, const QVector<T> &b, const char *n) {
-	long double gdiff = 0.0;
-	if (a.size() != b.size()) {
-		qFatal("%s: %d <=> %d", n, a.size(), b.size());
-	}
-	for (int i=0;i<a.size();++i) {
-		double diff = fabs(a[i] - b[i]);
-		if (diff > gdiff)
-			gdiff = diff;
-#ifdef EXACT
-
-		if (a[i] != b[i]) {
-#else
-		union { T tv;
-			uint32_t uv;
-		} v1, v2;
-		v1.uv = v2.uv = 0;
-		v1.tv = a[i];
-		v2.tv = b[i];
-		if (fabsf(a[i] - b[i]) > 1000) {
-			qWarning("%08x %08x %08x", v1.uv, v2.uv, v1.uv ^ v2.uv);
-#endif
-			qFatal("%s: Offset %d: %.10g <=> %.10g", n, i, static_cast<double>(a[i]), static_cast<double>(b[i]));
-		}
-	}
-	return gdiff;
-}
-
-int main(int argc, char **argv) {
-
-	CALLGRIND_STOP_INSTRUMENTATION;
-	CALLGRIND_ZERO_STATS;
-
-	QCoreApplication a(argc, argv);
-
-	QFile f((argc >= 2) ? argv[1] : "wb_male.wav");
-	if (! f.open(QIODevice::ReadOnly)) {
-		qFatal("Failed to open file!");
-	}
-	f.seek(36 + 8);
-
-	QFile o("output.agc");
-	if (! o.open(QIODevice::WriteOnly))
-		qFatal("Failed to open out file!");
-
-	QFile vf("verify.agc");
-	if (! vf.open(QIODevice::ReadOnly))
-		qWarning("No verify!");
-
-	QDataStream out(&o);
-	QDataStream verify(&vf);
-
-	static const int iFrameSize = 320;
-	int iarg;
-
-	SpeexPreprocessState *spp = speex_preprocess_state_init(iFrameSize, 16000);
-	iarg = 0;
-	speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_VAD, &iarg);
-	speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_DENOISE, &iarg);
-	speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_DEREVERB, &iarg);
-
-	iarg = 1;
-	speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_AGC, &iarg);
-	iarg = 21747;
-	speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_AGC_TARGET, &iarg);
-
-
-	QVector<QByteArray> v;
-	while (1) {
-		QByteArray qba = f.read(iFrameSize * sizeof(short));
-		if (qba.size() != iFrameSize * sizeof(short))
-			break;
-		v.append(qba);
-	}
-
-	int nframes = v.size();
-
-	qWarning("Ready to process %d frames of %d samples", nframes, iFrameSize);
-
-	QVector<short *> qvIn;
-	QVector<short> sIn(nframes * iFrameSize);
-
-	for (int i=0;i<nframes;i++) {
-		const short *ptr = reinterpret_cast<const short *>(v[i].constData());
-		short *s = sIn.data() + i * iFrameSize;
-		for (int j=0;j<iFrameSize;++j)
-			s[j] = ptr[j];
-		qvIn.append(s);
-	}
-
-#ifdef Q_OS_WIN
-	if (!SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS))
-		qWarning("Application: Failed to set priority!");
-#endif
-
-	Timer t;
-	t.restart();
-
-	CALLGRIND_START_INSTRUMENTATION;
-
-	for (int i=0;i<nframes;i++) {
-		speex_preprocess_run(spp, qvIn[i]);
-
-		int v;
-		speex_preprocess_ctl(spp, SPEEX_PREPROCESS_GET_AGC_GAIN, &v);
-		qWarning("%d %d", i, v);
-
-	}
-	CALLGRIND_STOP_INSTRUMENTATION;
-
-	quint64 e = t.elapsed();
-
-#ifdef Q_OS_WIN
-	if (!SetPriorityClass(GetCurrentProcess(),NORMAL_PRIORITY_CLASS))
-		qWarning("Application: Failed to reset priority!");
-#endif
-
-	qWarning("Used %llu usec", e);
-	qWarning("%.2f times realtime", (20000ULL * nframes) / (e * 1.0));
-
-	if (! RUNNING_ON_VALGRIND) {
-
-		out << sIn;
-
-		if (vf.isOpen()) {
-			QVector<short> vIn;
-			verify >> vIn;
-			veccomp(vIn, sIn, "AGC");
-		}
-	}
-
-	return 0;
-}
diff --git a/3rdparty/speex-build/CMakeLists.txt b/3rdparty/speex-build/CMakeLists.txt
deleted file mode 100644
index 90d2c68cc..000000000
--- a/3rdparty/speex-build/CMakeLists.txt
+++ /dev/null
@@ -1,97 +0,0 @@
-set(SPEEX_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../speex-src")
-set(SPEEXDSP_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../speexdsp")
-
-set(SPEEX_SRC_DIR "${SPEEX_DIR}/libspeex")
-set(SPEEXDSP_SRC_DIR "${SPEEXDSP_DIR}/libspeexdsp")
-
-if(NOT EXISTS "${SPEEX_DIR}/COPYING" OR NOT EXISTS "${SPEEXDSP_DIR}/COPYING")
-	message(FATAL_ERROR
-		"${SPEEX_DIR} or ${SPEEXDSP_DIR} was not found. You need to do one of the following:\n"
-		"Option 1: Checkout the submodule:\n"
-		"git submodule update --init --recursive\n"
-		"Option 2: Use system Speex and SpeexDSP (v1.2 or later):\n"
-		"cmake .. -Dbundled-speex=OFF"
-	)
-endif()
-
-if(WIN32)
-	add_library(speex SHARED)
-	set_target_properties(speex PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
-	if(MINGW)
-		# Remove "lib" prefix.
-		set_target_properties(speex PROPERTIES PREFIX "")
-	endif()
-else()
-	add_library(speex STATIC)
-endif()
-
-# Speex doesn't use include guards in its headers, so unity builds will fail
-set_target_properties(speex PROPERTIES UNITY_BUILD FALSE)
-
-target_compile_definitions(speex PRIVATE "HAVE_CONFIG_H")
-
-target_include_directories(speex PRIVATE SYSTEM "${SPEEX_DIR}/libspeex" "${SPEEXDSP_DIR}/libspeexdsp")
-target_include_directories(speex PUBLIC SYSTEM "${SPEEX_DIR}/include" "${SPEEXDSP_DIR}/include")
-
-if(MSVC)
-	# We include "win32" only for MSVC because MinGW uses the "config.h" for Unix-like systems.
-	target_include_directories(speex PRIVATE SYSTEM BEFORE "${CMAKE_CURRENT_SOURCE_DIR}/win32")
-else()
-	target_include_directories(speex PUBLIC SYSTEM ${CMAKE_CURRENT_SOURCE_DIR})
-endif()
-
-if(WIN32)
-	target_compile_definitions(speex PRIVATE "_USE_MATH_DEFINES" "USE_SMALLFT")
-	target_sources(speex PRIVATE "mumble_speex_init.c")
-endif()
-
-set(SPEEXDSP_SOURCES
-	"${SPEEXDSP_SRC_DIR}/fftwrap.c"
-	"${SPEEXDSP_SRC_DIR}/filterbank.c"
-	"${SPEEXDSP_SRC_DIR}/jitter.c"
-	"${SPEEXDSP_SRC_DIR}/mdf.c"
-	"${SPEEXDSP_SRC_DIR}/preprocess.c"
-	"${SPEEXDSP_SRC_DIR}/resample.c"
-	"${SPEEXDSP_SRC_DIR}/scal.c"
-	"${SPEEXDSP_SRC_DIR}/smallft.c"
-)
-
-set(SPEEX_SOURCES
-	"${SPEEX_SRC_DIR}/bits.c"
-	"${SPEEX_SRC_DIR}/cb_search.c"
-	"${SPEEX_SRC_DIR}/exc_5_64_table.c"
-	"${SPEEX_SRC_DIR}/exc_5_256_table.c"
-	"${SPEEX_SRC_DIR}/exc_8_128_table.c"
-	"${SPEEX_SRC_DIR}/exc_10_16_table.c"
-	"${SPEEX_SRC_DIR}/exc_10_32_table.c"
-	"${SPEEX_SRC_DIR}/exc_20_32_table.c"
-	"${SPEEX_SRC_DIR}/filters.c"
-	"${SPEEX_SRC_DIR}/gain_table.c"
-	"${SPEEX_SRC_DIR}/gain_table_lbr.c"
-	"${SPEEX_SRC_DIR}/hexc_10_32_table.c"
-	"${SPEEX_SRC_DIR}/hexc_table.c"
-	"${SPEEX_SRC_DIR}/high_lsp_tables.c"
-	"${SPEEX_SRC_DIR}/kiss_fft.c"
-	"${SPEEX_SRC_DIR}/kiss_fftr.c"
-	"${SPEEX_SRC_DIR}/lpc.c"
-	"${SPEEX_SRC_DIR}/lsp.c"
-	"${SPEEX_SRC_DIR}/lsp_tables_nb.c"
-	"${SPEEX_SRC_DIR}/ltp.c"
-	"${SPEEX_SRC_DIR}/modes.c"
-	"${SPEEX_SRC_DIR}/modes_wb.c"
-	"${SPEEX_SRC_DIR}/nb_celp.c"
-	"${SPEEX_SRC_DIR}/quant_lsp.c"
-	"${SPEEX_SRC_DIR}/sb_celp.c"
-	"${SPEEX_SRC_DIR}/speex.c"
-	"${SPEEX_SRC_DIR}/speex_callbacks.c"
-	"${SPEEX_SRC_DIR}/speex_header.c"
-	"${SPEEX_SRC_DIR}/stereo.c"
-	"${SPEEX_SRC_DIR}/vbr.c"
-	"${SPEEX_SRC_DIR}/vorbis_psy.c"
-	"${SPEEX_SRC_DIR}/vq.c"
-	"${SPEEX_SRC_DIR}/window.c"
-)
-
-target_sources(speex PRIVATE ${SPEEXDSP_SOURCES} ${SPEEX_SOURCES} "speex.def")
-
-target_disable_warnings(speex)
diff --git a/3rdparty/speex-build/ResampMark.cpp b/3rdparty/speex-build/ResampMark.cpp
deleted file mode 100644
index 01c0c4a33..000000000
--- a/3rdparty/speex-build/ResampMark.cpp
+++ /dev/null
@@ -1,383 +0,0 @@
-#include <QtCore>
-
-static const float tfreq1 = 48000.f;
-static const float tfreq2 = 44100.f;
-static const int qual = 3;
-static const int loops = 2000 / qual;
-// static const int loops = 1;
-#define SM_VERIFY
-// #define EXACT
-
-#ifdef Q_OS_WIN
-#define _WIN32_IE 0x0600
-#include <windows.h>
-#include <shellapi.h>
-#include <mathimf.h>
-#define CALLGRIND_START_INSTRUMENTATION
-#define CALLGRIND_STOP_INSTRUMENTATION
-#define CALLGRIND_ZERO_STATS
-#define RUNNING_ON_VALGRIND 0
-#else
-#include <sched.h>
-#include <sys/mman.h>
-#include <valgrind/callgrind.h>
-#endif
-
-#include <math.h>
-#include <speex/speex_resampler.h>
-
-#include <emmintrin.h>
-
-
-#include "Timer.h"
-
-template<class T>
-static inline double veccomp(const QVector<T> &a, const QVector<T> &b, const char *n) {
-	long double gdiff = 0.0;
-	if (a.size() != b.size()) {
-		qFatal("%s: %d <=> %d", n, a.size(), b.size());
-	}
-	for (int i=0;i<a.size();++i) {
-		double diff = fabs(a[i] - b[i]);
-		if (diff > gdiff)
-			gdiff = diff;
-#ifdef EXACT
-
-		if (a[i] != b[i]) {
-#else
-		union { T tv;
-			quint32 uv;
-		} v1, v2;
-		v1.uv = v2.uv = 0;
-		v1.tv = a[i];
-		v2.tv = b[i];
-		if (fabsf(a[i] - b[i]) > 1) {
-			qWarning("%08x %08x %08x", v1.uv, v2.uv, v1.uv ^ v2.uv);
-#endif
-			qFatal("%s: Offset %d: %.10g <=> %.10g", n, i, static_cast<double>(a[i]), static_cast<double>(b[i]));
-		}
-	}
-	return gdiff;
-}
-
-template<class T>
-QPair<T, T> confint(const QVector<T> &vecin) {
-	long double avg = 0.0;
-	long double stddev = 0.0;
-	QVector<T> vec = vecin;
-	qSort(vec.begin(), vec.end());
-	for (int i=0;i<vec.count() / 20;++i) {
-		vec.pop_front();
-		vec.pop_back();
-	}
-
-	foreach(T v, vec)
-		avg += v;
-	avg /= vec.count();
-
-	foreach(T v, vec)
-		stddev += (v-avg)*(v-avg);
-	stddev = sqrtl(stddev / vec.count());
-	return QPair<T,T>(static_cast<T>(avg), static_cast<T>(1.96 * stddev));
-}
-
-int main(int argc, char **argv) {
-
-	CALLGRIND_STOP_INSTRUMENTATION;
-	CALLGRIND_ZERO_STATS;
-
-	QCoreApplication a(argc, argv);
-
-	QFile f((argc >= 2) ? argv[1] : "wb_male.wav");
-	if (! f.open(QIODevice::ReadOnly)) {
-		qFatal("Failed to open file!");
-	}
-	f.seek(36 + 8);
-
-	QFile o("output.raw");
-	if (!(RUNNING_ON_VALGRIND))
-		if (! o.open(QIODevice::WriteOnly))
-			qFatal("Failed to open output!");
-
-	QFile vf((argc >= 3) ? argv[2] : "verify.raw");
-	if (! vf.open(QIODevice::ReadOnly)) {
-		qWarning("Failed to open validate file!");
-	}
-
-	QDataStream out(&o);
-	QDataStream verify(&vf);
-
-	const int iFrameSize = 320;
-
-	QVector<QByteArray> v;
-	while (1) {
-		QByteArray qba = f.read(iFrameSize * 2);
-		if (qba.size() != iFrameSize * 2)
-			break;
-		v.append(qba);
-	}
-
-	int nframes = v.size();
-
-
-	qWarning("Ready to process %d frames of %d samples", nframes, iFrameSize);
-
-	QVector<short *> qvInShort;
-	QVector<float *> qvIn;
-	QVector<float *> qvDirect;
-	QVector<float *> qvInterpolate;
-	QVector<float *> qvInterpolateMC;
-	QVector<short *> qvInterpolateShort;
-	QVector<float *> qv8;
-	QVector<float *> qv96;
-
-	const float sfraq1 = tfreq1 / 16000.0f;
-	float fOutSize1 = iFrameSize * sfraq1;
-	int iOutSize1 = lroundf(fOutSize1);
-
-	const float sfraq2 = tfreq2 / 16000.0f;
-	float fOutSize2 = iFrameSize * sfraq2;
-	int iOutSize2 = lroundf(fOutSize2);
-
-	int iOutSize8 = iFrameSize / 2;
-	int iOutSize96 = iFrameSize * 6;
-
-	if (RUNNING_ON_VALGRIND)
-		nframes = qMin(nframes, 10);
-
-	QVector<float> fInput(nframes * iFrameSize);
-	QVector<float> fDirect(nframes * iOutSize1);
-	QVector<float> fInterpolate(nframes * iOutSize2);
-	QVector<float> fInterpolateMC(nframes * iOutSize2);
-	QVector<short> sInterpolate(nframes * iOutSize2);
-	QVector<float> f96(nframes * iOutSize96);
-	QVector<float> f8(nframes *iOutSize8);
-
-	for (int i=0;i<nframes;i++) {
-		short *s = reinterpret_cast<short *>(v[i].data());
-		float *f = fInput.data() + i * iFrameSize;
-
-		for (int j=0;j<iFrameSize;j++)
-			f[j]=s[j]+20;
-
-		qvInShort.append(s);
-		qvIn.append(f);
-		qvDirect.append(fDirect.data() + i * iOutSize1);
-		qvInterpolate.append(fInterpolate.data() + i * iOutSize2);
-		qvInterpolateMC.append(fInterpolateMC.data() + i * iOutSize2);
-		qvInterpolateShort.append(sInterpolate.data() + i * iOutSize2);
-		qv8.append(f8.data() + i * iOutSize8);
-		qv96.append(f96.data() + i * iOutSize96);
-	}
-
-	int err;
-	SpeexResamplerState *srs1 = speex_resampler_init(1, 16000, lroundf(tfreq1), qual, &err);
-	SpeexResamplerState *srs2 = speex_resampler_init(1, 16000, lroundf(tfreq2), qual, &err);
-	SpeexResamplerState *srs2i = speex_resampler_init(1, 16000, lroundf(tfreq2), qual, &err);
-	SpeexResamplerState *srss = speex_resampler_init(3, 16000, lroundf(tfreq2), qual, &err);
-
-	SpeexResamplerState *srsto96 = speex_resampler_init(1, 16000, 96000, 5, &err);
-	SpeexResamplerState *srs8to96 = speex_resampler_init(1, 8000, 96000, qual, &err);
-	SpeexResamplerState *srs96to8 = speex_resampler_init(1, 96000, 8000, qual, &err);
-
-
-#ifdef Q_OS_WIN
-	if (!SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS))
-		qWarning("Application: Failed to set priority!");
-#endif
-
-	spx_uint32_t inlen;
-	spx_uint32_t outlen;
-
-	Timer t;
-	quint64 e;
-
-	if (! RUNNING_ON_VALGRIND) {
-#ifndef Q_OS_WIN
-		struct sched_param sp;
-		sp.sched_priority = sched_get_priority_max(SCHED_FIFO);
-
-		cpu_set_t cpuset;
-		CPU_ZERO(&cpuset);
-		CPU_SET(1, &cpuset);
-
-		if (sched_setscheduler(getpid(), SCHED_FIFO, &sp) != 0)
-			qWarning("No realtime.");
-		if (mlockall(MCL_CURRENT | MCL_FUTURE) != 0)
-			qWarning("No mlock.");
-		if (sched_setaffinity(0, sizeof(cpuset), &cpuset) != 0)
-			qWarning("No affinity");
-
-		sched_yield();
-#endif
-
-		for (int i=0;i<nframes;++i) {
-			inlen = iFrameSize;
-			outlen = iOutSize96;
-			speex_resampler_process_float(srsto96, 0, qvIn[i], &inlen, qv96[i], &outlen);
-		}
-
-		QVector<unsigned long long> qvTimes;
-		QPair<unsigned long long, unsigned long long> ci;
-
-		for (int j=0;j<loops;j++) {
-			t.restart();
-			for (int i=0;i<nframes;i++) {
-				inlen = iFrameSize;
-				outlen = iOutSize1;
-				speex_resampler_process_float(srs1, 0, qvIn[i], &inlen, qvDirect[i], &outlen);
-			}
-			e = t.elapsed();
-			qvTimes.append(e);
-		}
-		ci = confint(qvTimes);
-		qWarning("Direct:      %8llu +/- %3llu usec (%d)", ci.first, ci.second, qvTimes.count(), qvTimes.count());
-
-		qvTimes.clear();
-
-		for (int j=0;j<loops;j++) {
-			t.restart();
-			for (int i=0;i<nframes;i++) {
-				inlen = iFrameSize;
-				outlen = iOutSize2;
-				speex_resampler_process_float(srs2, 0, qvIn[i], &inlen, qvInterpolate[i], &outlen);
-			}
-			e = t.elapsed();
-			qvTimes.append(e);
-		}
-		ci = confint(qvTimes);
-		qWarning("Interpolate: %8llu +/- %3llu usec (%d)", ci.first, ci.second, qvTimes.count());
-
-		qvTimes.clear();
-		for (int j=0;j<loops;j++) {
-			t.restart();
-			for (int i=0;i<nframes;i++) {
-				inlen = iOutSize96;
-				outlen = iOutSize8;
-				speex_resampler_process_float(srs96to8, 0, qv96[i], &inlen, qv8[i], &outlen);
-			}
-			e = t.elapsed();
-			qvTimes.append(e);
-		}
-		ci = confint(qvTimes);
-		qWarning("96 => 8:     %8llu +/- %3llu usec (%d)", ci.first, ci.second, qvTimes.count());
-
-		qvTimes.clear();
-		t.restart();
-		for (int j=0;j<loops;j++) {
-			t.restart();
-			for (int i=0;i<nframes;i++) {
-				inlen = iOutSize8;
-				outlen = iOutSize96;
-				speex_resampler_process_float(srs8to96, 0, qv8[i], &inlen, qv96[i], &outlen);
-			}
-			e = t.elapsed();
-			qvTimes.append(e);
-		}
-		ci = confint(qvTimes);
-		qWarning("8 => 96:     %8llu +/- %3llu usec (%d)", ci.first, ci.second, qvTimes.count());
-
-		speex_resampler_reset_mem(srs1);
-		speex_resampler_reset_mem(srs2);
-	}
-
-	t.restart();
-	CALLGRIND_START_INSTRUMENTATION;
-
-	for (int i=0;i<nframes;i++) {
-		inlen = iFrameSize;
-		outlen = iOutSize1;
-		speex_resampler_process_float(srs1, 0, qvIn[i], &inlen, qvDirect[i], &outlen);
-
-		inlen = iFrameSize;
-		outlen = iOutSize2;
-		speex_resampler_process_float(srs2, 0, qvIn[i], &inlen, qvInterpolate[i], &outlen);
-
-		inlen = iFrameSize;
-		outlen = iOutSize2;
-		speex_resampler_process_int(srs2i, 0, qvInShort[i], &inlen, qvInterpolateShort[i], &outlen);
-
-		inlen = iFrameSize / 4;
-		outlen = iOutSize2 / 4;
-		speex_resampler_process_interleaved_float(srss, qvIn[i], &inlen, qvInterpolateMC[i], &outlen);
-	}
-	e = t.elapsed();
-
-#ifdef Q_OS_WIN
-	if (!SetPriorityClass(GetCurrentProcess(),NORMAL_PRIORITY_CLASS))
-		qWarning("Application: Failed to reset priority!");
-#endif
-
-	const int freq[10] = { 22050, 32000, 11025, 16000, 48000, 41000, 8000, 96000, 11025, 1600 };
-
-	QVector<float> fMagic;
-
-	for (int f=0;f<10;f++) {
-		float fbuff[32767];
-		speex_resampler_set_rate(srs1, 16000, freq[f]);
-		for (int q = 0;q < 10;q++) {
-			speex_resampler_set_quality(srs1, (3*q) % 7);
-			inlen = iFrameSize;
-			outlen = 32767;
-			speex_resampler_process_float(srs1, 0, qvIn[(f*10+q) % nframes], &inlen, fbuff, &outlen);
-			for (int j=0;j<outlen;j++)
-				fMagic.append(fbuff[j]);
-		}
-		inlen = iFrameSize;
-		outlen = 32767;
-		speex_resampler_process_float(srs1, 0, NULL, &inlen, fbuff, &outlen);
-		for (int j=0;j<outlen;j++)
-			fMagic.append(fbuff[j]);
-	}
-
-	// Cropped magic test
-	for (int f=0;f<10;f++) {
-		float fbuff[32767];
-		speex_resampler_set_rate(srs1, 16000, freq[f]);
-		for (int q = 0;q < 10;q++) {
-			speex_resampler_set_quality(srs1, (3*q) % 7);
-			inlen = iFrameSize;
-			outlen = 16;
-			speex_resampler_process_float(srs1, 0, qvIn[(f*10+q) % nframes], &inlen, fbuff, &outlen);
-			for (int j=0;j<outlen;j++)
-				fMagic.append(fbuff[j]);
-		}
-		inlen = iFrameSize;
-		outlen = 32767;
-		speex_resampler_process_float(srs1, 0, NULL, &inlen, fbuff, &outlen);
-		for (int j=0;j<outlen;j++)
-			fMagic.append(fbuff[j]);
-	}
-
-
-	CALLGRIND_STOP_INSTRUMENTATION;
-
-	qWarning("Used %llu usec", e);
-	qWarning("%.2f times realtime", (20000ULL * nframes) / (e * 1.0));
-
-	if (! RUNNING_ON_VALGRIND) {
-		QVector<float> vDirect;
-		QVector<float> vInterpolate;
-		QVector<short> vsInterpolate;
-		QVector<float> vMagic;
-		QVector<float> vInterpolateMC;
-
-		out << fDirect << fInterpolate << sInterpolate << fMagic << fInterpolateMC;
-
-		if (vf.isOpen()) {
-			verify >> vDirect >> vInterpolate >> vsInterpolate >> vMagic >> vInterpolateMC;
-
-			double rmsd = veccomp(vDirect, fDirect, "SRS1");
-			double rmsi = veccomp(vInterpolate, fInterpolate, "SRS2");
-			veccomp(vsInterpolate, sInterpolate, "SRS2i");
-			veccomp(vMagic, fMagic, "Magic");
-			veccomp(vInterpolateMC, fInterpolateMC, "MC");
-			qWarning("Direct: %g", rmsd);
-			qWarning("Interp: %g", rmsi);
-		} else {
-			qWarning("No verification!");
-		}
-	}
-
-	return 0;
-}
diff --git a/3rdparty/speex-build/SpeexMark.cpp b/3rdparty/speex-build/SpeexMark.cpp
deleted file mode 100644
index 937c273a3..000000000
--- a/3rdparty/speex-build/SpeexMark.cpp
+++ /dev/null
@@ -1,179 +0,0 @@
-
-#if defined(__INTEL_COMPILER)
-#include <mathimf.h>
-#else
-#include <math.h>
-#endif
-
-#include <QtCore>
-
-static const float tfreq1 = 48000.f;
-static const float tfreq2 = 44100.f;
-
-#ifdef Q_OS_WIN
-#define _WIN32_IE 0x0600
-#include <windows.h>
-#include <shellapi.h>
-#define CALLGRIND_START_INSTRUMENTATION
-#define CALLGRIND_STOP_INSTRUMENTATION
-#define CALLGRIND_ZERO_STATS
-#define lroundf(x) ( static_cast<long int>( (x) + ((x) >= 0.0f ? 0.5f : -0.5f) ) )
-#define lround(x) ( static_cast<long int>( (x) + ((x) >= 0.0 ? 0.5 : -0.5) ) )
-#else
-#include <valgrind/callgrind.h>
-#endif
-
-#include <speex/speex.h>
-#include <speex/speex_jitter.h>
-#include <speex/speex_preprocess.h>
-#include <speex/speex_echo.h>
-#include <speex/speex_callbacks.h>
-#include <speex/speex_resampler.h>
-
-#include "Timer.h"
-
-int main(int argc, char **argv) {
-
-	CALLGRIND_STOP_INSTRUMENTATION;
-	CALLGRIND_ZERO_STATS;
-
-	QCoreApplication a(argc, argv);
-
-	QFile f((argc >= 2) ? argv[1] : "wb_male.wav");
-	if (! f.open(QIODevice::ReadOnly)) {
-		qFatal("Failed to open file!");
-	}
-	f.seek(36 + 8);
-
-	void *enc = speex_encoder_init(&speex_wb_mode);
-
-	int iarg = 1;
-	speex_encoder_ctl(enc, SPEEX_SET_VBR, &iarg);
-	iarg = 0;
-	speex_encoder_ctl(enc, SPEEX_SET_VAD, &iarg);
-	speex_encoder_ctl(enc, SPEEX_SET_DTX, &iarg);
-
-	float farg = 6.0;
-	speex_encoder_ctl(enc, SPEEX_SET_VBR_QUALITY, &farg);
-	speex_encoder_ctl(enc, SPEEX_GET_BITRATE, &iarg);
-	speex_encoder_ctl(enc, SPEEX_SET_VBR_MAX_BITRATE, &iarg);
-
-	iarg = 4;
-	speex_encoder_ctl(enc, SPEEX_SET_COMPLEXITY, &iarg);
-
-	int iFrameSize;
-	speex_encoder_ctl(enc, SPEEX_GET_FRAME_SIZE, &iFrameSize);
-
-	void *dec = speex_decoder_init(&speex_wb_mode);
-	iarg = 1;
-	speex_decoder_ctl(dec, SPEEX_SET_ENH, &iarg);
-
-	SpeexPreprocessState *spp = speex_preprocess_state_init(iFrameSize, 16000);
-	iarg = 1;
-	speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_VAD, &iarg);
-	speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_DENOISE, &iarg);
-	speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_AGC, &iarg);
-	speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_DEREVERB, &iarg);
-
-	SpeexEchoState *ses = speex_echo_state_init(iFrameSize, iFrameSize * 10);
-	iarg = 16000;
-	speex_echo_ctl(ses, SPEEX_SET_SAMPLING_RATE, &iarg);
-	speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_ECHO_STATE, ses);
-
-	QVector<QByteArray> v;
-	while (1) {
-		QByteArray qba = f.read(iFrameSize * 2);
-		if (qba.size() != iFrameSize * 2)
-			break;
-		v.append(qba);
-	}
-
-	int nframes = v.size();
-
-	qWarning("Ready to process %d frames of %d samples", nframes, iFrameSize);
-
-	QVector<short *> sv;
-
-	short tframe[2048];
-	for (int i=0;i<iFrameSize;i++)
-		tframe[i] = 0;
-
-	for (int i=0;i<nframes;i++) {
-		sv.append(reinterpret_cast<short *>(v[i].data()));
-	}
-
-	float oframe[2048];
-	float resampframe[32768];
-
-	const float sfraq1 = tfreq1 / 16000.0f;
-	float fOutSize1 = iFrameSize * sfraq1;
-	int iOutSize1 = lroundf(fOutSize1);
-
-	const float sfraq2 = tfreq2 / 16000.0f;
-	float fOutSize2 = iFrameSize * sfraq2;
-	int iOutSize2 = lroundf(fOutSize2);
-
-	int err;
-	SpeexResamplerState *srs1 = speex_resampler_init(1, 16000, lroundf(tfreq1), 3, &err);
-	SpeexResamplerState *srs2 = speex_resampler_init(1, 16000, lroundf(tfreq2), 3, &err);
-
-	SpeexBits sb;
-	speex_bits_init(&sb);
-
-#ifdef Q_OS_WIN
-	if (!SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS))
-		qWarning("Application: Failed to set priority!");
-#endif
-
-	int len;
-	char data[4096];
-	spx_uint32_t inlen;
-	spx_uint32_t outlen;
-
-	Timer t;
-	t.restart();
-
-	nframes = qMin(nframes, 10);
-
-	int iter = 100;
-
-	CALLGRIND_START_INSTRUMENTATION;
-
-	for (int j=0;j<iter;j++) {
-		for (int i=0;i<nframes-2;i++) {
-			speex_bits_reset(&sb);
-
-			speex_echo_cancellation(ses, sv[i], sv[i+2], tframe);
-
-			speex_preprocess_run(spp, tframe);
-
-			speex_encode_int(enc, tframe, &sb);
-			len = speex_bits_nbytes(&sb);
-			speex_bits_write(&sb, data, len);
-
-			speex_bits_read_from(&sb, data, len);
-			speex_decode(dec, &sb, oframe);
-
-			inlen = iFrameSize;
-			outlen = iOutSize1;
-			speex_resampler_process_float(srs1, 0, oframe, &inlen, resampframe, &outlen);
-
-			inlen = iFrameSize;
-			outlen = iOutSize2;
-			speex_resampler_process_float(srs2, 0, oframe, &inlen, resampframe, &outlen);
-
-		}
-	}
-	CALLGRIND_STOP_INSTRUMENTATION;
-
-	quint64 e = t.elapsed();
-
-#ifdef Q_OS_WIN
-	if (!SetPriorityClass(GetCurrentProcess(),NORMAL_PRIORITY_CLASS))
-		qWarning("Application: Failed to reset priority!");
-#endif
-
-	qWarning("Used %llu usec", e);
-	qWarning("%.2f times realtime", (20000ULL * nframes * iter) / (e * 1.0));
-	return 0;
-}
diff --git a/3rdparty/speex-build/speex_config_types.h b/3rdparty/speex-build/speex_config_types.h
deleted file mode 100644
index bd548546b..000000000
--- a/3rdparty/speex-build/speex_config_types.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef __SPEEX_TYPES_H__
-#define __SPEEX_TYPES_H__
-
-/* these are filled in by configure */
-typedef short spx_int16_t;
-typedef unsigned short spx_uint16_t;
-typedef int spx_int32_t;
-typedef unsigned int spx_uint32_t;
-
-#endif
-
diff --git a/3rdparty/speexdsp-build/CMakeLists.txt b/3rdparty/speexdsp-build/CMakeLists.txt
new file mode 100644
index 000000000..d93780bd6
--- /dev/null
+++ b/3rdparty/speexdsp-build/CMakeLists.txt
@@ -0,0 +1,59 @@
+set(SPEEXDSP_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../speexdsp")
+
+set(SPEEXDSP_SRC_DIR "${SPEEXDSP_DIR}/libspeexdsp")
+
+if(NOT EXISTS "${SPEEXDSP_DIR}/COPYING")
+	message(FATAL_ERROR
+		"${SPEEX_DIR} or ${SPEEXDSP_DIR} was not found. You need to do one of the following:\n"
+		"Option 1: Checkout the submodule:\n"
+		"git submodule update --init --recursive\n"
+		"Option 2: Use system Speex and SpeexDSP (v1.2 or later):\n"
+		"cmake .. -Dbundled-speexdsp=OFF"
+	)
+endif()
+
+if(WIN32)
+	add_library(speexdsp SHARED)
+	set_target_properties(speexdsp PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
+	if(MINGW)
+		# Remove "lib" prefix.
+		set_target_properties(speexdsp PROPERTIES PREFIX "")
+	endif()
+else()
+	add_library(speexdsp STATIC)
+endif()
+
+# Speex doesn't use include guards in its headers, so unity builds will fail
+set_target_properties(speexdsp PROPERTIES UNITY_BUILD FALSE)
+
+target_compile_definitions(speexdsp PRIVATE "HAVE_CONFIG_H")
+
+target_include_directories(speexdsp PRIVATE SYSTEM "${SPEEX_DIR}/libspeex" "${SPEEXDSP_DIR}/libspeexdsp")
+target_include_directories(speexdsp PUBLIC SYSTEM "${SPEEX_DIR}/include" "${SPEEXDSP_DIR}/include")
+
+if(MSVC)
+	# We include "win32" only for MSVC because MinGW uses the "config.h" for Unix-like systems.
+	target_include_directories(speexdsp PRIVATE SYSTEM BEFORE "${CMAKE_CURRENT_SOURCE_DIR}/win32")
+else()
+	target_include_directories(speexdsp PUBLIC SYSTEM ${CMAKE_CURRENT_SOURCE_DIR})
+endif()
+
+if(WIN32)
+	target_compile_definitions(speexdsp PRIVATE "_USE_MATH_DEFINES" "USE_SMALLFT")
+	target_sources(speexdsp PRIVATE "mumble_speex_init.c")
+endif()
+
+set(SPEEXDSP_SOURCES
+	"${SPEEXDSP_SRC_DIR}/fftwrap.c"
+	"${SPEEXDSP_SRC_DIR}/filterbank.c"
+	"${SPEEXDSP_SRC_DIR}/jitter.c"
+	"${SPEEXDSP_SRC_DIR}/mdf.c"
+	"${SPEEXDSP_SRC_DIR}/preprocess.c"
+	"${SPEEXDSP_SRC_DIR}/resample.c"
+	"${SPEEXDSP_SRC_DIR}/scal.c"
+	"${SPEEXDSP_SRC_DIR}/smallft.c"
+)
+
+target_sources(speexdsp PRIVATE ${SPEEXDSP_SOURCES} "speexdsp.def")
+
+target_disable_warnings(speexdsp)
diff --git a/3rdparty/speex-build/config.h b/3rdparty/speexdsp-build/config.h
similarity index 100%
rename from 3rdparty/speex-build/config.h
rename to 3rdparty/speexdsp-build/config.h
diff --git a/3rdparty/speex-build/mumble_speex_init.c b/3rdparty/speexdsp-build/mumble_speex_init.c
similarity index 100%
rename from 3rdparty/speex-build/mumble_speex_init.c
rename to 3rdparty/speexdsp-build/mumble_speex_init.c
diff --git a/3rdparty/speex-build/speex.def b/3rdparty/speexdsp-build/speexdsp.def
similarity index 55%
rename from 3rdparty/speex-build/speex.def
rename to 3rdparty/speexdsp-build/speexdsp.def
index 1a23179ff..3a0e9e735 100644
--- a/3rdparty/speex-build/speex.def
+++ b/3rdparty/speexdsp-build/speexdsp.def
@@ -1,68 +1,8 @@
 ;
-; speex.def
+; speexdsp.def
 ;
-LIBRARY speex
+LIBRARY speexdsp
 EXPORTS
-;
-;
-;	speex.h
-;
-speex_encoder_init
-speex_encoder_destroy
-speex_encode
-speex_encode_int
-speex_encoder_ctl
-speex_decoder_init
-speex_decoder_destroy
-speex_decode
-speex_decode_int
-speex_decoder_ctl
-speex_mode_query
-speex_lib_ctl
-speex_lib_get_mode
-
-;
-;	speex_bits.h
-;
-speex_bits_init
-speex_bits_init_buffer
-speex_bits_set_bit_buffer
-speex_bits_destroy
-speex_bits_reset
-speex_bits_rewind
-speex_bits_read_from
-speex_bits_read_whole_bytes
-speex_bits_write
-speex_bits_write_whole_bytes
-speex_bits_pack
-speex_bits_unpack_signed
-speex_bits_unpack_unsigned
-speex_bits_nbytes
-speex_bits_peek_unsigned
-speex_bits_peek
-speex_bits_advance
-speex_bits_remaining
-speex_bits_insert_terminator
-
-;
-;	speex_callbacks.h
-;
-speex_inband_handler
-speex_std_mode_request_handler
-speex_std_high_mode_request_handler
-speex_std_char_handler
-speex_default_user_handler
-speex_std_low_mode_request_handler
-speex_std_vbr_request_handler
-speex_std_enh_request_handler
-speex_std_vbr_quality_request_handler
-
-;
-;	speex_header.h
-;
-speex_init_header
-speex_header_to_packet
-speex_packet_to_header
 
 ;
 ;	speex_echo.h
diff --git a/3rdparty/speex-build/speexdsp_config_types.h b/3rdparty/speexdsp-build/speexdsp_config_types.h
similarity index 100%
rename from 3rdparty/speex-build/speexdsp_config_types.h
rename to 3rdparty/speexdsp-build/speexdsp_config_types.h
diff --git a/3rdparty/speex-build/win32/config.h b/3rdparty/speexdsp-build/win32/config.h
similarity index 100%
rename from 3rdparty/speex-build/win32/config.h
rename to 3rdparty/speexdsp-build/win32/config.h
diff --git a/docs/dev/build-instructions/cmake_options.md b/docs/dev/build-instructions/cmake_options.md
index ae2d7f689..9763e7940 100644
--- a/docs/dev/build-instructions/cmake_options.md
+++ b/docs/dev/build-instructions/cmake_options.md
@@ -29,11 +29,6 @@ Build an x86 overlay
 Bundle Qt's translations as well
 (Default: ${static})
 
-### bundled-celt
-
-Build the included version of CELT instead of looking for one on the system.
-(Default: ON)
-
 ### bundled-opus
 
 Build the included version of Opus instead of looking for one on the system.
diff --git a/installer/ClientInstaller.cs b/installer/ClientInstaller.cs
index 063fcd348..e5fc82c4a 100644
--- a/installer/ClientInstaller.cs
+++ b/installer/ClientInstaller.cs
@@ -86,10 +86,9 @@ public class ClientInstaller : MumbleInstall {
 			// 64 bit
 			this.Platform = WixSharp.Platform.x64;
 			binaries = new List<string>() {
-				"celt0.0.7.0.dll",
 				"opus.dll",
 				"rnnoise.dll",
-				"speex.dll",
+				"speexdsp.dll",
 				"mumble.exe",
 				"mumble_app.dll",
 			};
@@ -108,10 +107,9 @@ public class ClientInstaller : MumbleInstall {
 			// 32 bit
 			this.Platform = WixSharp.Platform.x86;
 			binaries = new List<string>() {
-				"celt0.0.7.0.dll",
 				"opus.dll",
 				"rnnoise.dll",
-				"speex.dll",
+				"speexdsp.dll",
 				"mumble.exe",
 				"mumble_app.dll",
 			};
diff --git a/src/mumble/Audio.cpp b/src/mumble/Audio.cpp
index ab78c762f..954531cf9 100644
--- a/src/mumble/Audio.cpp
+++ b/src/mumble/Audio.cpp
@@ -7,10 +7,7 @@
 
 #include "AudioInput.h"
 #include "AudioOutput.h"
-#include "CELTCodec.h"
-#ifdef USE_OPUS
-#	include "OpusCodec.h"
-#endif
+#include "OpusCodec.h"
 #include "Log.h"
 #include "PacketDataStream.h"
 #include "PluginManager.h"
@@ -43,48 +40,12 @@ void CodecInit::initialize() {
 		delete oCodec;
 	}
 #endif
-
-	if (Global::get().s.bDisableCELT) {
-		// Kill switch for CELT activated. Do not initialize it.
-		return;
-	}
-
-	CELTCodec *codec = nullptr;
-
-#ifdef USE_SBCELT
-	codec = new CELTCodecSBCELT();
-	if (codec->isValid()) {
-		codec->report();
-		Global::get().qmCodecs.insert(codec->bitstreamVersion(), codec);
-	} else {
-		delete codec;
-	}
-#else
-	codec = new CELTCodec070(QLatin1String("0.7.0"));
-	if (codec->isValid()) {
-		codec->report();
-		Global::get().qmCodecs.insert(codec->bitstreamVersion(), codec);
-	} else {
-		delete codec;
-		codec = new CELTCodec070(QLatin1String("0.0.0"));
-		if (codec->isValid()) {
-			codec->report();
-			Global::get().qmCodecs.insert(codec->bitstreamVersion(), codec);
-		} else {
-			delete codec;
-		}
-	}
-#endif
 }
 
 void CodecInit::destroy() {
 #ifdef USE_OPUS
 	delete Global::get().oCodec;
 #endif
-
-	foreach (CELTCodec *codec, Global::get().qmCodecs)
-		delete codec;
-	Global::get().qmCodecs.clear();
 }
 
 LoopUser::LoopUser() {
diff --git a/src/mumble/AudioInput.cpp b/src/mumble/AudioInput.cpp
index 6dd00f6d4..3e7c88c38 100644
--- a/src/mumble/AudioInput.cpp
+++ b/src/mumble/AudioInput.cpp
@@ -6,10 +6,7 @@
 #include "AudioInput.h"
 
 #include "AudioOutput.h"
-#include "CELTCodec.h"
-#ifdef USE_OPUS
-#	include "OpusCodec.h"
-#endif
+#include "OpusCodec.h"
 #include "API.h"
 #include "MainWindow.h"
 #include "Message.h"
@@ -225,13 +222,11 @@ AudioInput::AudioInput() : opusBuffer(Global::get().s.iFramesPerPacket * (SAMPLE
 
 	Global::get().iAudioBandwidth = getNetworkBandwidth(iAudioQuality, iAudioFrames);
 
-	umtType = MessageHandler::UDPVoiceCELTAlpha;
+	umtType = MessageHandler::UDPVoiceOpus;
 
 	activityState = ActivityStateActive;
 	oCodec        = nullptr;
 	opusState     = nullptr;
-	cCodec        = nullptr;
-	ceEncoder     = nullptr;
 
 #ifdef USE_OPUS
 	oCodec = Global::get().oCodec;
@@ -311,10 +306,6 @@ AudioInput::~AudioInput() {
 	}
 #endif
 
-	if (ceEncoder) {
-		cCodec->celt_encoder_destroy(ceEncoder);
-	}
-
 	if (sppPreprocess)
 		speex_preprocess_state_destroy(sppPreprocess);
 	if (sesEcho)
@@ -803,73 +794,12 @@ void AudioInput::resetAudioProcessor() {
 }
 
 bool AudioInput::selectCodec() {
-	bool useOpus = false;
-
-	// Currently talking, use previous Opus status.
-	if (bPreviousVoice) {
-		useOpus = (umtType == MessageHandler::UDPVoiceOpus);
-	} else {
-#ifdef USE_OPUS
-		if (Global::get().bOpus || (Global::get().s.lmLoopMode == Settings::Local)) {
-			useOpus = true;
-		}
-#endif
-	}
-
-	if (!useOpus) {
-		CELTCodec *switchto = nullptr;
-		if ((!Global::get().uiSession || (Global::get().s.lmLoopMode == Settings::Local))
-			&& (!Global::get().qmCodecs.isEmpty())) {
-			// Use latest for local loopback
-			QMap< int, CELTCodec * >::const_iterator i = Global::get().qmCodecs.constEnd();
-			--i;
-			switchto = i.value();
-		} else {
-			// Currently talking, don't switch unless you must.
-			if (cCodec && bPreviousVoice) {
-				int v = cCodec->bitstreamVersion();
-				if ((v == Global::get().iCodecAlpha) || (v == Global::get().iCodecBeta))
-					switchto = cCodec;
-			}
-		}
-		if (!switchto) {
-			switchto = Global::get().qmCodecs.value(Global::get().bPreferAlpha ? Global::get().iCodecAlpha
-																			   : Global::get().iCodecBeta);
-			if (!switchto)
-				switchto = Global::get().qmCodecs.value(Global::get().bPreferAlpha ? Global::get().iCodecBeta
-																				   : Global::get().iCodecAlpha);
-		}
-		if (switchto != cCodec) {
-			if (cCodec && ceEncoder) {
-				cCodec->celt_encoder_destroy(ceEncoder);
-				ceEncoder = nullptr;
-			}
-			cCodec = switchto;
-			if (cCodec)
-				ceEncoder = cCodec->encoderCreate();
-		}
+	// We only ever use Opus
+	MessageHandler::UDPMessageType previousType = umtType;
 
-		if (!cCodec)
-			return false;
-	}
+	assert(previousType == MessageHandler::UDPVoiceOpus);
 
-	MessageHandler::UDPMessageType previousType = umtType;
-	if (useOpus) {
-		umtType = MessageHandler::UDPVoiceOpus;
-	} else {
-		if (!Global::get().uiSession) {
-			umtType = MessageHandler::UDPVoiceCELTAlpha;
-		} else {
-			int v = cCodec->bitstreamVersion();
-			if (v == Global::get().iCodecAlpha)
-				umtType = MessageHandler::UDPVoiceCELTAlpha;
-			else if (v == Global::get().iCodecBeta)
-				umtType = MessageHandler::UDPVoiceCELTBeta;
-			else {
-				qWarning() << "Couldn't find message type for codec version" << v;
-			}
-		}
-	}
+	umtType = MessageHandler::UDPVoiceOpus;
 
 	if (umtType != previousType) {
 		iBufferedFrames = 0;
@@ -938,26 +868,6 @@ int AudioInput::encodeOpusFrame(short *source, int size, EncodingOutputBuffer &b
 #endif
 }
 
-int AudioInput::encodeCELTFrame(short *psSource, EncodingOutputBuffer &buffer) {
-	int len;
-	if (!cCodec)
-		return 0;
-
-	if (bResetEncoder) {
-		cCodec->celt_encoder_ctl(ceEncoder, CELT_RESET_STATE);
-		bResetEncoder = false;
-	}
-
-	cCodec->celt_encoder_ctl(ceEncoder, CELT_SET_PREDICTION(0));
-
-	cCodec->celt_encoder_ctl(ceEncoder, CELT_SET_VBR_RATE(iAudioQuality));
-	len      = cCodec->encode(ceEncoder, psSource, &buffer[0],
-                         qMin< int >(iAudioQuality / (8 * 100), static_cast< int >(buffer.size())));
-	iBitrate = len * 100 * 8;
-
-	return len;
-}
-
 void AudioInput::encodeAudioFrame(AudioChunk chunk) {
 	int iArg;
 	int i;
@@ -1184,43 +1094,36 @@ void AudioInput::encodeAudioFrame(AudioChunk chunk) {
 	if (!selectCodec())
 		return;
 
-	if (umtType == MessageHandler::UDPVoiceCELTAlpha || umtType == MessageHandler::UDPVoiceCELTBeta) {
-		len = encodeCELTFrame(psSource, buffer);
-		if (len <= 0) {
-			iBitrate = 0;
-			qWarning() << "encodeCELTFrame failed" << iBufferedFrames << iFrameSize << len;
-			return;
+	assert(umtType == MessageHandler::UDPVoiceOpus);
+
+	// Encode via Opus
+	encoded = false;
+	opusBuffer.insert(opusBuffer.end(), psSource, psSource + iFrameSize);
+	++iBufferedFrames;
+
+	if (!bIsSpeech || iBufferedFrames >= iAudioFrames) {
+		if (iBufferedFrames < iAudioFrames) {
+			// Stuff frame to framesize if speech ends and we don't have enough audio
+			// this way we are guaranteed to have a valid framecount and won't cause
+			// a codec configuration switch by suddenly using a wildly different
+			// framecount per packet.
+			const int missingFrames = iAudioFrames - iBufferedFrames;
+			opusBuffer.insert(opusBuffer.end(), iFrameSize * missingFrames, 0);
+			iBufferedFrames += missingFrames;
+			iFrameCounter += missingFrames;
 		}
-		++iBufferedFrames;
-	} else if (umtType == MessageHandler::UDPVoiceOpus) {
-		encoded = false;
-		opusBuffer.insert(opusBuffer.end(), psSource, psSource + iFrameSize);
-		++iBufferedFrames;
-
-		if (!bIsSpeech || iBufferedFrames >= iAudioFrames) {
-			if (iBufferedFrames < iAudioFrames) {
-				// Stuff frame to framesize if speech ends and we don't have enough audio
-				// this way we are guaranteed to have a valid framecount and won't cause
-				// a codec configuration switch by suddenly using a wildly different
-				// framecount per packet.
-				const int missingFrames = iAudioFrames - iBufferedFrames;
-				opusBuffer.insert(opusBuffer.end(), iFrameSize * missingFrames, 0);
-				iBufferedFrames += missingFrames;
-				iFrameCounter += missingFrames;
-			}
 
-			Q_ASSERT(iBufferedFrames == iAudioFrames);
+		Q_ASSERT(iBufferedFrames == iAudioFrames);
 
-			len = encodeOpusFrame(&opusBuffer[0], iBufferedFrames * iFrameSize, buffer);
-			opusBuffer.clear();
-			if (len <= 0) {
-				iBitrate = 0;
-				qWarning() << "encodeOpusFrame failed" << iBufferedFrames << iFrameSize << len;
-				iBufferedFrames = 0; // These are lost. Make sure not to mess up our sequence counter next flushCheck.
-				return;
-			}
-			encoded = true;
+		len = encodeOpusFrame(&opusBuffer[0], iBufferedFrames * iFrameSize, buffer);
+		opusBuffer.clear();
+		if (len <= 0) {
+			iBitrate = 0;
+			qWarning() << "encodeOpusFrame failed" << iBufferedFrames << iFrameSize << len;
+			iBufferedFrames = 0; // These are lost. Make sure not to mess up our sequence counter next flushCheck.
+			return;
 		}
+		encoded = true;
 	}
 
 	if (encoded) {
@@ -1286,28 +1189,12 @@ void AudioInput::flushCheck(const QByteArray &frame, bool terminator, int voiceT
 	// Sequence number
 	pds << iFrameCounter - frames;
 
-	if (umtType == MessageHandler::UDPVoiceOpus) {
-		const QByteArray &qba = qlFrames.takeFirst();
-		int size              = qba.size();
-		if (terminator)
-			size |= 1 << 13;
-		pds << size;
-		pds.append(qba.constData(), qba.size());
-	} else {
-		if (terminator) {
-			qlFrames << QByteArray();
-			++frames;
-		}
-
-		for (int i = 0; i < frames; ++i) {
-			const QByteArray &qba = qlFrames.takeFirst();
-			unsigned char head    = static_cast< unsigned char >(qba.size());
-			if (i < frames - 1)
-				head |= 0x80;
-			pds.append(head);
-			pds.append(qba.constData(), qba.size());
-		}
-	}
+	const QByteArray &qba = qlFrames.takeFirst();
+	int size              = qba.size();
+	if (terminator)
+		size |= 1 << 13;
+	pds << size;
+	pds.append(qba.constData(), qba.size());
 
 	if (Global::get().s.bTransmitPosition && Global::get().pluginManager && !Global::get().bCenterPosition
 		&& Global::get().pluginManager->fetchPositionalData()) {
@@ -1318,6 +1205,10 @@ void AudioInput::flushCheck(const QByteArray &frame, bool terminator, int voiceT
 		pds << currentPos.z;
 	}
 
+	assert(umtType == );
+	// In Opus mode we only expect a single frame per packet
+	assert(qlFrames.size() == 1);
+
 	sendAudioFrame(data, pds);
 
 	Q_ASSERT(qlFrames.isEmpty());
diff --git a/src/mumble/AudioInput.h b/src/mumble/AudioInput.h
index 4cb6fd53c..9edcc168b 100644
--- a/src/mumble/AudioInput.h
+++ b/src/mumble/AudioInput.h
@@ -7,18 +7,20 @@
 #define MUMBLE_MUMBLE_AUDIOINPUT_H_
 
 #include <QElapsedTimer>
-#include <QtCore/QObject>
-#include <QtCore/QThread>
+#include <QObject>
+#include <QThread>
+
 #include <boost/array.hpp>
 #include <boost/shared_ptr.hpp>
+
 #include <fstream>
 #include <list>
 #include <mutex>
-#include <speex/speex.h>
+#include <vector>
+
 #include <speex/speex_echo.h>
 #include <speex/speex_preprocess.h>
 #include <speex/speex_resampler.h>
-#include <vector>
 
 #include "Audio.h"
 #include "EchoCancelOption.h"
@@ -27,9 +29,7 @@
 #include "Timer.h"
 
 class AudioInput;
-class CELTCodec;
 class OpusCodec;
-struct CELTEncoder;
 struct OpusEncoder;
 struct DenoiseState;
 typedef boost::shared_ptr< AudioInput > AudioInputPtr;
@@ -169,7 +169,6 @@ private:
 	Q_OBJECT
 	Q_DISABLE_COPY(AudioInput)
 protected:
-	typedef enum { CodecCELT, CodecSpeex } CodecFormat;
 	typedef enum { SampleShort, SampleFloat } SampleFormat;
 	typedef void (*inMixerFunc)(float *RESTRICT, const void *RESTRICT, unsigned int, unsigned int, quint64);
 
@@ -193,7 +192,6 @@ private:
 	typedef boost::array< unsigned char, 960 > EncodingOutputBuffer;
 
 	int encodeOpusFrame(short *source, int size, EncodingOutputBuffer &buffer);
-	int encodeCELTFrame(short *pSource, EncodingOutputBuffer &buffer);
 
 	QElapsedTimer qetLastMuteCue;
 
@@ -217,9 +215,6 @@ protected:
 	SpeexPreprocessState *sppPreprocess;
 	SpeexEchoState *sesEcho;
 
-	CELTCodec *cCodec;
-	CELTEncoder *ceEncoder;
-
 	/// bResetEncoder is a flag that notifies
 	/// our encoder functions that the encoder
 	/// needs to be reset.
diff --git a/src/mumble/AudioOutputSpeech.cpp b/src/mumble/AudioOutputSpeech.cpp
index 2903f57ad..ece3695f0 100644
--- a/src/mumble/AudioOutputSpeech.cpp
+++ b/src/mumble/AudioOutputSpeech.cpp
@@ -6,9 +6,8 @@
 #include "AudioOutputSpeech.h"
 
 #include "Audio.h"
-#include "CELTCodec.h"
 #ifdef USE_OPUS
-#	include "OpusCodec.h"
+#include "OpusCodec.h"
 #endif
 #include "ClientUser.h"
 #include "PacketDataStream.h"
@@ -26,9 +25,6 @@ AudioOutputSpeech::AudioOutputSpeech(ClientUser *user, unsigned int freq, Messag
 	umtType    = type;
 	iMixerFreq = freq;
 
-	cCodec    = nullptr;
-	cdDecoder = nullptr;
-	dsSpeex   = nullptr;
 	oCodec    = nullptr;
 	opusState = nullptr;
 
@@ -46,27 +42,16 @@ AudioOutputSpeech::AudioOutputSpeech(ClientUser *user, unsigned int freq, Messag
 	// sample rate / 100 means 10ms mono audio data per frame.
 	iFrameSizePerChannel = iFrameSize = iSampleRate / 100; // for mono stream
 
-	if (umtType == MessageHandler::UDPVoiceOpus) {
-#ifdef USE_OPUS
-		// Always pretend Stereo mode is true by default. since opus will convert mono stream to stereo stream.
-		// https://tools.ietf.org/html/rfc6716#section-2.1.2
-		bStereo = true;
-		oCodec  = Global::get().oCodec;
-		if (oCodec) {
-			opusState = oCodec->opus_decoder_create(iSampleRate, bStereo ? 2 : 1, nullptr);
-			oCodec->opus_decoder_ctl(
-				opusState, OPUS_SET_PHASE_INVERSION_DISABLED(1)); // Disable phase inversion for better mono downmix.
-		}
-#endif
-	} else if (umtType == MessageHandler::UDPVoiceSpeex) {
-		speex_bits_init(&sbBits);
-
-		dsSpeex  = speex_decoder_init(speex_lib_get_mode(SPEEX_MODEID_UWB));
-		int iArg = 1;
-		speex_decoder_ctl(dsSpeex, SPEEX_SET_ENH, &iArg);
-		speex_decoder_ctl(dsSpeex, SPEEX_GET_FRAME_SIZE, &iFrameSize);
-		speex_decoder_ctl(dsSpeex, SPEEX_GET_SAMPLING_RATE, &iSampleRate);
-		iAudioBufferSize = iFrameSize;
+	assert(umtType == MessageHandler::UDPVoiceOpus);
+
+	// Always pretend Stereo mode is true by default. since opus will convert mono stream to stereo stream.
+	// https://tools.ietf.org/html/rfc6716#section-2.1.2
+	bStereo = true;
+	oCodec  = Global::get().oCodec;
+	if (oCodec) {
+		opusState = oCodec->opus_decoder_create(iSampleRate, bStereo ? 2 : 1, nullptr);
+		oCodec->opus_decoder_ctl(
+			opusState, OPUS_SET_PHASE_INVERSION_DISABLED(1)); // Disable phase inversion for better mono downmix.
 	}
 
 	// iAudioBufferSize: size (in unit of float) of the buffer used to store decoded pcm data.
@@ -127,16 +112,8 @@ AudioOutputSpeech::AudioOutputSpeech(ClientUser *user, unsigned int freq, Messag
 }
 
 AudioOutputSpeech::~AudioOutputSpeech() {
-#ifdef USE_OPUS
 	if (opusState)
 		oCodec->opus_decoder_destroy(opusState);
-#endif
-	if (cdDecoder) {
-		cCodec->celt_decoder_destroy(cdDecoder);
-	} else if (dsSpeex) {
-		speex_bits_destroy(&sbBits);
-		speex_decoder_destroy(dsSpeex);
-	}
 
 	if (srs)
 		speex_resampler_destroy(srs);
@@ -166,44 +143,31 @@ void AudioOutputSpeech::addFrameToBuffer(const QByteArray &qbaPacket, unsigned i
 	pds.next();
 
 	int samples = 0;
-	if (umtType == MessageHandler::UDPVoiceOpus) {
-		int size;
-		pds >> size;
-		size &= 0x1fff;
-		if (size == 0) {
-			return;
-		}
+	assert(umtType == MessageHandler::UDPVoiceOpus);
 
-		const QByteArray &qba = pds.dataBlock(size);
-		if (size != qba.size() || !pds.isValid()) {
-			return;
-		}
-
-		const unsigned char *packet = reinterpret_cast< const unsigned char * >(qba.constData());
+	int size;
+	pds >> size;
+	size &= 0x1fff;
+	if (size == 0) {
+		return;
+	}
 
-#ifdef USE_OPUS
-		if (oCodec) {
-			samples = oCodec->opus_decoder_get_nb_samples(opusState, packet,
-														  size); // this function return samples per channel
-			samples *= 2;                                        // since we assume all input stream is stereo.
-		}
-#else
+	const QByteArray &qba = pds.dataBlock(size);
+	if (size != qba.size() || !pds.isValid()) {
 		return;
-#endif
+	}
+
+	const unsigned char *packet = reinterpret_cast< const unsigned char * >(qba.constData());
 
-		// We can't handle frames which are not a multiple of 10ms.
-		Q_ASSERT(samples % iFrameSize == 0);
-	} else {
-		// If packet not in opus format
-		unsigned int header = 0;
-
-		do {
-			header = static_cast< unsigned char >(pds.next());
-			samples += iFrameSize;
-			pds.skip(header & 0x7f);
-		} while ((header & 0x80) && pds.isValid());
+	if (oCodec) {
+		samples = oCodec->opus_decoder_get_nb_samples(opusState, packet,
+													  size); // this function return samples per channel
+		samples *= 2;                                        // since we assume all input stream is stereo.
 	}
 
+	// We can't handle frames which are not a multiple of 10ms.
+	Q_ASSERT(samples % iFrameSize == 0);
+
 	if (pds.isValid()) {
 		JitterBufferPacket jbp;
 		jbp.data      = const_cast< char * >(qbaPacket.constData());
@@ -286,24 +250,15 @@ bool AudioOutputSpeech::prepareSampleBuffer(unsigned int frameCount) {
 					ucFlags    = static_cast< unsigned char >(pds.next());
 
 					bHasTerminator = false;
-					if (umtType == MessageHandler::UDPVoiceOpus) {
-						int size;
-						pds >> size;
-
-						bHasTerminator = size & 0x2000;
-						qlFrames << pds.dataBlock(size & 0x1fff);
-						// if using opus, there will be at most only one element in qlFrames
-						// Q_ASSERT(qlFrames.size() == 1);
-					} else {
-						unsigned int header = 0;
-						do {
-							header = static_cast< unsigned int >(pds.next());
-							if (header)
-								qlFrames << pds.dataBlock(header & 0x7f);
-							else
-								bHasTerminator = true;
-						} while ((header & 0x80) && pds.isValid());
-					}
+					int size;
+					pds >> size;
+
+					assert(umtType == MessageHandler::UDPVoiceOpus);
+
+					bHasTerminator = size & 0x2000;
+					qlFrames << pds.dataBlock(size & 0x1fff);
+					// if using opus, there will be at most only one element in qlFrames
+					// Q_ASSERT(qlFrames.size() == 1);
 
 					if (pds.left()) {
 						pds >> fPos[0];
@@ -334,72 +289,33 @@ bool AudioOutputSpeech::prepareSampleBuffer(unsigned int frameCount) {
 			if (!qlFrames.isEmpty()) {
 				QByteArray qba = qlFrames.takeFirst();
 
-				if (umtType == MessageHandler::UDPVoiceCELTAlpha || umtType == MessageHandler::UDPVoiceCELTBeta) {
-					int wantversion = (umtType == MessageHandler::UDPVoiceCELTAlpha) ? Global::get().iCodecAlpha
-																					 : Global::get().iCodecBeta;
-					if ((p == &LoopUser::lpLoopy) && (!Global::get().qmCodecs.isEmpty())) {
-						QMap< int, CELTCodec * >::const_iterator i = Global::get().qmCodecs.constEnd();
-						--i;
-						wantversion = i.key();
-					}
-					if (cCodec && (cCodec->bitstreamVersion() != wantversion)) {
-						cCodec->celt_decoder_destroy(cdDecoder);
-						cdDecoder = nullptr;
-					}
-					if (!cCodec) {
-						cCodec = Global::get().qmCodecs.value(wantversion);
-						if (cCodec) {
-							cdDecoder = cCodec->decoderCreate();
-						}
+				assert(umtType == MessageHandler::UDPVoiceOpus);
+
+				if (oCodec) {
+					if (qba.isEmpty() || !(p && p->bLocalMute)) {
+						// If qba is empty, we have to let Opus know about the packet loss
+						// Otherwise if the associated user is not locally muted, we want to decode the audio packet
+						// normally in order to be able to play it.
+						decodedSamples = oCodec->opus_decode_float(
+							opusState,
+							qba.isEmpty() ? nullptr : reinterpret_cast< const unsigned char * >(qba.constData()),
+							qba.size(), pOut, iAudioBufferSize, 0);
+					} else {
+						// If the packet is non-empty, but the associated user is locally muted,
+						// we don't have to decode the packet. Instead it is enough to know how many
+						// samples it contained so that we can then mute the appropriate output length
+						decodedSamples = oCodec->opus_packet_get_samples_per_frame(
+							reinterpret_cast< const unsigned char * >(qba.constData()), SAMPLE_RATE);
 					}
-					if (cdDecoder)
-						cCodec->decode_float(cdDecoder,
-											 qba.isEmpty() ? nullptr
-														   : reinterpret_cast< const unsigned char * >(qba.constData()),
-											 qba.size(), pOut);
-					else
-						memset(pOut, 0, sizeof(float) * iFrameSize);
-				} else if (umtType == MessageHandler::UDPVoiceOpus) {
-#ifdef USE_OPUS
-					if (oCodec) {
-						if (qba.isEmpty() || !(p && p->bLocalMute)) {
-							// If qba is empty, we have to let Opus know about the packet loss
-							// Otherwise if the associated user is not locally muted, we want to decode the audio packet
-							// normally in order to be able to play it.
-							decodedSamples = oCodec->opus_decode_float(
-								opusState,
-								qba.isEmpty() ? nullptr : reinterpret_cast< const unsigned char * >(qba.constData()),
-								qba.size(), pOut, iAudioBufferSize, 0);
-						} else {
-							// If the packet is non-empty, but the associated user is locally muted,
-							// we don't have to decode the packet. Instead it is enough to know how many
-							// samples it contained so that we can then mute the appropriate output length
-							decodedSamples = oCodec->opus_packet_get_samples_per_frame(
-								reinterpret_cast< const unsigned char * >(qba.constData()), SAMPLE_RATE);
-						}
 
-						// The returned sample count we get from the Opus functions refer to samples per channel.
-						// Thus in order to get the total amount, we have to multiply by the channel count.
-						decodedSamples *= channels;
-					}
+					// The returned sample count we get from the Opus functions refer to samples per channel.
+					// Thus in order to get the total amount, we have to multiply by the channel count.
+					decodedSamples *= channels;
+				}
 
-					if (decodedSamples < 0) {
-						decodedSamples = iFrameSize;
-						memset(pOut, 0, iFrameSize * sizeof(float));
-					}
-#endif
-				} else if (umtType == MessageHandler::UDPVoiceSpeex) {
-					if (qba.isEmpty()) {
-						speex_decode(dsSpeex, nullptr, pOut);
-					} else {
-						speex_bits_read_from(&sbBits, qba.data(), qba.size());
-						speex_decode(dsSpeex, &sbBits, pOut);
-					}
-					for (unsigned int i = 0; i < iFrameSize; ++i)
-						pOut[i] *= (1.0f / 32767.f);
-				} else {
-					qWarning("AudioOutputSpeech: encountered unknown message type %li in prepareSampleBuffer().",
-							 static_cast< long >(umtType));
+				if (decodedSamples < 0) {
+					decodedSamples = iFrameSize;
+					memset(pOut, 0, iFrameSize * sizeof(float));
 				}
 
 				bool update = true;
@@ -433,27 +349,15 @@ bool AudioOutputSpeech::prepareSampleBuffer(unsigned int frameCount) {
 				if (qlFrames.isEmpty() && bHasTerminator)
 					nextalive = false;
 			} else {
-				if (umtType == MessageHandler::UDPVoiceCELTAlpha || umtType == MessageHandler::UDPVoiceCELTBeta) {
-					if (cdDecoder)
-						cCodec->decode_float(cdDecoder, nullptr, 0, pOut);
-					else
-						memset(pOut, 0, sizeof(float) * iFrameSize);
-				} else if (umtType == MessageHandler::UDPVoiceOpus) {
-#ifdef USE_OPUS
-					if (oCodec) {
-						decodedSamples = oCodec->opus_decode_float(opusState, nullptr, 0, pOut, iFrameSize, 0);
-						decodedSamples *= channels;
-					}
+				assert(umtType == MessageHandler::UDPVoiceOpus);
+				if (oCodec) {
+					decodedSamples = oCodec->opus_decode_float(opusState, nullptr, 0, pOut, iFrameSize, 0);
+					decodedSamples *= channels;
+				}
 
-					if (decodedSamples < 0) {
-						decodedSamples = iFrameSize;
-						memset(pOut, 0, iFrameSize * sizeof(float));
-					}
-#endif
-				} else {
-					speex_decode(dsSpeex, nullptr, pOut);
-					for (unsigned int i = 0; i < iFrameSize; ++i)
-						pOut[i] *= (1.0f / 32767.f);
+				if (decodedSamples < 0) {
+					decodedSamples = iFrameSize;
+					memset(pOut, 0, iFrameSize * sizeof(float));
 				}
 			}
 
diff --git a/src/mumble/AudioOutputSpeech.h b/src/mumble/AudioOutputSpeech.h
index b9eb4cc1e..2de12c02f 100644
--- a/src/mumble/AudioOutputSpeech.h
+++ b/src/mumble/AudioOutputSpeech.h
@@ -6,8 +6,6 @@
 #ifndef MUMBLE_MUMBLE_AUDIOOUTPUTSPEECH_H_
 #define MUMBLE_MUMBLE_AUDIOOUTPUTSPEECH_H_
 
-#include <celt.h>
-#include <speex/speex.h>
 #include <speex/speex_jitter.h>
 #include <speex/speex_resampler.h>
 
@@ -16,7 +14,6 @@
 #include "AudioOutputUser.h"
 #include "Message.h"
 
-class CELTCodec;
 class OpusCodec;
 class ClientUser;
 struct OpusDecoder;
@@ -48,15 +45,9 @@ protected:
 	JitterBuffer *jbJitter;
 	int iMissCount;
 
-	CELTCodec *cCodec;
-	CELTDecoder *cdDecoder;
-
 	OpusCodec *oCodec;
 	OpusDecoder *opusState;
 
-	SpeexBits sbBits;
-	void *dsSpeex;
-
 	QList< QByteArray > qlFrames;
 
 public:
diff --git a/src/mumble/CELTCodec.cpp b/src/mumble/CELTCodec.cpp
deleted file mode 100644
index ca71be1d0..000000000
--- a/src/mumble/CELTCodec.cpp
+++ /dev/null
@@ -1,159 +0,0 @@
-// Copyright 2012-2021 The Mumble Developers. All rights reserved.
-// Use of this source code is governed by a BSD-style license
-// that can be found in the LICENSE file at the root of the
-// Mumble source tree or at <https://www.mumble.info/LICENSE>.
-
-#include "CELTCodec.h"
-
-#include "Audio.h"
-#include "MumbleApplication.h"
-#include "Version.h"
-
-#ifdef Q_CC_GNU
-#	define RESOLVE(var)                                                        \
-		{                                                                       \
-			var    = reinterpret_cast< __typeof__(var) >(qlCELT.resolve(#var)); \
-			bValid = bValid && var;                                             \
-		}
-#else
-#	define RESOLVE(var)                                                                      \
-		{                                                                                     \
-			*reinterpret_cast< void ** >(&var) = static_cast< void * >(qlCELT.resolve(#var)); \
-			bValid                             = bValid && var;                               \
-		}
-#endif
-
-#ifdef Q_OS_WIN
-extern "C" {
-void __cpuid(int a[4], int b);
-};
-#endif
-
-CELTCodec::CELTCodec(const QString &celt_version) {
-	bValid            = false;
-	cmMode            = nullptr;
-	qsVersion         = celt_version;
-	iBitstreamVersion = INT_MIN;
-	qlCELT.setLoadHints(QLibrary::ResolveAllSymbolsHint);
-
-	QStringList alternatives;
-#if defined(Q_OS_MAC)
-	alternatives << QString::fromLatin1("libcelt0.%1.dylib").arg(celt_version);
-	alternatives << QString::fromLatin1("celt0.%1.dylib").arg(celt_version);
-	alternatives << QString::fromLatin1("libcelt.%1.dylib").arg(celt_version);
-	alternatives << QString::fromLatin1("celt.%1.dylib").arg(celt_version);
-#elif defined(Q_OS_UNIX)
-	alternatives << QString::fromLatin1("libcelt0.so.%1").arg(celt_version);
-	alternatives << QString::fromLatin1("libcelt.so.%1").arg(celt_version);
-	alternatives << QString::fromLatin1("celt.so.%1").arg(celt_version);
-#else
-	int cpuinfo[4];
-	__cpuid(cpuinfo, 1);
-	if (cpuinfo[3] & 0x02000000) {
-		if (cpuinfo[3] & 0x04000000) {
-			if (cpuinfo[2] & 0x00000001) {
-				alternatives << QString::fromLatin1("celt0.%1.sse3.dll").arg(celt_version);
-			}
-			alternatives << QString::fromLatin1("celt0.%1.sse2.dll").arg(celt_version);
-		}
-		alternatives << QString::fromLatin1("celt0.%1.sse.dll").arg(celt_version);
-	}
-
-	alternatives << QString::fromLatin1("celt0.%1.dll").arg(celt_version);
-#endif
-	foreach (const QString &lib, alternatives) {
-		qlCELT.setFileName(MumbleApplication::instance()->applicationVersionRootPath() + QLatin1String("/") + lib);
-		if (qlCELT.load()) {
-			bValid = true;
-			break;
-		}
-
-#ifdef Q_OS_MAC
-		qlCELT.setFileName(QApplication::instance()->applicationDirPath() + QLatin1String("/../Codecs/") + lib);
-		if (qlCELT.load()) {
-			bValid = true;
-			break;
-		}
-#endif
-
-#ifdef MUMBLE_LIBRARY_PATH
-		qlCELT.setFileName(QLatin1String(MUMTEXT(MUMBLE_LIBRARY_PATH) "/") + lib);
-		if (qlCELT.load()) {
-			bValid = true;
-			break;
-		}
-#endif
-
-		qlCELT.setFileName(lib);
-		if (qlCELT.load()) {
-			bValid = true;
-			break;
-		}
-	}
-
-	RESOLVE(celt_mode_destroy);
-	RESOLVE(celt_mode_info);
-
-	RESOLVE(celt_encoder_destroy);
-	RESOLVE(celt_encoder_ctl);
-
-	RESOLVE(celt_decoder_destroy);
-	RESOLVE(celt_decoder_ctl);
-}
-
-CELTCodec::~CELTCodec() {
-	if (cmMode)
-		celt_mode_destroy(const_cast< CELTMode * >(cmMode));
-}
-
-bool CELTCodec::isValid() const {
-	return bValid;
-}
-
-int CELTCodec::bitstreamVersion() const {
-	if (cmMode && iBitstreamVersion == INT_MIN)
-		celt_mode_info(cmMode, CELT_GET_BITSTREAM_VERSION, reinterpret_cast< celt_int32 * >(&iBitstreamVersion));
-
-	return iBitstreamVersion;
-}
-
-QString CELTCodec::version() const {
-	return qsVersion;
-}
-
-void CELTCodec::report() const {
-	qWarning("CELT bitstream %08x from %s", bitstreamVersion(), qPrintable(qlCELT.fileName()));
-}
-
-CELTCodec070::CELTCodec070(const QString &celt_version) : CELTCodec(celt_version) {
-	RESOLVE(celt_mode_create);
-	RESOLVE(celt_encoder_create);
-	RESOLVE(celt_decoder_create);
-	RESOLVE(celt_encode_float);
-	RESOLVE(celt_encode);
-	RESOLVE(celt_decode_float);
-	RESOLVE(celt_decode);
-	RESOLVE(celt_strerror);
-
-	if (bValid) {
-		cmMode = celt_mode_create(SAMPLE_RATE, SAMPLE_RATE / 100, nullptr);
-	}
-}
-
-CELTEncoder *CELTCodec070::encoderCreate() {
-	return celt_encoder_create(cmMode, 1, nullptr);
-}
-
-CELTDecoder *CELTCodec070::decoderCreate() {
-	return celt_decoder_create(cmMode, 1, nullptr);
-}
-
-int CELTCodec070::encode(CELTEncoder *st, const celt_int16 *pcm, unsigned char *compressed, int nbCompressedBytes) {
-	return celt_encode(st, pcm, nullptr, compressed, nbCompressedBytes);
-}
-
-int CELTCodec070::decode_float(CELTDecoder *st, const unsigned char *data, int len, float *pcm) {
-	return celt_decode_float(st, data, len, pcm);
-}
-
-#undef RESOLVE
diff --git a/src/mumble/CELTCodec.h b/src/mumble/CELTCodec.h
deleted file mode 100644
index 8cf53116c..000000000
--- a/src/mumble/CELTCodec.h
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2012-2021 The Mumble Developers. All rights reserved.
-// Use of this source code is governed by a BSD-style license
-// that can be found in the LICENSE file at the root of the
-// Mumble source tree or at <https://www.mumble.info/LICENSE>.
-
-#ifndef MUMBLE_MUMBLE_CELTCODEC_H_
-#define MUMBLE_MUMBLE_CELTCODEC_H_
-
-#include <celt.h>
-
-#include <QtCore/QLibrary>
-#include <QtCore/QString>
-
-#ifndef Q_OS_WIN
-#	define __cdecl
-#endif
-
-class CELTCodec {
-private:
-	Q_DISABLE_COPY(CELTCodec)
-protected:
-	const CELTMode *cmMode;
-	QString qsVersion;
-	QLibrary qlCELT;
-	bool bValid;
-	mutable int iBitstreamVersion;
-
-	void (*celt_mode_destroy)(CELTMode *mode);
-	int(__cdecl *celt_mode_info)(const CELTMode *mode, int request, celt_int32 *value);
-
-public:
-	void(__cdecl *celt_encoder_destroy)(CELTEncoder *st);
-	int(__cdecl *celt_encoder_ctl)(CELTEncoder *st, int request, ...);
-
-	void(__cdecl *celt_decoder_destroy)(CELTDecoder *st);
-	int(__cdecl *celt_decoder_ctl)(CELTDecoder *st, int request, ...);
-
-	CELTCodec(const QString &celt_version);
-	virtual ~CELTCodec();
-	bool isValid() const;
-	int bitstreamVersion() const;
-	QString version() const;
-
-	virtual void report() const;
-
-	virtual CELTEncoder *encoderCreate()                                                                         = 0;
-	virtual CELTDecoder *decoderCreate()                                                                         = 0;
-	virtual int encode(CELTEncoder *st, const celt_int16 *pcm, unsigned char *compressed, int nbCompressedBytes) = 0;
-	virtual int decode_float(CELTDecoder *st, const unsigned char *data, int len, float *pcm)                    = 0;
-};
-
-class CELTCodec070 : public CELTCodec {
-protected:
-	CELTMode *(*celt_mode_create)(celt_int32 Fs, int frame_size, int *error);
-	CELTEncoder *(__cdecl *celt_encoder_create)(const CELTMode *mode, int channels, int *error);
-	CELTDecoder *(__cdecl *celt_decoder_create)(const CELTMode *mode, int channels, int *error);
-	int(__cdecl *celt_encode_float)(CELTEncoder *st, const float *pcm, float *optional_synthesis,
-									unsigned char *compressed, int nbCompressedBytes);
-	int(__cdecl *celt_encode)(CELTEncoder *st, const celt_int16 *pcm, celt_int16 *optional_synthesis,
-							  unsigned char *compressed, int nbCompressedBytes);
-	int(__cdecl *celt_decode_float)(CELTDecoder *st, const unsigned char *data, int len, float *pcm);
-	int(__cdecl *celt_decode)(CELTDecoder *st, const unsigned char *data, int len, celt_int16 *pcm);
-	const char *(__cdecl *celt_strerror)(int error);
-
-public:
-	CELTCodec070(const QString &celt_version);
-	CELTEncoder *encoderCreate() Q_DECL_OVERRIDE;
-	CELTDecoder *decoderCreate() Q_DECL_OVERRIDE;
-	int encode(CELTEncoder *st, const celt_int16 *pcm, unsigned char *compressed,
-			   int nbCompressedBytes) Q_DECL_OVERRIDE;
-	int decode_float(CELTDecoder *st, const unsigned char *data, int len, float *pcm) Q_DECL_OVERRIDE;
-};
-
-class CELTCodecSBCELT : public CELTCodec {
-protected:
-	const CELTMode *cmSBCELTMode;
-
-public:
-	CELTCodecSBCELT();
-	CELTEncoder *encoderCreate() Q_DECL_OVERRIDE;
-	CELTDecoder *decoderCreate() Q_DECL_OVERRIDE;
-	int encode(CELTEncoder *st, const celt_int16 *pcm, unsigned char *compressed,
-			   int nbCompressedBytes) Q_DECL_OVERRIDE;
-	int decode_float(CELTDecoder *st, const unsigned char *data, int len, float *pcm) Q_DECL_OVERRIDE;
-};
-
-#endif // CELTCODEC_H_
diff --git a/src/mumble/CMakeLists.txt b/src/mumble/CMakeLists.txt
index fbeb75dd8..1686db08e 100644
--- a/src/mumble/CMakeLists.txt
+++ b/src/mumble/CMakeLists.txt
@@ -23,7 +23,6 @@ option(translations "Include languages other than English." ON)
 option(bundle-qt-translations "Bundle Qt's translations as well" ${static}) 
 
 option(bundled-opus "Build the included version of Opus instead of looking for one on the system." ON)
-option(bundled-celt "Build the included version of CELT instead of looking for one on the system." ON)
 option(bundled-speex "Build the included version of Speex instead of looking for one on the system." ON)
 option(rnnoise "Use RNNoise for machine learning noise reduction." ON)
 option(bundled-rnnoise "Build the included version of RNNoise instead of looking for one on the system." ${rnnoise})
@@ -113,8 +112,6 @@ set(MUMBLE_SOURCES
 	"BanEditor.cpp"
 	"BanEditor.h"
 	"BanEditor.ui"
-	"CELTCodec.cpp"
-	"CELTCodec.h"
 	"Cert.cpp"
 	"Cert.h"
 	"Cert.ui"
@@ -656,58 +653,28 @@ else()
 	target_include_directories(mumble PRIVATE ${opus_INCLUDE_DIRS})
 endif()
 
-if(bundled-celt)
-	add_subdirectory("${3RDPARTY_DIR}/celt-0.7.0-build" "${CMAKE_CURRENT_BINARY_DIR}/celt")
-
-	# Disable all warnings that the Celt code may emit
-	disable_warnings_for_all_targets_in("${3RDPARTY_DIR}/celt-0.7.0-build")
-
-	add_dependencies(mumble celt)
-
-	target_include_directories(mumble PRIVATE "${3RDPARTY_DIR}/celt-0.7.0-src/libcelt")
-
-	if(WIN32)
-		# Shared library on Windows (e.g. ".dll")
-		set_target_properties(celt PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
-	else()
-		# Shared library on UNIX (e.g. ".so")
-		set_target_properties(celt PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
-	endif()
-
-	install_library(celt mumble_client)
-else()
-	find_pkg(celt REQUIRED)
-	if(${celt_VERSION} VERSION_LESS          0.7 OR
-	   ${celt_VERSION} VERSION_GREATER_EQUAL 0.8)
-		message(FATAL_ERROR "CELT 0.7.x is required, found ${celt_VERSION}!")
-	endif()
-	target_include_directories(mumble PRIVATE ${celt_INCLUDE_DIRS})
-endif()
-
 if(bundled-speex)
-	add_subdirectory("${3RDPARTY_DIR}/speex-build" "${CMAKE_CURRENT_BINARY_DIR}/speex")
+	add_subdirectory("${3RDPARTY_DIR}/speexdsp-build" "${CMAKE_CURRENT_BINARY_DIR}/speexdsp")
 
-	# Disable all warnings that the speex code may emit
-	disable_warnings_for_all_targets_in("${3RDPARTY_DIR}/speex-build")
+	# Disable all warnings that the speexdsp code may emit
+	disable_warnings_for_all_targets_in("${3RDPARTY_DIR}/speexdsp-build")
 
-	target_link_libraries(mumble PRIVATE speex)
+	target_link_libraries(mumble PRIVATE speexdsp)
 
 	if(WIN32)
 		# Shared library on Windows (e.g. ".dll")
-		set_target_properties(speex PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
+		set_target_properties(speexdsp PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
 	else()
 		# Shared library on UNIX (e.g. ".so")
-		set_target_properties(speex PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
+		set_target_properties(speexdsp PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
 	endif()
 
-	install_library(speex mumble_client)
+	install_library(speexdsp mumble_client)
 else()
-	find_pkg(speex REQUIRED)
 	find_pkg(speexdsp REQUIRED)
 
 	target_link_libraries(mumble
 		PRIVATE
-			${speex_LIBRARIES}
 			${speexdsp_LIBRARIES}
 	)
 endif()
diff --git a/src/mumble/Global.cpp b/src/mumble/Global.cpp
index dfbd8ef4f..c0b3e46e0 100644
--- a/src/mumble/Global.cpp
+++ b/src/mumble/Global.cpp
@@ -90,14 +90,7 @@ Global::Global(const QString &qsConfigPath) {
 	iAudioBandwidth = -1;
 	iMaxBandwidth   = -1;
 
-	iCodecAlpha  = 0;
-	iCodecBeta   = 0;
-	bPreferAlpha = true;
-#ifdef USE_OPUS
 	bOpus = true;
-#else
-	bOpus = false;
-#endif
 
 	bAttenuateOthers              = false;
 	prioritySpeakerActiveOverride = false;
diff --git a/src/mumble/Global.h b/src/mumble/Global.h
index 773ec62de..d05848597 100644
--- a/src/mumble/Global.h
+++ b/src/mumble/Global.h
@@ -31,7 +31,6 @@ class Overlay;
 class LCD;
 class Zeroconf;
 class OverlayClient;
-class CELTCodec;
 class OpusCodec;
 class LogEmitter;
 class DeveloperConsole;
@@ -93,10 +92,7 @@ public:
 	int iMaxBandwidth;
 	int iAudioBandwidth;
 	QDir qdBasePath;
-	QMap< int, CELTCodec * > qmCodecs;
 	OpusCodec *oCodec;
-	int iCodecAlpha, iCodecBeta;
-	bool bPreferAlpha;
 	bool bOpus;
 	bool bAttenuateOthers;
 	/// If set the AudioOutput::mix will forcefully adjust the volume of all
diff --git a/src/mumble/MainWindow.cpp b/src/mumble/MainWindow.cpp
index 8ffbb958d..3e3041a05 100644
--- a/src/mumble/MainWindow.cpp
+++ b/src/mumble/MainWindow.cpp
@@ -12,10 +12,7 @@
 #include "AudioStats.h"
 #include "AudioWizard.h"
 #include "BanEditor.h"
-#include "CELTCodec.h"
-#ifdef USE_OPUS
-#	include "OpusCodec.h"
-#endif
+#include "OpusCodec.h"
 #include "Cert.h"
 #include "Channel.h"
 #include "ConnectDialog.h"
@@ -3123,14 +3120,7 @@ void MainWindow::viewCertificate(bool) {
 void MainWindow::serverConnected() {
 	Global::get().uiSession    = 0;
 	Global::get().pPermissions = ChanACL::None;
-	Global::get().iCodecAlpha  = 0x8000000b;
-	Global::get().bPreferAlpha = true;
-#ifdef USE_OPUS
 	Global::get().bOpus = true;
-#else
-	Global::get().bOpus = false;
-#endif
-	Global::get().iCodecBeta = 0;
 
 #ifdef Q_OS_MAC
 	// Suppress AppNap while we're connected to a server.
diff --git a/src/mumble/Messages.cpp b/src/mumble/Messages.cpp
index d39a6cc5f..9597dfece 100644
--- a/src/mumble/Messages.cpp
+++ b/src/mumble/Messages.cpp
@@ -1212,60 +1212,15 @@ void MainWindow::msgPermissionQuery(const MumbleProto::PermissionQuery &msg) {
 	}
 }
 
-/// This message is being received in order for the server to instruct this client which version of the CELT
-/// codec it should use.
+/// This message is being received in order for the server to instruct this client which codec it should use.
 ///
 /// @param msg The message object
 void MainWindow::msgCodecVersion(const MumbleProto::CodecVersion &msg) {
-	int alpha = msg.has_alpha() ? msg.alpha() : -1;
-	int beta  = msg.has_beta() ? msg.beta() : -1;
-	bool pref = msg.prefer_alpha();
-
-#ifdef USE_OPUS
-	static bool warnedOpus = false;
-	Global::get().bOpus    = msg.opus();
-
-	if (!Global::get().oCodec && !warnedOpus) {
-		Global::get().l->log(Log::CriticalError,
-							 tr("Failed to load Opus, it will not be available for audio encoding/decoding."));
-		warnedOpus = true;
-	}
-#endif
-
-	// Workaround for broken 1.2.2 servers
-	if (Global::get().sh && Global::get().sh->uiVersion == Version::fromComponents(1, 2, 2) && alpha != -1
-		&& alpha == beta) {
-		if (pref)
-			beta = Global::get().iCodecBeta;
-		else
-			alpha = Global::get().iCodecAlpha;
-	}
-
-	if ((alpha != -1) && (alpha != Global::get().iCodecAlpha)) {
-		Global::get().iCodecAlpha = alpha;
-		if (pref && !Global::get().qmCodecs.contains(alpha))
-			pref = !pref;
-	}
-	if ((beta != -1) && (beta != Global::get().iCodecBeta)) {
-		Global::get().iCodecBeta = beta;
-		if (!pref && !Global::get().qmCodecs.contains(beta))
-			pref = !pref;
-	}
-	Global::get().bPreferAlpha = pref;
-
-	int willuse = pref ? Global::get().iCodecAlpha : Global::get().iCodecBeta;
+	if (!msg.opus()) {
+		Global::get().l->log(Log::CriticalError, tr("Server instructed us to use an audio codec different from Opus, "
+													"which is no longer supported. Disconnecting..."));
 
-	static bool warnedCELT = false;
-
-	if (!Global::get().qmCodecs.contains(willuse)) {
-		if (!warnedCELT) {
-			Global::get().l->log(Log::CriticalError,
-								 tr("Unable to find matching CELT codecs with other clients. You will not be "
-									"able to talk to all users."));
-			warnedCELT = true;
-		}
-	} else {
-		warnedCELT = false;
+		Global::get().sh->disconnect();
 	}
 }
 
diff --git a/src/mumble/ServerHandler.cpp b/src/mumble/ServerHandler.cpp
index a77f2abfa..58598e49e 100644
--- a/src/mumble/ServerHandler.cpp
+++ b/src/mumble/ServerHandler.cpp
@@ -268,6 +268,11 @@ void ServerHandler::handleVoicePacket(unsigned int msgFlags, PacketDataStream &p
 	unsigned int uiSession;
 	pds >> uiSession;
 	ClientUser *p     = ClientUser::get(uiSession);
+	if (type != MessageHandler::UDPVoiceOpus) {
+		qWarning("Dropping audio packet using invalid codec (not Opus): umtType %d", static_cast< int >(type));
+		return;
+	}
+
 	AudioOutputPtr ao = Global::get().ao;
 	if (ao && p && !(((msgFlags & 0x1f) == 2) && Global::get().s.bWhisperFriends && p->qsFriendName.isEmpty())) {
 		unsigned int iSeq;
@@ -790,14 +795,7 @@ void ServerHandler::serverConnectionConnected() {
 	foreach (const QString &qs, tokens)
 		mpa.add_tokens(u8(qs));
 
-	QMap< int, CELTCodec * >::const_iterator i;
-	for (i = Global::get().qmCodecs.constBegin(); i != Global::get().qmCodecs.constEnd(); ++i)
-		mpa.add_celt_versions(i.key());
-#ifdef USE_OPUS
 	mpa.set_opus(true);
-#else
-	mpa.set_opus(false);
-#endif
 	sendMessage(mpa);
 
 	{
diff --git a/src/mumble/ServerInformation.cpp b/src/mumble/ServerInformation.cpp
index 82a2e2107..3fa46f0dc 100644
--- a/src/mumble/ServerInformation.cpp
+++ b/src/mumble/ServerInformation.cpp
@@ -4,7 +4,6 @@
 // Mumble source tree or at <https://www.mumble.info/LICENSE>.
 
 #include "ServerInformation.h"
-#include "CELTCodec.h"
 #include "Connection.h"
 #include "MainWindow.h"
 #include "NetworkConfig.h"
@@ -77,15 +76,8 @@ void ServerInformation::updateServerInformation() {
 }
 
 static const QString currentCodec() {
-	if (Global::get().bOpus)
-		return QLatin1String("Opus");
-
-	int v         = Global::get().bPreferAlpha ? Global::get().iCodecAlpha : Global::get().iCodecBeta;
-	CELTCodec *cc = Global::get().qmCodecs.value(v);
-	if (cc)
-		return QString::fromLatin1("CELT %1").arg(cc->version());
-	else
-		return QString::fromLatin1("CELT %1").arg(QString::number(v, 16));
+	// We now always use Opus
+	return "Opus";
 }
 
 void ServerInformation::updateAudioBandwidth() {
diff --git a/src/mumble/Settings.cpp b/src/mumble/Settings.cpp
index 934cb604e..e1d12dd4f 100644
--- a/src/mumble/Settings.cpp
+++ b/src/mumble/Settings.cpp
@@ -481,7 +481,6 @@ Settings::Settings() {
 	iRecordingFormat = 0;
 
 	// Special configuration options not exposed to UI
-	bDisableCELT                = false;
 	disableConnectDialogEditing = false;
 	bPingServersDialogViewed    = false;
 
@@ -983,7 +982,6 @@ void Settings::load(QSettings *settings_ptr) {
 	LOAD(iRecordingFormat, "recording/format");
 
 	// Special configuration options not exposed to UI
-	LOAD(bDisableCELT, "audio/disablecelt");
 	LOAD(disableConnectDialogEditing, "ui/disableconnectdialogediting");
 	LOAD(bPingServersDialogViewed, "consent/pingserversdialogviewed");
 
@@ -1393,7 +1391,6 @@ void Settings::save() {
 	SAVE(iRecordingFormat, "recording/format");
 
 	// Special configuration options not exposed to UI
-	SAVE(bDisableCELT, "audio/disablecelt");
 	SAVE(disableConnectDialogEditing, "ui/disableconnectdialogediting");
 	SAVE(bPingServersDialogViewed, "consent/pingserversdialogviewed");
 
diff --git a/src/mumble/Settings.h b/src/mumble/Settings.h
index 94d88023b..96150f976 100644
--- a/src/mumble/Settings.h
+++ b/src/mumble/Settings.h
@@ -461,9 +461,6 @@ struct Settings {
 
 	// Special configuration options not exposed to UI
 
-	/// Codec kill-switch
-	bool bDisableCELT;
-
 	/// Removes the add and edit options in the connect dialog if set.
 	bool disableConnectDialogEditing;
 
diff --git a/src/mumble/UserInformation.cpp b/src/mumble/UserInformation.cpp
index 5eb9aa182..a65f55e66 100644
--- a/src/mumble/UserInformation.cpp
+++ b/src/mumble/UserInformation.cpp
@@ -6,7 +6,6 @@
 #include "UserInformation.h"
 
 #include "Audio.h"
-#include "CELTCodec.h"
 #include "HostAddress.h"
 #include "ProtoUtils.h"
 #include "QtUtils.h"
@@ -140,18 +139,6 @@ void UserInformation::update(const MumbleProto::UserStats &msg) {
 			qlVersionNote->show();
 		}
 	}
-	if (msg.celt_versions_size() > 0) {
-		QStringList qsl;
-		for (int i = 0; i < msg.celt_versions_size(); ++i) {
-			int v         = msg.celt_versions(i);
-			CELTCodec *cc = Global::get().qmCodecs.value(v);
-			if (cc)
-				qsl << cc->version();
-			else
-				qsl << QString::number(v, 16);
-		}
-		qlCELT->setText(qsl.join(tr(", ")));
-	}
 	if (msg.has_opus()) {
 		qlOpus->setText(msg.opus() ? tr("Supported") : tr("Not Supported"));
 	}
diff --git a/src/mumble/UserInformation.ui b/src/mumble/UserInformation.ui
index dbb0d53b9..e5b9a3c95 100644
--- a/src/mumble/UserInformation.ui
+++ b/src/mumble/UserInformation.ui
@@ -20,6 +20,13 @@
       <string>Connection Information</string>
      </property>
      <layout class="QGridLayout" name="gridLayout">
+      <item row="6" column="0">
+       <widget class="QLabel" name="qliOpus">
+        <property name="text">
+         <string notr="true">Opus</string>
+        </property>
+       </widget>
+      </item>
       <item row="4" column="1">
        <widget class="QLabel" name="qlCertificate">
         <property name="sizePolicy">
@@ -46,29 +53,25 @@
         </property>
        </widget>
       </item>
-      <item row="2" column="1" colspan="2">
-       <widget class="QLabel" name="qlOS">
+      <item row="1" column="0" colspan="3">
+       <widget class="QLabel" name="qlVersionNote">
         <property name="sizePolicy">
-         <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
-          <horstretch>1</horstretch>
+         <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+          <horstretch>0</horstretch>
           <verstretch>0</verstretch>
          </sizepolicy>
         </property>
-        <property name="text">
-         <string/>
+        <property name="visible">
+         <bool>false</bool>
         </property>
-        <property name="textFormat">
-         <enum>Qt::PlainText</enum>
+        <property name="text">
+         <string>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</string>
         </property>
-        <property name="textInteractionFlags">
-         <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
+        <property name="wordWrap">
+         <bool>true</bool>
         </property>
-       </widget>
-      </item>
-      <item row="4" column="0">
-       <widget class="QLabel" name="qliCertificate">
-        <property name="text">
-         <string>Certificate</string>
+        <property name="openExternalLinks">
+         <bool>true</bool>
         </property>
        </widget>
       </item>
@@ -79,8 +82,8 @@
         </property>
        </widget>
       </item>
-      <item row="6" column="1" colspan="2">
-       <widget class="QLabel" name="qlCELT">
+      <item row="5" column="1" colspan="2">
+       <widget class="QLabel" name="qlAddress">
         <property name="sizePolicy">
          <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
           <horstretch>1</horstretch>
@@ -95,29 +98,8 @@
         </property>
        </widget>
       </item>
-      <item row="7" column="0">
-       <widget class="QLabel" name="qliOpus">
-        <property name="text">
-         <string notr="true">Opus</string>
-        </property>
-       </widget>
-      </item>
-      <item row="6" column="0">
-       <widget class="QLabel" name="qliCELT">
-        <property name="text">
-         <string>CELT Versions</string>
-        </property>
-       </widget>
-      </item>
-      <item row="7" column="1" colspan="2">
-       <widget class="QLabel" name="qlOpus">
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="1" colspan="2">
-       <widget class="QLabel" name="qlVersion">
+      <item row="2" column="1" colspan="2">
+       <widget class="QLabel" name="qlOS">
         <property name="sizePolicy">
          <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
           <horstretch>1</horstretch>
@@ -164,8 +146,15 @@
         </property>
        </widget>
       </item>
-      <item row="5" column="1" colspan="2">
-       <widget class="QLabel" name="qlAddress">
+      <item row="4" column="0">
+       <widget class="QLabel" name="qliCertificate">
+        <property name="text">
+         <string>Certificate</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="1" colspan="2">
+       <widget class="QLabel" name="qlVersion">
         <property name="sizePolicy">
          <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
           <horstretch>1</horstretch>
@@ -175,30 +164,18 @@
         <property name="text">
          <string/>
         </property>
+        <property name="textFormat">
+         <enum>Qt::PlainText</enum>
+        </property>
         <property name="textInteractionFlags">
          <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
         </property>
        </widget>
       </item>
-      <item row="1" column="0" colspan="3">
-       <widget class="QLabel" name="qlVersionNote">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="visible">
-         <bool>false</bool>
-        </property>
+      <item row="6" column="1" colspan="2">
+       <widget class="QLabel" name="qlOpus">
         <property name="text">
-         <string>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</string>
-        </property>
-        <property name="wordWrap">
-         <bool>true</bool>
-        </property>
-        <property name="openExternalLinks">
-         <bool>true</bool>
+         <string/>
         </property>
        </widget>
       </item>
-- 
2.33.5
 
projeto & código: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
mantenedor atual: Michael Shigorin
mantenedor da tradução: Fernando Martini aka fmartini © 2009