Change CVoiceVatlib to use new IKeyboard interface

refs #83
This commit is contained in:
Roland Winklmeier
2014-03-05 16:18:21 +01:00
parent f09c77ebd0
commit abb20a5154
5 changed files with 30 additions and 120 deletions

View File

@@ -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);

View File

@@ -121,6 +121,10 @@ namespace BlackCore
private:
CVoiceVatlib *m_voice; //!< underlying voice lib
IKeyboard *m_keyboard;
IKeyboard::RegistrationHandle m_handlePtt;
IContextSettings *m_contextSettings;
};
}

View File

@@ -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 (...)
{

View File

@@ -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 */

View File

@@ -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