diff --git a/docs/dev/build-instructions/cmake_options.md b/docs/dev/build-instructions/cmake_options.md index aea4aed7cad..f31b67c0415 100644 --- a/docs/dev/build-instructions/cmake_options.md +++ b/docs/dev/build-instructions/cmake_options.md @@ -319,6 +319,11 @@ All warnings are treated as errors. Build support for WASAPI. (Default: ON) +### win-universal-mute + +Build support for Windows Universal Mute (Win11 22H2+) with simple fallback for earlier versions. +(Default: ON) + ### xboxinput Build support for global shortcuts from Xbox controllers via the XInput DLL. diff --git a/src/mumble/CMakeLists.txt b/src/mumble/CMakeLists.txt index 1f3daa534c2..7351b30a09e 100644 --- a/src/mumble/CMakeLists.txt +++ b/src/mumble/CMakeLists.txt @@ -39,6 +39,9 @@ if(WIN32) option(wasapi "Build support for WASAPI." ON) option(xboxinput "Build support for global shortcuts from Xbox controllers via the XInput DLL." ON) option(gkey "Build support for Logitech G-Keys. Note: This feature does not require any build-time dependencies, and requires Logitech Gaming Software to be installed to have any effect at runtime." ON) + if(MSVC) + option(win-universal-mute "Build support for Windows Universal Mute (Win11 22H2+) with simple fallback for earlier versions." ON) + endif() elseif(UNIX) if(APPLE) option(coreaudio "Build support for CoreAudio." ON) @@ -657,6 +660,18 @@ if(WIN32) hid.lib wintrust.lib ) + + if(win-universal-mute) + target_sources(mumble_client_object_lib PRIVATE + "UniversalMute.cpp" + "UniversalMute.h" + ) + target_compile_definitions(mumble_client_object_lib PUBLIC "USE_WIN_UNIVERSAL_MUTE") + # WinRT required; delay-load so the binary still starts on Windows 7 where runtimeobject.dll + # does not exist. IsWindows8OrGreater() must guard call sites at runtime. + target_link_libraries(mumble_client_object_lib PUBLIC runtimeobject.lib) + set_property(TARGET mumble_client_object_lib APPEND_STRING PROPERTY LINK_FLAGS " /DELAYLOAD:runtimeobject.dll") + endif() else() target_sources(mumble_client_object_lib PRIVATE "SharedMemory_unix.cpp") diff --git a/src/mumble/MainWindow.cpp b/src/mumble/MainWindow.cpp index a6fb6bac9ca..4ac9c8cba99 100644 --- a/src/mumble/MainWindow.cpp +++ b/src/mumble/MainWindow.cpp @@ -513,6 +513,23 @@ void MainWindow::setupGui() { qaAudioMute->setChecked(Global::get().s.bMute); qaAudioDeaf->setChecked(Global::get().s.bDeaf); +#ifdef USE_WIN_UNIVERSAL_MUTE + m_universalMuter.emplace( + [this]() { + // Fired on a WinRT thread pool thread — marshal to Qt main thread. + QMetaObject::invokeMethod(this, [this]() { + qaAudioMute->setChecked(true); + on_qaAudioMute_triggered(); + }, Qt::QueuedConnection); + }, + [this]() { + QMetaObject::invokeMethod(this, [this]() { + qaAudioMute->setChecked(false); + on_qaAudioMute_triggered(); + }, Qt::QueuedConnection); + }); +#endif + updateAudioToolTips(); #ifdef USE_NO_TTS @@ -2754,6 +2771,14 @@ void MainWindow::on_qaAudioMute_triggered() { Global::get().sh->setSelfMuteDeafState(Global::get().s.bMute, Global::get().s.bDeaf); } +#ifdef USE_WIN_UNIVERSAL_MUTE + if (Global::get().s.bMute) { + m_universalMuter->setMuted(); + } else { + m_universalMuter->setUnmuted(); + } +#endif + updateAudioToolTips(); emit talkingStatusChanged(); } @@ -2799,6 +2824,14 @@ void MainWindow::on_qaAudioDeaf_triggered() { Global::get().sh->setSelfMuteDeafState(Global::get().s.bMute, Global::get().s.bDeaf); } +#ifdef USE_WIN_UNIVERSAL_MUTE + if (Global::get().s.bMute) { + m_universalMuter->setMuted(); + } else { + m_universalMuter->setUnmuted(); + } +#endif + updateAudioToolTips(); emit talkingStatusChanged(); } @@ -3530,6 +3563,10 @@ void MainWindow::serverConnected() { updateFavoriteButton(); qaServerBanList->setEnabled(true); +#ifdef USE_WIN_UNIVERSAL_MUTE + m_universalMuter->startCall(tr("Connecting...").toStdWString(), tr("Mumble").toStdWString()); +#endif + Channel *root = Channel::get(Mumble::ROOT_CHANNEL_ID); pmModel->renameChannel(root, tr("Root")); pmModel->setCommentHash(root, QByteArray()); @@ -3563,6 +3600,10 @@ void MainWindow::serverConnected() { } void MainWindow::serverDisconnected(QAbstractSocket::SocketError err, QString reason) { +#ifdef USE_WIN_UNIVERSAL_MUTE + m_universalMuter->tryEndCall(); +#endif + // clear ChannelListener Global::get().channelListenerManager->clear(); diff --git a/src/mumble/MainWindow.h b/src/mumble/MainWindow.h index 462630a48c6..7bc4684728f 100644 --- a/src/mumble/MainWindow.h +++ b/src/mumble/MainWindow.h @@ -24,6 +24,10 @@ #include #include +#ifdef USE_WIN_UNIVERSAL_MUTE +# include "UniversalMute.h" +#endif + #include "ui_MainWindow.h" #define MB_QEVENT (QEvent::User + 939) @@ -206,6 +210,12 @@ class MainWindow : public QMainWindow, public Ui::MainWindow { std::stack< unsigned int > m_previousChannels; std::optional< unsigned int > m_movedBackFromChannel; +#ifdef USE_WIN_UNIVERSAL_MUTE + // A std::optional simply because we initialize this in setupGui(), not the + // constructor. + std::optional< UniversalMuter > m_universalMuter; +#endif + static constexpr int stateVersion(); void createActions(); diff --git a/src/mumble/Messages.cpp b/src/mumble/Messages.cpp index 992f7174a99..81b0443b3a3 100644 --- a/src/mumble/Messages.cpp +++ b/src/mumble/Messages.cpp @@ -188,6 +188,11 @@ void MainWindow::msgServerSync(const MumbleProto::ServerSync &msg) { Global::get().sh->setServerSynchronized(true); +#ifdef USE_WIN_UNIVERSAL_MUTE + if (user->cChannel) + m_universalMuter->trySetCallName(user->cChannel->qsName.toStdWString()); +#endif + emit serverSynchronized(); } diff --git a/src/mumble/UniversalMute.cpp b/src/mumble/UniversalMute.cpp new file mode 100644 index 00000000000..db445467517 --- /dev/null +++ b/src/mumble/UniversalMute.cpp @@ -0,0 +1,148 @@ +// Copyright 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 . + +#include "UniversalMute.h" + +#include "win.h" + +// clang-format off +#include +#include +#include +#include +#include +#include +// clang-format on + +using namespace Microsoft::WRL; +using namespace Microsoft::WRL::Wrappers; +using namespace ABI::Windows::ApplicationModel::Calls; +using namespace ABI::Windows::Foundation; + +struct UniversalMuter::Impl { + std::function< void() > onMuted; + std::function< void() > onUnmuted; + ComPtr< IVoipCallCoordinator > coordinator; + ComPtr< IVoipPhoneCall > call; + EventRegistrationToken muteStateToken{}; +}; + +namespace { +// C++/WinRT would be a bit simpler, but requires a newer couroutine ABI than +// we are currently using (requires _COROUTINE_ABI=2, while Qt is compiled with +// _COROUTINE_ABI=1). If the app fully upgrades to C++20, we can migrate to C++/WinRT. +// +// https://github.com/microsoft/cppwinrt/issues/1281 +ComPtr< IVoipCallCoordinator > tryCreateCallCoordinator() { + // WinRT was added in Windows 8; check for that before using WinRT. + // The /DELAYLOAD:runtimeobject.dll linker flag ensures we don't attempt + // to load the DLL on older versions. + if (!IsWindows8OrGreater()) { + return nullptr; + } + + ComPtr< IVoipCallCoordinatorStatics > statics; + HRESULT hr = RoGetActivationFactory( + HStringReference(RuntimeClass_Windows_ApplicationModel_Calls_VoipCallCoordinator).Get(), + IID_PPV_ARGS(&statics)); + if (FAILED(hr)) { + return nullptr; + } + + ComPtr< IVoipCallCoordinator > coordinator; + hr = statics->GetDefault(&coordinator); + if (FAILED(hr)) { + return nullptr; + } + + return coordinator; +} +} + +UniversalMuter::UniversalMuter(std::function< void() > onMuted, std::function< void() > onUnmuted) + : m_impl(std::make_shared< Impl >()) { + m_impl->onMuted = std::move(onMuted); + m_impl->onUnmuted = std::move(onUnmuted); + + m_impl->coordinator = tryCreateCallCoordinator(); + if (!m_impl->coordinator) + return; + + // Capture a weak_ptr so the callback safely no-ops if UniversalMuter is destroyed + // while a callback is in flight (e.g. racing with remove_MuteStateChanged). + std::weak_ptr< Impl > weakImpl = m_impl; + auto handler = Callback< ITypedEventHandler< VoipCallCoordinator *, MuteChangeEventArgs * > >( + [weakImpl](IVoipCallCoordinator *, IMuteChangeEventArgs *args) -> HRESULT { + auto impl = weakImpl.lock(); + if (!impl) + return S_OK; + boolean muted = FALSE; + args->get_Muted(&muted); + + // The callbacks are responsible for calling setMuted/setUnmuted when they have + // processed the event. + if (muted) { + if (impl->onMuted) + impl->onMuted(); + } else { + if (impl->onUnmuted) + impl->onUnmuted(); + } + return S_OK; + }); + + // Ignore failures; best effort. + m_impl->coordinator->add_MuteStateChanged(handler.Get(), &m_impl->muteStateToken); +} + +UniversalMuter::~UniversalMuter() { + if (m_impl->coordinator) + m_impl->coordinator->remove_MuteStateChanged(m_impl->muteStateToken); + tryEndCall(); +} + +void UniversalMuter::startCall(const std::wstring &contactName, const std::wstring &serviceName) { + if (!m_impl->coordinator) + return; + + ComPtr< IVoipPhoneCall > call; + HString context, hContactName, hServiceName; + context.Set(L""); + hContactName.Set(contactName.c_str()); + hServiceName.Set(serviceName.c_str()); + + // RequestNewOutgoingCall may fail with E_ACCESSDENIED if the app lacks package identity. + // The coordinator and MuteStateChanged events remain active regardless. + HRESULT hr = m_impl->coordinator->RequestNewOutgoingCall(context.Get(), hContactName.Get(), + hServiceName.Get(), + VoipPhoneCallMedia_Audio, &call); + if (SUCCEEDED(hr)) + m_impl->call = call; +} + +void UniversalMuter::tryEndCall() { + if (!m_impl->call) + return; + m_impl->call->NotifyCallEnded(); + m_impl->call.Reset(); +} + +void UniversalMuter::trySetCallName(const std::wstring &callName) { + if (!m_impl->call) + return; + HString name; + name.Set(callName.c_str()); + m_impl->call->put_ContactName(name.Get()); +} + +void UniversalMuter::setMuted() { + if (m_impl->coordinator) + m_impl->coordinator->NotifyMuted(); +} + +void UniversalMuter::setUnmuted() { + if (m_impl->coordinator) + m_impl->coordinator->NotifyUnmuted(); +} diff --git a/src/mumble/UniversalMute.h b/src/mumble/UniversalMute.h new file mode 100644 index 00000000000..7a962b1bf45 --- /dev/null +++ b/src/mumble/UniversalMute.h @@ -0,0 +1,48 @@ +// Copyright 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 . + +#ifndef MUMBLE_MUMBLE_UNIVERSAL_MUTE_H_ +#define MUMBLE_MUMBLE_UNIVERSAL_MUTE_H_ + +#include +#include +#include + +// A wrapper around the Windows 10 VoIP Call API, specifically enough to +// interact with the Windows 11 Universal Mute feature. This ensures physical mute buttons +// in recent laptops can mute Mumble. +// +// Universal Mute is only supported on Windows 11 22H2 and later, but this class +// gracefully no-ops on unsupported platforms. +// +// https://stackoverflow.com/questions/74683703/how-do-i-support-call-mute-universal-mute-in-my-app-for-windows-11-22h2 +class UniversalMuter { +public: + // The onMuted/onUnmuted callbacks are called when the user mutes/unmutes themselves using + // the Universal Mute button. They must call setMuted()/setUnmuted() here when they have + // processed the event, or the button won't actually change state. + UniversalMuter(std::function< void() > onMuted, std::function< void() > onUnmuted); + ~UniversalMuter(); + + UniversalMuter(const UniversalMuter &) = delete; + UniversalMuter &operator=(const UniversalMuter &) = delete; + UniversalMuter(UniversalMuter &&) = delete; + UniversalMuter &operator=(UniversalMuter &&) = delete; + + void setMuted(); + void setUnmuted(); + + void startCall(const std::wstring &contactName, const std::wstring &serviceName); + void tryEndCall(); + + void trySetCallName(const std::wstring &callName); + +private: + // Use the PIMPL pattern to avoid including WRL/WinRT headers in the public header. + struct Impl; + std::shared_ptr< Impl > m_impl; +}; + +#endif // MUMBLE_MUMBLE_UNIVERSAL_MUTE_H_ diff --git a/src/mumble/mumble_ar.ts b/src/mumble/mumble_ar.ts index 3db10db4512..58888a024b2 100644 --- a/src/mumble/mumble_ar.ts +++ b/src/mumble/mumble_ar.ts @@ -6883,6 +6883,10 @@ the channel's context menu. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_bg.ts b/src/mumble/mumble_bg.ts index 7c609998816..409c6b7df7a 100644 --- a/src/mumble/mumble_bg.ts +++ b/src/mumble/mumble_bg.ts @@ -6880,6 +6880,10 @@ the channel's context menu. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_br.ts b/src/mumble/mumble_br.ts index 269d0747d65..f96b2185fa9 100644 --- a/src/mumble/mumble_br.ts +++ b/src/mumble/mumble_br.ts @@ -6879,6 +6879,10 @@ the channel's context menu. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_ca.ts b/src/mumble/mumble_ca.ts index 71eb27b3d9b..fffc2b78574 100644 --- a/src/mumble/mumble_ca.ts +++ b/src/mumble/mumble_ca.ts @@ -6946,6 +6946,10 @@ al menú contextual del canal. This will check if mumble is up to date Això comprova si el mumble està actualitzat + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? Aquest so és el senyal de treure la paraula. S'activa quan es parla mentre es no teniu la paraula. Voleu mantenir-ho activat? diff --git a/src/mumble/mumble_cs.ts b/src/mumble/mumble_cs.ts index 90c929687e5..939bfab6008 100644 --- a/src/mumble/mumble_cs.ts +++ b/src/mumble/mumble_cs.ts @@ -6937,6 +6937,10 @@ kontextové nabídce kanálů. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_cy.ts b/src/mumble/mumble_cy.ts index bb40b1ab8fc..a70f3b826c2 100644 --- a/src/mumble/mumble_cy.ts +++ b/src/mumble/mumble_cy.ts @@ -6883,6 +6883,10 @@ the channel's context menu. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_da.ts b/src/mumble/mumble_da.ts index 14e06985ff4..786494268ca 100644 --- a/src/mumble/mumble_da.ts +++ b/src/mumble/mumble_da.ts @@ -6936,6 +6936,10 @@ kanalens genvejsmenu. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_de.ts b/src/mumble/mumble_de.ts index d2354fc3d5a..a216f7d5e61 100644 --- a/src/mumble/mumble_de.ts +++ b/src/mumble/mumble_de.ts @@ -6946,6 +6946,10 @@ des Kanals auswählen. This will check if mumble is up to date Dies prüft, ob mumble auf dem neuesten Stand ist + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? Dieser Sound war der Stumm-Hinweis. Er wird aktiviert, wenn gesprochen wird, obwohl eine Stummschaltung besteht. Aktiviert lassen? diff --git a/src/mumble/mumble_el.ts b/src/mumble/mumble_el.ts index f8adf2e99df..07f775b1cc9 100644 --- a/src/mumble/mumble_el.ts +++ b/src/mumble/mumble_el.ts @@ -6946,6 +6946,10 @@ the channel's context menu. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_en.ts b/src/mumble/mumble_en.ts index efe1fea961e..3e07c13af99 100644 --- a/src/mumble/mumble_en.ts +++ b/src/mumble/mumble_en.ts @@ -6878,6 +6878,10 @@ the channel's context menu. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_en_GB.ts b/src/mumble/mumble_en_GB.ts index cb8ec9b69a1..d438cd61478 100644 --- a/src/mumble/mumble_en_GB.ts +++ b/src/mumble/mumble_en_GB.ts @@ -6933,6 +6933,10 @@ the channel's context menu. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_eo.ts b/src/mumble/mumble_eo.ts index 539cf8cec44..150fa359fce 100644 --- a/src/mumble/mumble_eo.ts +++ b/src/mumble/mumble_eo.ts @@ -6891,6 +6891,10 @@ the channel's context menu. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_es.ts b/src/mumble/mumble_es.ts index 78741f9c4ea..b95867a2b5e 100644 --- a/src/mumble/mumble_es.ts +++ b/src/mumble/mumble_es.ts @@ -6947,6 +6947,10 @@ en el menu contextual del canal. This will check if mumble is up to date Esto comprobará si Mumble está actualizado + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? Ese sonido era la señal de silencio. Se activa cuando hablas estando silenciado. ¿Quieres mantenerlo activado? diff --git a/src/mumble/mumble_et.ts b/src/mumble/mumble_et.ts index 0302021ea4e..c55aea6402b 100644 --- a/src/mumble/mumble_et.ts +++ b/src/mumble/mumble_et.ts @@ -6880,6 +6880,10 @@ the channel's context menu. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_eu.ts b/src/mumble/mumble_eu.ts index fb052715f51..6bbdd47796f 100644 --- a/src/mumble/mumble_eu.ts +++ b/src/mumble/mumble_eu.ts @@ -6898,6 +6898,10 @@ the channel's context menu. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_fa_IR.ts b/src/mumble/mumble_fa_IR.ts index 7685d73347d..036f14b46cc 100644 --- a/src/mumble/mumble_fa_IR.ts +++ b/src/mumble/mumble_fa_IR.ts @@ -6880,6 +6880,10 @@ the channel's context menu. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_fi.ts b/src/mumble/mumble_fi.ts index b1c35ceb7ac..48a82caaf10 100644 --- a/src/mumble/mumble_fi.ts +++ b/src/mumble/mumble_fi.ts @@ -6946,6 +6946,10 @@ kanavien alivalikosta. This will check if mumble is up to date Tämä tarkistaa onko mumble ajantasalla + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? Tuo ääni oli mykistyksen äänimerkki. Se kuuluu kun puhut mykistettynä. Haluatko pitää äänimerkin päällä? diff --git a/src/mumble/mumble_fr.ts b/src/mumble/mumble_fr.ts index b7a3f9484bf..e30d42d9b4f 100644 --- a/src/mumble/mumble_fr.ts +++ b/src/mumble/mumble_fr.ts @@ -6946,6 +6946,10 @@ pour filtrage depuis le menu du salon. This will check if mumble is up to date Ceci vérifiera si mumble est à jour + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? Ce son était l'indicateur de l'état muet. Il s'active lorsque vous parlez alors que vous êtes muet. Souhaitez-vous le garder activé ? diff --git a/src/mumble/mumble_gl.ts b/src/mumble/mumble_gl.ts index 51690ba3c25..4c31b38c9ea 100644 --- a/src/mumble/mumble_gl.ts +++ b/src/mumble/mumble_gl.ts @@ -6881,6 +6881,10 @@ the channel's context menu. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_he.ts b/src/mumble/mumble_he.ts index dd0d1206350..8fec4b2f564 100644 --- a/src/mumble/mumble_he.ts +++ b/src/mumble/mumble_he.ts @@ -6933,6 +6933,10 @@ the channel's context menu. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_hi.ts b/src/mumble/mumble_hi.ts index 109e2d6c90a..a4f6ce96496 100644 --- a/src/mumble/mumble_hi.ts +++ b/src/mumble/mumble_hi.ts @@ -6063,6 +6063,10 @@ the channel's context menu. Reconnecting. + + Connecting... + + Change your comment diff --git a/src/mumble/mumble_hu.ts b/src/mumble/mumble_hu.ts index ffb22e4a4c3..bc4329b36c6 100644 --- a/src/mumble/mumble_hu.ts +++ b/src/mumble/mumble_hu.ts @@ -6927,6 +6927,10 @@ the channel's context menu. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_it.ts b/src/mumble/mumble_it.ts index 7e03557a63a..06b4e980890 100644 --- a/src/mumble/mumble_it.ts +++ b/src/mumble/mumble_it.ts @@ -6946,6 +6946,10 @@ contestuale del canale. This will check if mumble is up to date Questo controllerà se Mumble sia aggiornato + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? Quel suono era l'attivazione del muto. Si attiva quando parli mentre sei mutato. Voui mantenerlo attivo? diff --git a/src/mumble/mumble_ja.ts b/src/mumble/mumble_ja.ts index fc72386a94f..a729e3c233f 100644 --- a/src/mumble/mumble_ja.ts +++ b/src/mumble/mumble_ja.ts @@ -6931,6 +6931,10 @@ the channel's context menu. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_ko.ts b/src/mumble/mumble_ko.ts index fd1cbe8122b..af0f10f8c9b 100644 --- a/src/mumble/mumble_ko.ts +++ b/src/mumble/mumble_ko.ts @@ -6945,6 +6945,10 @@ the channel's context menu. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_lt.ts b/src/mumble/mumble_lt.ts index f97957e7cee..667e2abb8fc 100644 --- a/src/mumble/mumble_lt.ts +++ b/src/mumble/mumble_lt.ts @@ -6912,6 +6912,10 @@ the channel's context menu. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_nl.ts b/src/mumble/mumble_nl.ts index f2c9abe6884..2e351a4a73f 100644 --- a/src/mumble/mumble_nl.ts +++ b/src/mumble/mumble_nl.ts @@ -6946,6 +6946,10 @@ context-menu van het kanaal. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_no.ts b/src/mumble/mumble_no.ts index 6992c1a8d36..4eb2c4853c7 100644 --- a/src/mumble/mumble_no.ts +++ b/src/mumble/mumble_no.ts @@ -6961,6 +6961,10 @@ Du kan markere ytterligere kanaler fra filtrering fra kanalens bindeleddsmeny.This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_oc.ts b/src/mumble/mumble_oc.ts index 62a61e74219..25c33918d08 100644 --- a/src/mumble/mumble_oc.ts +++ b/src/mumble/mumble_oc.ts @@ -6880,6 +6880,10 @@ the channel's context menu. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_pl.ts b/src/mumble/mumble_pl.ts index 64fce966348..dda70d90d24 100644 --- a/src/mumble/mumble_pl.ts +++ b/src/mumble/mumble_pl.ts @@ -6947,6 +6947,10 @@ kanały mają być filtrowane. This will check if mumble is up to date Sprawdza, czy program Mumble jest aktualny + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? Ten dźwięk był niemym sygnałem. Włącza się, gdy mówisz po wyciszeniu. Czy chcesz, aby była on włączony? diff --git a/src/mumble/mumble_pt_BR.ts b/src/mumble/mumble_pt_BR.ts index 41ff3da98a4..daa9502bcd8 100644 --- a/src/mumble/mumble_pt_BR.ts +++ b/src/mumble/mumble_pt_BR.ts @@ -6946,6 +6946,10 @@ no menu contextual do canal. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_pt_PT.ts b/src/mumble/mumble_pt_PT.ts index 8781d7dfbf7..c740cfdc6da 100644 --- a/src/mumble/mumble_pt_PT.ts +++ b/src/mumble/mumble_pt_PT.ts @@ -6946,6 +6946,10 @@ do menu de contexto do canal. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_ro.ts b/src/mumble/mumble_ro.ts index 05d4cd91321..eb61b85e74d 100644 --- a/src/mumble/mumble_ro.ts +++ b/src/mumble/mumble_ro.ts @@ -6888,6 +6888,10 @@ the channel's context menu. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_ru.ts b/src/mumble/mumble_ru.ts index dab51179d1a..f4414f8fe3a 100644 --- a/src/mumble/mumble_ru.ts +++ b/src/mumble/mumble_ru.ts @@ -6947,6 +6947,10 @@ the channel's context menu. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? Сейчас прозвучал сигнал заглушения. Это происходит, когда вы говорите при заглушенном микрофоне. Хотите оставить его включенным? diff --git a/src/mumble/mumble_si.ts b/src/mumble/mumble_si.ts index ab08ed89903..f42a743cca5 100644 --- a/src/mumble/mumble_si.ts +++ b/src/mumble/mumble_si.ts @@ -5956,6 +5956,10 @@ the channel's context menu. Reconnecting. + + Connecting... + + Change your comment diff --git a/src/mumble/mumble_sk.ts b/src/mumble/mumble_sk.ts index 210782b206d..b793c952148 100644 --- a/src/mumble/mumble_sk.ts +++ b/src/mumble/mumble_sk.ts @@ -6032,6 +6032,10 @@ the channel's context menu. Reconnecting. + + Connecting... + + Change your comment diff --git a/src/mumble/mumble_sq.ts b/src/mumble/mumble_sq.ts index bf792cd97d6..c409fc75fdd 100644 --- a/src/mumble/mumble_sq.ts +++ b/src/mumble/mumble_sq.ts @@ -6091,6 +6091,10 @@ the channel's context menu. Reconnecting. Rilidhje e Jetpack-ut + + Connecting... + + Change your comment Ndryshoni komentin tuaj diff --git a/src/mumble/mumble_sv.ts b/src/mumble/mumble_sv.ts index 8ee33c44661..52f63256d52 100644 --- a/src/mumble/mumble_sv.ts +++ b/src/mumble/mumble_sv.ts @@ -6946,6 +6946,10 @@ kanalens innehållsmeny. This will check if mumble is up to date Detta kontrollerar om mumble är uppdaterat + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? Det ljudet var den tysta signalen. Den aktiveras när du talar medan ljudet är tyst. Vill du behålla det aktiverat? diff --git a/src/mumble/mumble_te.ts b/src/mumble/mumble_te.ts index 8d44cdb11e7..85dc9362649 100644 --- a/src/mumble/mumble_te.ts +++ b/src/mumble/mumble_te.ts @@ -6891,6 +6891,10 @@ the channel's context menu. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_th.ts b/src/mumble/mumble_th.ts index 66c9169181b..21f09e77e3b 100644 --- a/src/mumble/mumble_th.ts +++ b/src/mumble/mumble_th.ts @@ -6878,6 +6878,10 @@ the channel's context menu. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_tr.ts b/src/mumble/mumble_tr.ts index 2be0c9604cd..9d0d3b64e1c 100644 --- a/src/mumble/mumble_tr.ts +++ b/src/mumble/mumble_tr.ts @@ -6945,6 +6945,10 @@ filtrelenmesi için ilave kanallar ekleyebilirsiniz. This will check if mumble is up to date Bu, mumble'ın güncel olup olmadığını kontrol edecektir + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? Bu ses, susturulduğunuzun işaretiydi. Susturulduğunuzda konuşursanız etkinleşir. Bunu faal olarak muhafaza etmek ister misiniz? diff --git a/src/mumble/mumble_uk.ts b/src/mumble/mumble_uk.ts index 09133e20d4c..309d2fccf34 100644 --- a/src/mumble/mumble_uk.ts +++ b/src/mumble/mumble_uk.ts @@ -6947,6 +6947,10 @@ the channel's context menu. This will check if mumble is up to date Це перевірить, чи Mumble оновлено + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? Цей звук був сигналом вимкнення звуку. Він активується, коли ви говорите з вимкненим звуком. Бажаєте залишити його ввімкненим? diff --git a/src/mumble/mumble_zh_CN.ts b/src/mumble/mumble_zh_CN.ts index 50e2d4a1987..a32562e5c17 100644 --- a/src/mumble/mumble_zh_CN.ts +++ b/src/mumble/mumble_zh_CN.ts @@ -6945,6 +6945,10 @@ the channel's context menu. This will check if mumble is up to date 这会检查 Mumble 是否为最新版 + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? 此声音是静音提示。您在静音时发言会激活它。您希望保持启用吗? diff --git a/src/mumble/mumble_zh_HK.ts b/src/mumble/mumble_zh_HK.ts index 4dd7d9578c5..6c9a7227ffa 100644 --- a/src/mumble/mumble_zh_HK.ts +++ b/src/mumble/mumble_zh_HK.ts @@ -6880,6 +6880,10 @@ the channel's context menu. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled? diff --git a/src/mumble/mumble_zh_TW.ts b/src/mumble/mumble_zh_TW.ts index 2039b91111a..2cbe9a94c78 100644 --- a/src/mumble/mumble_zh_TW.ts +++ b/src/mumble/mumble_zh_TW.ts @@ -6910,6 +6910,10 @@ the channel's context menu. This will check if mumble is up to date + + Connecting... + + That sound was the mute cue. It activates when you speak while muted. Would you like to keep it enabled?