mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-07 19:35:32 +08:00
@@ -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);
|
||||
|
||||
@@ -121,6 +121,10 @@ namespace BlackCore
|
||||
|
||||
private:
|
||||
CVoiceVatlib *m_voice; //!< underlying voice lib
|
||||
IKeyboard *m_keyboard;
|
||||
IKeyboard::RegistrationHandle m_handlePtt;
|
||||
IContextSettings *m_contextSettings;
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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 (...)
|
||||
{
|
||||
|
||||
@@ -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<Cvatlib_Voice_Simple, Cvatlib_Voice_Simple_Deleter> m_voice;
|
||||
QScopedPointer<QAudioOutput> 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<CKeyboard> m_keyboardPtt; /*!< handler for PTT */
|
||||
bool m_pushToTalk; /*!< flag, PTT pressed */
|
||||
float m_inputSquelch;
|
||||
Cvatlib_Voice_Simple::agc m_micTestResult;
|
||||
QMap <ComUnit, BlackMisc::Aviation::CCallsignList> m_voiceRoomCallsigns; /*!< voice room callsigns */
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user