From 7203655a05a1980db6ac26fe5f875e826f1fb0b7 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Mon, 27 Feb 2017 05:39:31 +0100 Subject: [PATCH] refs #892, disable audio settings when no audio context is available * Info for which machine audio setup is displayed * Obtain audio "location" * Remark: Audio can run on core and in GUI which is different from other contexts --- src/blackcore/context/contextaudio.h | 3 ++ src/blackcore/context/contextaudioempty.h | 8 ++++ src/blackcore/context/contextaudioimpl.cpp | 8 ++++ src/blackcore/context/contextaudioimpl.h | 1 + src/blackcore/context/contextaudioproxy.cpp | 5 +++ src/blackcore/context/contextaudioproxy.h | 1 + .../components/audiosetupcomponent.cpp | 45 ++++++++++++++----- src/blackgui/components/audiosetupcomponent.h | 12 ++--- .../components/audiosetupcomponent.ui | 38 +++++++++++++++- 9 files changed, 104 insertions(+), 17 deletions(-) diff --git a/src/blackcore/context/contextaudio.h b/src/blackcore/context/contextaudio.h index 1c348978c..e1837607f 100644 --- a/src/blackcore/context/contextaudio.h +++ b/src/blackcore/context/contextaudio.h @@ -137,6 +137,9 @@ namespace BlackCore //! Audio devices virtual BlackMisc::Audio::CAudioDeviceInfoList getAudioDevices() const = 0; + //! Audio runs where + virtual BlackMisc::CIdentifier audioRunsWhere() const = 0; + //! Get current audio device //! \return input and output devices virtual BlackMisc::Audio::CAudioDeviceInfoList getCurrentAudioDevices() const = 0; diff --git a/src/blackcore/context/contextaudioempty.h b/src/blackcore/context/contextaudioempty.h index 3bf6e0e58..e24e0c294 100644 --- a/src/blackcore/context/contextaudioempty.h +++ b/src/blackcore/context/contextaudioempty.h @@ -88,6 +88,14 @@ namespace BlackCore logEmptyContextWarning(Q_FUNC_INFO); } + //! \copydoc IContextAudio::audioRunsWhere() + virtual BlackMisc::CIdentifier audioRunsWhere() const override + { + logEmptyContextWarning(Q_FUNC_INFO); + static const BlackMisc::CIdentifier i("CContextAudioEmpty"); + return i; + } + //! \copydoc IContextAudio::getAudioDevices() virtual BlackMisc::Audio::CAudioDeviceInfoList getAudioDevices() const override { diff --git a/src/blackcore/context/contextaudioimpl.cpp b/src/blackcore/context/contextaudioimpl.cpp index 757291270..2e16dba32 100644 --- a/src/blackcore/context/contextaudioimpl.cpp +++ b/src/blackcore/context/contextaudioimpl.cpp @@ -167,6 +167,14 @@ namespace BlackCore m_unusedVoiceChannels.push_back(m_channel2); } + CIdentifier CContextAudio::audioRunsWhere() const + { + Q_ASSERT(this->m_voice); + if (m_debugEnabled) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } + static const BlackMisc::CIdentifier i("CContextAudio"); + return i; + } + CAudioDeviceInfoList CContextAudio::getAudioDevices() const { Q_ASSERT(this->m_voice); diff --git a/src/blackcore/context/contextaudioimpl.h b/src/blackcore/context/contextaudioimpl.h index 0137526f1..ac6e49dc9 100644 --- a/src/blackcore/context/contextaudioimpl.h +++ b/src/blackcore/context/contextaudioimpl.h @@ -81,6 +81,7 @@ namespace BlackCore virtual BlackMisc::Aviation::CCallsignSet getRoomCallsigns(BlackMisc::Aviation::CComSystem::ComUnit comUnitValue) const override; virtual BlackMisc::Network::CUserList getRoomUsers(BlackMisc::Aviation::CComSystem::ComUnit comUnitValue) const override; virtual void leaveAllVoiceRooms() override; + virtual BlackMisc::CIdentifier audioRunsWhere() const override; virtual BlackMisc::Audio::CAudioDeviceInfoList getAudioDevices() const override; virtual BlackMisc::Audio::CAudioDeviceInfoList getCurrentAudioDevices() const override; virtual void setCurrentAudioDevice(const BlackMisc::Audio::CAudioDeviceInfo &audioDevice) override; diff --git a/src/blackcore/context/contextaudioproxy.cpp b/src/blackcore/context/contextaudioproxy.cpp index bb9e8a382..17bc3293a 100644 --- a/src/blackcore/context/contextaudioproxy.cpp +++ b/src/blackcore/context/contextaudioproxy.cpp @@ -82,6 +82,11 @@ namespace BlackCore return this->m_dBusInterface->callDBusRet(QLatin1String("getAudioDevices")); } + CIdentifier CContextAudioProxy::audioRunsWhere() const + { + return this->m_dBusInterface->callDBusRet(QLatin1String("audioRunsWhere")); + } + CAudioDeviceInfoList CContextAudioProxy::getCurrentAudioDevices() const { return this->m_dBusInterface->callDBusRet(QLatin1String("getCurrentAudioDevices")); diff --git a/src/blackcore/context/contextaudioproxy.h b/src/blackcore/context/contextaudioproxy.h index abca8d570..9446fdbf2 100644 --- a/src/blackcore/context/contextaudioproxy.h +++ b/src/blackcore/context/contextaudioproxy.h @@ -70,6 +70,7 @@ namespace BlackCore virtual BlackMisc::Aviation::CCallsignSet getRoomCallsigns(BlackMisc::Aviation::CComSystem::ComUnit comUnitValue) const override; virtual BlackMisc::Network::CUserList getRoomUsers(BlackMisc::Aviation::CComSystem::ComUnit comUnitValue) const override; virtual void leaveAllVoiceRooms() override; + virtual BlackMisc::CIdentifier audioRunsWhere() const override; virtual BlackMisc::Audio::CAudioDeviceInfoList getAudioDevices() const override; virtual BlackMisc::Audio::CAudioDeviceInfoList getCurrentAudioDevices() const override; virtual void setCurrentAudioDevice(const BlackMisc::Audio::CAudioDeviceInfo &audioDevice) override; diff --git a/src/blackgui/components/audiosetupcomponent.cpp b/src/blackgui/components/audiosetupcomponent.cpp index 5e3532dfb..b3ff14a1d 100644 --- a/src/blackgui/components/audiosetupcomponent.cpp +++ b/src/blackgui/components/audiosetupcomponent.cpp @@ -39,14 +39,35 @@ namespace BlackGui { ui->setupUi(this); + Q_ASSERT_X(sGui, Q_FUNC_INFO, "Missing sGui"); + Q_ASSERT_X(sGui->getIContextAudio(), Q_FUNC_INFO, "Missing Audio context"); + + // audio is optional + const bool audio = this->hasAudio(); + this->setEnabled(audio); + if (!audio) + { + ui->lbl_ExtraInfo->setText("No audio, cannot change."); + } + else if (sGui->getIContextAudio()->isUsingImplementingObject()) + { + const CIdentifier i = sGui->getIContextAudio()->audioRunsWhere(); + const QString info = QString("Local audio on '%1', '%2'.").arg(i.getMachineName(), i.getProcessName()); + ui->lbl_ExtraInfo->setText(info); + } + else + { + const CIdentifier i = sGui->getIContextAudio()->audioRunsWhere(); + const QString info = QString("Remote audio on '%1', '%2'.").arg(i.getMachineName(), i.getProcessName()); + ui->lbl_ExtraInfo->setText(info); + } + bool c = connect(ui->tb_ExpandNotificationSounds, &QToolButton::toggled, this, &CAudioSetupComponent::ps_onToggleNotificationSoundsVisibility); Q_ASSERT(c); - Q_UNUSED(c); c = connect(ui->cb_SetupAudioLoopback, &QCheckBox::toggled, this, &CAudioSetupComponent::ps_onLoopbackToggled); Q_ASSERT(c); - Q_UNUSED(c); - if (sGui->getIContextAudio()) + if (audio) { this->initAudioDeviceLists(); @@ -56,18 +77,18 @@ namespace BlackGui // the connects depend on initAudioDeviceLists c = this->connect(ui->cb_SetupAudioInputDevice, static_cast (&QComboBox::currentIndexChanged), this, &CAudioSetupComponent::ps_audioDeviceSelected); Q_ASSERT(c); - Q_UNUSED(c); - c = this->connect(ui->cb_SetupAudioOutputDevice, static_cast (&QComboBox::currentIndexChanged), this, &CAudioSetupComponent::ps_audioDeviceSelected); Q_ASSERT(c); - Q_UNUSED(c); // context - this->connect(sGui->getIContextAudio(), &IContextAudio::changedAudioDevices, this, &CAudioSetupComponent::ps_onAudioDevicesChanged); - this->connect(sGui->getIContextAudio(), &IContextAudio::changedSelectedAudioDevices, this, &CAudioSetupComponent::ps_onCurrentAudioDevicesChanged); + c = this->connect(sGui->getIContextAudio(), &IContextAudio::changedAudioDevices, this, &CAudioSetupComponent::ps_onAudioDevicesChanged); + Q_ASSERT(c); + c = this->connect(sGui->getIContextAudio(), &IContextAudio::changedSelectedAudioDevices, this, &CAudioSetupComponent::ps_onCurrentAudioDevicesChanged); + Q_ASSERT(c); } this->ps_reloadSettings(); ui->tb_ExpandNotificationSounds->setChecked(false); // collapse + Q_UNUSED(c); } CAudioSetupComponent::~CAudioSetupComponent() @@ -88,11 +109,16 @@ namespace BlackGui void CAudioSetupComponent::initAudioDeviceLists() { - if (!sGui->getIContextAudio()) { return; } + if (!this->hasAudio()) { return; } this->ps_onAudioDevicesChanged(sGui->getIContextAudio()->getAudioDevices()); this->ps_onCurrentAudioDevicesChanged(sGui->getIContextAudio()->getCurrentAudioDevices()); } + bool CAudioSetupComponent::hasAudio() const + { + return sGui && sGui->getIContextAudio() && !sGui->getIContextAudio()->isEmptyObject(); + } + bool CAudioSetupComponent::playNotificationSounds() const { return ui->cb_SetupAudioPlayNotificationSounds->isChecked(); @@ -162,6 +188,5 @@ namespace BlackGui if (sGui->getIContextAudio()->isAudioLoopbackEnabled() == loopback) { return; } sGui->getIContextAudio()->enableAudioLoopback(loopback); } - } // namespace } // namespace diff --git a/src/blackgui/components/audiosetupcomponent.h b/src/blackgui/components/audiosetupcomponent.h index b36e14665..fd53a801b 100644 --- a/src/blackgui/components/audiosetupcomponent.h +++ b/src/blackgui/components/audiosetupcomponent.h @@ -24,7 +24,6 @@ class QWidget; namespace Ui { class CAudioSetupComponent; } - namespace BlackGui { namespace Components @@ -40,7 +39,7 @@ namespace BlackGui explicit CAudioSetupComponent(QWidget *parent = nullptr); //! Destructor - ~CAudioSetupComponent(); + virtual ~CAudioSetupComponent(); //! Play notification sounds (at all) bool playNotificationSounds() const; @@ -49,10 +48,8 @@ namespace BlackGui //! Reload settings void ps_reloadSettings(); - /*! - * \brief Audio device selected - * \param index audio device index (COM1, COM2) - */ + //! Audio device selected + //! \param index audio device index (COM1, COM2) void ps_audioDeviceSelected(int index); //! Current audio devices changed @@ -71,6 +68,9 @@ namespace BlackGui //! Audio device lists from settings void initAudioDeviceLists(); + //! Audio is optional, check if available + bool hasAudio() const; + QScopedPointer ui; BlackMisc::CSetting m_audioSettings { this, &CAudioSetupComponent::ps_reloadSettings }; diff --git a/src/blackgui/components/audiosetupcomponent.ui b/src/blackgui/components/audiosetupcomponent.ui index f7153724b..62c06d293 100644 --- a/src/blackgui/components/audiosetupcomponent.ui +++ b/src/blackgui/components/audiosetupcomponent.ui @@ -2,6 +2,14 @@ CAudioSetupComponent + + + 0 + 0 + 264 + 359 + + Audio setup @@ -27,6 +35,22 @@ 2 + + + + + + + Extra info goes here + + + true + + + + + + @@ -112,7 +136,7 @@ - Loopback, test sound input to output loop + Loopback, test sound in- to output @@ -120,6 +144,18 @@ + + 3 + + + 3 + + + 3 + + + 3 +