diff --git a/src/blackcore/afv/clients/afvclient.cpp b/src/blackcore/afv/clients/afvclient.cpp index d541a1a44..86c99ec77 100644 --- a/src/blackcore/afv/clients/afvclient.cpp +++ b/src/blackcore/afv/clients/afvclient.cpp @@ -235,6 +235,13 @@ namespace BlackCore this->setNormalizedOutputVolume(mute ? 0 : 50); } + void CAfvClient::startAudio() + { + const CAudioDeviceInfo inputDevice = this->getInputDevice(); + const CAudioDeviceInfo outputDevice = this->getOutputDevice(); + this->startAudio(inputDevice, outputDevice); + } + void CAfvClient::startAudio(const CAudioDeviceInfo &inputDevice, const CAudioDeviceInfo &outputDevice) { if (QThread::currentThread() != this->thread()) @@ -244,14 +251,17 @@ namespace BlackCore return; } - BLACK_VERIFY_X(inputDevice.isValid() && inputDevice.isInputDevice(), Q_FUNC_INFO, "Wrong input device"); - BLACK_VERIFY_X(outputDevice.isValid() && outputDevice.isOutputDevice(), Q_FUNC_INFO, "Wrong output device"); + const CAudioDeviceInfo useInputDevice = inputDevice.isValid() ? inputDevice : CAudioDeviceInfo::getDefaultInputDevice(); + const CAudioDeviceInfo useOutputDevice = outputDevice.isValid() ? outputDevice : CAudioDeviceInfo::getDefaultOutputDevice(); + + BLACK_VERIFY_X(useInputDevice.isValid() && useInputDevice.isInputDevice(), Q_FUNC_INFO, "Wrong input device"); + BLACK_VERIFY_X(useOutputDevice.isValid() && useOutputDevice.isOutputDevice(), Q_FUNC_INFO, "Wrong output device"); if (m_isStarted) { - if (this->usesSameDevices(inputDevice, outputDevice)) + if (this->usesSameDevices(useInputDevice, useOutputDevice)) { - CLogMessage(this).info(u"Client already started for '%1'/'%2'") << inputDevice.getName() << outputDevice.getName(); + CLogMessage(this).info(u"Client already started for '%1'/'%2'") << useInputDevice.getName() << useOutputDevice.getName(); return; } this->stopAudio(); @@ -275,8 +285,8 @@ namespace BlackCore m_outputSampleProvider = new CVolumeSampleProvider(m_soundcardSampleProvider, this); m_outputSampleProvider->setVolume(outputVolume); - m_output->start(outputDevice, m_outputSampleProvider); - m_input->start(inputDevice); + m_output->start(useOutputDevice, m_outputSampleProvider); + m_input->start(useInputDevice); m_startDateTimeUtc = QDateTime::currentDateTimeUtc(); @@ -288,11 +298,11 @@ namespace BlackCore this->onSettingsChanged(); // make sure all settings are applied m_isStarted = true; - CLogMessage(this).info(u"Started [Input: %1] [Output: %2]") << inputDevice.getName() << outputDevice.getName(); + CLogMessage(this).info(u"Started [Input: %1] [Output: %2]") << useInputDevice.getName() << useOutputDevice.getName(); this->onTimerUpdate(); // update values - emit this->startedAudio(inputDevice, outputDevice); + emit this->startedAudio(useInputDevice, useOutputDevice); } void CAfvClient::startAudio(const QString &inputDeviceName, const QString &outputDeviceName) @@ -328,6 +338,10 @@ namespace BlackCore m_output->stop(); } CLogMessage(this).info(u"Client stopped"); + + emit this->inputVolumePeakVU(0.0); + emit this->outputVolumePeakVU(0.0); + emit this->stoppedAudio(); } void CAfvClient::setReceiveAudio(bool receive) diff --git a/src/blackcore/afv/clients/afvclient.h b/src/blackcore/afv/clients/afvclient.h index 58d1348c6..65f7a7919 100644 --- a/src/blackcore/afv/clients/afvclient.h +++ b/src/blackcore/afv/clients/afvclient.h @@ -118,6 +118,7 @@ namespace BlackCore //! @} //! Start/stop client @{ + void startAudio(); void startAudio(const BlackMisc::Audio::CAudioDeviceInfo &inputDevice, const BlackMisc::Audio::CAudioDeviceInfo &outputDevice); Q_INVOKABLE void startAudio(const QString &inputDeviceName, const QString &outputDeviceName); void stopAudio(); @@ -271,6 +272,9 @@ namespace BlackCore //! Started audio with devices void startedAudio(const BlackMisc::Audio::CAudioDeviceInfo &inputDevice, const BlackMisc::Audio::CAudioDeviceInfo &outputDevice); + //! Audio has been stopped + void stoppedAudio(); + protected: //! \copydoc BlackMisc::CContinuousWorker::initialize virtual void initialize() override; diff --git a/src/blackcore/context/contextaudio.cpp b/src/blackcore/context/contextaudio.cpp index 6845b75c5..c5754a257 100644 --- a/src/blackcore/context/contextaudio.cpp +++ b/src/blackcore/context/contextaudio.cpp @@ -142,6 +142,7 @@ namespace BlackCore // connect(m_voiceClient, &CAfvClient::receivingCallsignsChanged, this, &CContextAudioBase::receivingCallsignsChanged, Qt::QueuedConnection); // connect(m_voiceClient, &CAfvClient::updatedFromOwnAircraftCockpit, this, &CContextAudioBase::updatedFromOwnAircraftCockpit, Qt::QueuedConnection); connect(m_voiceClient, &CAfvClient::startedAudio, this, &CContextAudioBase::startedAudio, Qt::QueuedConnection); + connect(m_voiceClient, &CAfvClient::stoppedAudio, this, &CContextAudioBase::stoppedAudio, Qt::QueuedConnection); connect(m_voiceClient, &CAfvClient::ptt, this, &CContextAudioBase::ptt, Qt::QueuedConnection); const CSettings as = m_audioSettings.getThreadLocal(); @@ -204,6 +205,11 @@ namespace BlackCore return m_voiceClient && m_voiceClient->isConnected(); } + bool CContextAudioBase::isAudioStarted() const + { + return m_voiceClient && m_voiceClient->isStarted(); + } + QString CContextAudioBase::audioRunsWhereInfo() const { static const QString s = QStringLiteral("Audio on '%1', '%2'.").arg(audioRunsWhere().getMachineName(), audioRunsWhere().getProcessName()); diff --git a/src/blackcore/context/contextaudio.h b/src/blackcore/context/contextaudio.h index 05a1892a7..db07bbf30 100644 --- a/src/blackcore/context/contextaudio.h +++ b/src/blackcore/context/contextaudio.h @@ -177,9 +177,12 @@ namespace BlackCore //! Is COM unit transmitting? bool isTransmittingComUnit(BlackMisc::Aviation::CComSystem::ComUnit comUnit) const; - //! Is audio started + //! Is audio connected? bool isAudioConnected() const; + //! Is audio started? + bool isAudioStarted() const; + //! \todo WORKAROUND to hide the "local signals" Afv::Clients::CAfvClient *afvClient() const { return m_voiceClient; } @@ -212,9 +215,12 @@ namespace BlackCore //! Changed audio devices (e.g. device enabled/disable) void changedAudioDevices(const BlackMisc::Audio::CAudioDeviceInfoList &devices); - //! Audio started with + //! Audio started with devices void startedAudio(const BlackMisc::Audio::CAudioDeviceInfo &input, const BlackMisc::Audio::CAudioDeviceInfo &output); + //! Audio stopped + void stoppedAudio(); + //! PTT in voice client received void ptt(bool active, BlackMisc::Audio::PTTCOM pttcom, const BlackMisc::CIdentifier &identifier);