mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-27 11:05:44 +08:00
@@ -14,6 +14,7 @@
|
|||||||
using namespace BlackMisc;
|
using namespace BlackMisc;
|
||||||
using namespace BlackMisc::Aviation;
|
using namespace BlackMisc::Aviation;
|
||||||
using namespace BlackMisc::Audio;
|
using namespace BlackMisc::Audio;
|
||||||
|
using namespace BlackMisc::Hardware;
|
||||||
|
|
||||||
namespace BlackCore
|
namespace BlackCore
|
||||||
{
|
{
|
||||||
@@ -21,10 +22,14 @@ namespace BlackCore
|
|||||||
/*
|
/*
|
||||||
* Init this context
|
* 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"
|
// 1. Init by "voice driver"
|
||||||
this->m_voice = new CVoiceVatlib(this);
|
this->m_voice = new CVoiceVatlib(this);
|
||||||
|
m_keyboard = IKeyboard::getInstance();
|
||||||
|
|
||||||
// 2. Signal / slots
|
// 2. Signal / slots
|
||||||
connect(this->m_voice, &CVoiceVatlib::micTestFinished, this, &CContextAudio::audioTestCompleted);
|
connect(this->m_voice, &CVoiceVatlib::micTestFinished, this, &CContextAudio::audioTestCompleted);
|
||||||
|
|||||||
@@ -121,6 +121,10 @@ namespace BlackCore
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
CVoiceVatlib *m_voice; //!< underlying voice lib
|
CVoiceVatlib *m_voice; //!< underlying voice lib
|
||||||
|
IKeyboard *m_keyboard;
|
||||||
|
IKeyboard::RegistrationHandle m_handlePtt;
|
||||||
|
IContextSettings *m_contextSettings;
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,8 +19,6 @@ namespace BlackCore
|
|||||||
IVoice(parent),
|
IVoice(parent),
|
||||||
m_voice(Cvatlib_Voice_Simple::Create()),
|
m_voice(Cvatlib_Voice_Simple::Create()),
|
||||||
m_audioOutput(new QAudioOutput()),
|
m_audioOutput(new QAudioOutput()),
|
||||||
m_keyboardPtt(new CKeyboard(nullptr)),
|
|
||||||
m_pushToTalk(false),
|
|
||||||
m_inputSquelch(-1),
|
m_inputSquelch(-1),
|
||||||
m_micTestResult(Cvatlib_Voice_Simple::agc_Ok),
|
m_micTestResult(Cvatlib_Voice_Simple::agc_Ok),
|
||||||
m_temporaryUserRoomIndex(CVoiceVatlib::InvalidRoomIndex)
|
m_temporaryUserRoomIndex(CVoiceVatlib::InvalidRoomIndex)
|
||||||
@@ -49,9 +47,6 @@ namespace BlackCore
|
|||||||
|
|
||||||
// do processing
|
// do processing
|
||||||
this->startTimer(100);
|
this->startTimer(100);
|
||||||
|
|
||||||
// as last thing enable keyboard handling
|
|
||||||
this->m_keyboardPtt.data()->s_voice = this;
|
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
@@ -491,7 +486,6 @@ namespace BlackCore
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
this->m_voice->DoProcessing();
|
this->m_voice->DoProcessing();
|
||||||
this->handlePushToTalk();
|
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -133,6 +133,12 @@ namespace BlackCore
|
|||||||
return !enabled;
|
return !enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Starts or stops voice transmission
|
||||||
|
* \param value
|
||||||
|
*/
|
||||||
|
void handlePushToTalk(bool value = false);
|
||||||
|
|
||||||
/************************************************
|
/************************************************
|
||||||
* NON API METHODS:
|
* NON API METHODS:
|
||||||
* The following methods are not part of the
|
* The following methods are not part of the
|
||||||
@@ -195,7 +201,6 @@ namespace BlackCore
|
|||||||
void removeUserFromRoom(const ComUnit comUnit, const QString &callsign);
|
void removeUserFromRoom(const ComUnit comUnit, const QString &callsign);
|
||||||
void exceptionDispatcher(const char *caller);
|
void exceptionDispatcher(const char *caller);
|
||||||
void enableAudio(const ComUnit comUnit);
|
void enableAudio(const ComUnit comUnit);
|
||||||
void handlePushToTalk();
|
|
||||||
void changeConnectionStatus(ComUnit comUnit, ConnectionStatus newStatus);
|
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<Cvatlib_Voice_Simple, Cvatlib_Voice_Simple_Deleter> m_voice;
|
||||||
QScopedPointer<QAudioOutput> m_audioOutput;
|
QScopedPointer<QAudioOutput> m_audioOutput;
|
||||||
BlackMisc::Aviation::CCallsign m_aircraftCallsign; /*!< own callsign to join voice rooms */
|
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::CAudioDeviceList m_devices; /*!< in and output devices */
|
||||||
BlackMisc::Audio::CAudioDevice m_currentOutputDevice;
|
BlackMisc::Audio::CAudioDevice m_currentOutputDevice;
|
||||||
BlackMisc::Audio::CAudioDevice m_currentInputDevice;
|
BlackMisc::Audio::CAudioDevice m_currentInputDevice;
|
||||||
QScopedPointer<CKeyboard> m_keyboardPtt; /*!< handler for PTT */
|
|
||||||
bool m_pushToTalk; /*!< flag, PTT pressed */
|
|
||||||
float m_inputSquelch;
|
float m_inputSquelch;
|
||||||
Cvatlib_Voice_Simple::agc m_micTestResult;
|
Cvatlib_Voice_Simple::agc m_micTestResult;
|
||||||
QMap <ComUnit, BlackMisc::Aviation::CCallsignList> m_voiceRoomCallsigns; /*!< voice room callsigns */
|
QMap <ComUnit, BlackMisc::Aviation::CCallsignList> m_voiceRoomCallsigns; /*!< voice room callsigns */
|
||||||
|
|||||||
@@ -10,70 +10,37 @@ using namespace BlackMisc::Audio;
|
|||||||
|
|
||||||
namespace BlackCore
|
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
|
* Handle PTT
|
||||||
*/
|
*/
|
||||||
void CVoiceVatlib::handlePushToTalk()
|
void CVoiceVatlib::handlePushToTalk(bool value)
|
||||||
{
|
{
|
||||||
|
qDebug() << "PTT";
|
||||||
if (!this->m_voice) return;
|
if (!this->m_voice) return;
|
||||||
CVoiceRoomList rooms = this->getComVoiceRoomsWithAudioStatus();
|
CVoiceRoomList rooms = this->getComVoiceRoomsWithAudioStatus();
|
||||||
CVoiceRoom room1 = rooms[0];
|
CVoiceRoom room1 = rooms[0];
|
||||||
CVoiceRoom room2 = rooms[1];
|
CVoiceRoom room2 = rooms[1];
|
||||||
|
|
||||||
|
if (value) qDebug() << "Start transmitting...";
|
||||||
|
else qDebug() << "Stop transmitting...";
|
||||||
|
|
||||||
if (room1.isConnected())
|
if (room1.isConnected())
|
||||||
{
|
{
|
||||||
if (this->m_pushToTalk && !this->m_voice->IsAudioPlaying(IVoice::COM1))
|
if (value)
|
||||||
|
{
|
||||||
this->startTransmitting(IVoice::COM1);
|
this->startTransmitting(IVoice::COM1);
|
||||||
else if (!this->m_pushToTalk)
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
this->stopTransmitting(IVoice::COM1);
|
this->stopTransmitting(IVoice::COM1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (room2.isConnected())
|
if (room2.isConnected())
|
||||||
{
|
{
|
||||||
if (this->m_pushToTalk && !this->m_voice->IsAudioPlaying(IVoice::COM2))
|
if (value)
|
||||||
this->startTransmitting(IVoice::COM2);
|
this->startTransmitting(IVoice::COM2);
|
||||||
else if (!this->m_pushToTalk)
|
else
|
||||||
this->stopTransmitting(IVoice::COM2);
|
this->stopTransmitting(IVoice::COM2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
|
||||||
void CVoiceVatlib::handlePushToTalk() {}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|||||||
Reference in New Issue
Block a user