diff --git a/src/blackcore/context_audio_impl.cpp b/src/blackcore/context_audio_impl.cpp index 9f2def14c..5d4435f21 100644 --- a/src/blackcore/context_audio_impl.cpp +++ b/src/blackcore/context_audio_impl.cpp @@ -14,6 +14,7 @@ using namespace BlackMisc; using namespace BlackMisc::Aviation; using namespace BlackMisc::Audio; +using namespace BlackMisc::Hardware; namespace BlackCore { @@ -21,10 +22,14 @@ namespace BlackCore /* * Init this context */ - CContextAudio::CContextAudio(QObject *parent) : IContextAudio(parent), m_voice(nullptr) + CContextAudio::CContextAudio(QObject *parent) : + IContextAudio(parent), + m_voice(nullptr), + m_keyboard(nullptr) { // 1. Init by "voice driver" this->m_voice = new CVoiceVatlib(this); + m_keyboard = IKeyboard::getInstance(); // 2. Signal / slots connect(this->m_voice, &CVoiceVatlib::micTestFinished, this, &CContextAudio::audioTestCompleted); diff --git a/src/blackcore/context_audio_impl.h b/src/blackcore/context_audio_impl.h index c003fc4c8..f31d97106 100644 --- a/src/blackcore/context_audio_impl.h +++ b/src/blackcore/context_audio_impl.h @@ -121,6 +121,10 @@ namespace BlackCore private: CVoiceVatlib *m_voice; //!< underlying voice lib + IKeyboard *m_keyboard; + IKeyboard::RegistrationHandle m_handlePtt; + IContextSettings *m_contextSettings; + }; } diff --git a/src/blackcore/voice_vatlib.cpp b/src/blackcore/voice_vatlib.cpp index 16773d7ea..1070e2c11 100644 --- a/src/blackcore/voice_vatlib.cpp +++ b/src/blackcore/voice_vatlib.cpp @@ -19,8 +19,6 @@ namespace BlackCore IVoice(parent), m_voice(Cvatlib_Voice_Simple::Create()), m_audioOutput(new QAudioOutput()), - m_keyboardPtt(new CKeyboard(nullptr)), - m_pushToTalk(false), m_inputSquelch(-1), m_micTestResult(Cvatlib_Voice_Simple::agc_Ok), m_temporaryUserRoomIndex(CVoiceVatlib::InvalidRoomIndex) @@ -49,9 +47,6 @@ namespace BlackCore // do processing this->startTimer(100); - - // as last thing enable keyboard handling - this->m_keyboardPtt.data()->s_voice = this; } catch (...) { @@ -491,7 +486,6 @@ namespace BlackCore try { this->m_voice->DoProcessing(); - this->handlePushToTalk(); } catch (...) { diff --git a/src/blackcore/voice_vatlib.h b/src/blackcore/voice_vatlib.h index 78d0cf2d3..e1fdf74dc 100644 --- a/src/blackcore/voice_vatlib.h +++ b/src/blackcore/voice_vatlib.h @@ -133,6 +133,12 @@ namespace BlackCore return !enabled; } + /*! + * \brief Starts or stops voice transmission + * \param value + */ + void handlePushToTalk(bool value = false); + /************************************************ * NON API METHODS: * The following methods are not part of the @@ -195,7 +201,6 @@ namespace BlackCore void removeUserFromRoom(const ComUnit comUnit, const QString &callsign); void exceptionDispatcher(const char *caller); void enableAudio(const ComUnit comUnit); - void handlePushToTalk(); void changeConnectionStatus(ComUnit comUnit, ConnectionStatus newStatus); /*! @@ -213,69 +218,6 @@ namespace BlackCore } }; -#ifdef Q_OS_WIN - - /*! - * \brief Keyboard PTT handling class - */ - class CKeyboard - { - public: - // Keyboard hook - static HHOOK s_keyboardHook; - static CVoiceVatlib *s_voice; - static LRESULT CALLBACK keyboardProcedure(int nCode, WPARAM wParam, LPARAM lParam); - - /*! - * \brief Constructor, keyboard handling - */ - CKeyboard(CVoiceVatlib *vatlib) - { - CVoiceVatlib::CKeyboard::s_voice = vatlib; - CVoiceVatlib::CKeyboard::s_keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, CVoiceVatlib::CKeyboard::keyboardProcedure, GetModuleHandle(NULL), 0); - } - - /*! - * Destructor - */ - ~CKeyboard() - { - if (!CVoiceVatlib::CKeyboard::s_keyboardHook) return; - UnhookWindowsHookEx(CVoiceVatlib::CKeyboard::s_keyboardHook); - CVoiceVatlib::CKeyboard::s_keyboardHook = nullptr; - CVoiceVatlib::CKeyboard::s_voice = nullptr; - } - }; - -#else - - /*! - * \brief Keyboard PTT handling class - */ - class CKeyboard - { - public: - static CVoiceVatlib *s_voice; - - /*! - * \brief Constructor, keyboard handling - */ - CKeyboard(CVoiceVatlib *vatlib) - { - CVoiceVatlib::CKeyboard::s_voice = vatlib; - } - - /*! - * Destructor - */ - ~CKeyboard() - { - // void - } - }; - -#endif - QScopedPointer m_voice; QScopedPointer m_audioOutput; BlackMisc::Aviation::CCallsign m_aircraftCallsign; /*!< own callsign to join voice rooms */ @@ -283,8 +225,6 @@ namespace BlackCore BlackMisc::Audio::CAudioDeviceList m_devices; /*!< in and output devices */ BlackMisc::Audio::CAudioDevice m_currentOutputDevice; BlackMisc::Audio::CAudioDevice m_currentInputDevice; - QScopedPointer m_keyboardPtt; /*!< handler for PTT */ - bool m_pushToTalk; /*!< flag, PTT pressed */ float m_inputSquelch; Cvatlib_Voice_Simple::agc m_micTestResult; QMap m_voiceRoomCallsigns; /*!< voice room callsigns */ diff --git a/src/blackcore/voice_vatlib_ptt.cpp b/src/blackcore/voice_vatlib_ptt.cpp index ae03ac9ed..573716fbf 100644 --- a/src/blackcore/voice_vatlib_ptt.cpp +++ b/src/blackcore/voice_vatlib_ptt.cpp @@ -10,70 +10,37 @@ using namespace BlackMisc::Audio; namespace BlackCore { - - CVoiceVatlib *CVoiceVatlib::CKeyboard::s_voice = nullptr; - -#if defined(Q_OS_WIN) - - HHOOK CVoiceVatlib::CKeyboard::s_keyboardHook = nullptr; - - /* - * Keyboard handling itself - */ - LRESULT CALLBACK CVoiceVatlib::CKeyboard::keyboardProcedure(int nCode, WPARAM wParam, LPARAM lParam) - { - if (nCode < 0) // do not process message - return CallNextHookEx(CVoiceVatlib::CKeyboard::s_keyboardHook, nCode, wParam, lParam); - - // precheck - if (!CVoiceVatlib::CKeyboard::s_keyboardHook || !CVoiceVatlib::CKeyboard::s_voice) - return CallNextHookEx(CVoiceVatlib::CKeyboard::s_keyboardHook, nCode, wParam, lParam); - - // Check for a key down press - if (nCode == HC_ACTION) - { - KBDLLHOOKSTRUCT *pKeyboard = (KBDLLHOOKSTRUCT *)lParam; - // http://msdn.microsoft.com/en-us/library/windows/desktop/ms644967(v=vs.85).aspx - // http://stackoverflow.com/questions/18917716/windows-how-to-query-state-of-modifier-keys-within-low-level-keyboard-hook - if (wParam == WM_KEYDOWN) - { - if (pKeyboard->vkCode == VK_LCONTROL) CVoiceVatlib::CKeyboard::s_voice->m_pushToTalk = true; - } - else if (wParam == WM_KEYUP) - { - if (pKeyboard->vkCode == VK_LCONTROL) CVoiceVatlib::CKeyboard::s_voice->m_pushToTalk = false; - } - } - return CallNextHookEx(CVoiceVatlib::CKeyboard::s_keyboardHook, nCode, wParam, lParam); ; // not processed flag - } - /* * Handle PTT */ - void CVoiceVatlib::handlePushToTalk() + void CVoiceVatlib::handlePushToTalk(bool value) { + qDebug() << "PTT"; if (!this->m_voice) return; CVoiceRoomList rooms = this->getComVoiceRoomsWithAudioStatus(); CVoiceRoom room1 = rooms[0]; CVoiceRoom room2 = rooms[1]; + + if (value) qDebug() << "Start transmitting..."; + else qDebug() << "Stop transmitting..."; + if (room1.isConnected()) { - if (this->m_pushToTalk && !this->m_voice->IsAudioPlaying(IVoice::COM1)) + if (value) + { this->startTransmitting(IVoice::COM1); - else if (!this->m_pushToTalk) + } + else + { this->stopTransmitting(IVoice::COM1); + } } if (room2.isConnected()) { - if (this->m_pushToTalk && !this->m_voice->IsAudioPlaying(IVoice::COM2)) + if (value) this->startTransmitting(IVoice::COM2); - else if (!this->m_pushToTalk) + else this->stopTransmitting(IVoice::COM2); } } - -#else - void CVoiceVatlib::handlePushToTalk() {} -#endif - } // namespace