From b511f2ffaabe9a5c9688b5034e4f08700c25ad15 Mon Sep 17 00:00:00 2001 From: Roland Winklmeier Date: Fri, 29 Nov 2013 21:47:49 +0100 Subject: [PATCH] Completed enumeration of audio devices refs #36 - Cvatlib_Voice_Simple object is created and setup - enumerates automatically a list of in and output devices. - both device lists are accessable immediately - added a sample demonstrating the interface so far refs #81 --- client.pro | 1 + samples/voiceclient/main.cpp | 29 ++++++++++++++++ samples/voiceclient/sample_voice_client.pro | 26 +++++++++++++++ src/blackcore/voiceclient.h | 4 +-- src/blackcore/voiceclient_vatlib.cpp | 37 +++++++++++++++++---- src/blackcore/voiceclient_vatlib.h | 14 ++++---- 6 files changed, 97 insertions(+), 14 deletions(-) create mode 100644 samples/voiceclient/main.cpp create mode 100644 samples/voiceclient/sample_voice_client.pro diff --git a/client.pro b/client.pro index c24d9eab6..a6a28e996 100644 --- a/client.pro +++ b/client.pro @@ -52,6 +52,7 @@ equals(WITH_SAMPLES, ON) { SUBDIRS += samples/blackgui/sample_blackgui.pro SUBDIRS += samples/blackcore/sample_blackcore.pro SUBDIRS += samples/blackmisc/sample_blackmisc.pro + SUBDIRS += samples/voiceclient/sample_voice_client.pro } equals(WITH_UNITTESTS, ON) { diff --git a/samples/voiceclient/main.cpp b/samples/voiceclient/main.cpp new file mode 100644 index 000000000..8c9d56b7b --- /dev/null +++ b/samples/voiceclient/main.cpp @@ -0,0 +1,29 @@ +/* Copyright (C) 2013 VATSIM Community / authors + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "blackcore/voiceclient_vatlib.h" +#include +#include + +using namespace BlackMisc::Voice; + +int main(int argc, char *argv[]) +{ + QCoreApplication app (argc, argv); + BlackMisc::IContext::getInstance().setObject(*new BlackMisc::CDebug()); + BlackMisc::IContext::getInstance().setObject(*new BlackCore::CVoiceClientVatlib()); + + BlackCore::IVoiceClient *voiceClient = BlackMisc::IContext::getInstance().singleton(); + QList outputDevices = voiceClient->audioOutputDevices(0); + + qDebug() << "Found " << outputDevices.size() << " output devices:"; + + foreach (COutputAudioDevice device, outputDevices) + { + qDebug() << device.name(); + } + + app.exec(); +} diff --git a/samples/voiceclient/sample_voice_client.pro b/samples/voiceclient/sample_voice_client.pro new file mode 100644 index 000000000..ddd23a14c --- /dev/null +++ b/samples/voiceclient/sample_voice_client.pro @@ -0,0 +1,26 @@ +include (../../externals.pri) + +QT += core dbus +QT -= gui + +TARGET = sample_voice_client +TEMPLATE = app + +CONFIG += console c++11 +CONFIG -= app_bundle + +DEPENDPATH += . ../../src +INCLUDEPATH += . ../../src + +SOURCES += *.cpp +HEADERS += *.h + +LIBS += -L../../lib -lblackcore -lblackmisc +LIBS += -lvatlib + +win32:!win32-g++*: PRE_TARGETDEPS += ../../lib/blackmisc.lib \ + ../../lib/blackcore.lib +else: PRE_TARGETDEPS += ../../lib/libblackmisc.a \ + ../../lib/libblackcore.a + +DESTDIR = ../../bin diff --git a/src/blackcore/voiceclient.h b/src/blackcore/voiceclient.h index 47ffd869d..9f7394eec 100644 --- a/src/blackcore/voiceclient.h +++ b/src/blackcore/voiceclient.h @@ -60,8 +60,8 @@ namespace BlackCore // and signals emitted in case of a change. This way other objects can listen to this signals and call the getter // again. virtual void roomUserList(const uint32_t comUnit) = 0; - virtual void audioInputDevices(const uint32_t comUnit) = 0; - virtual void audioOutputDevices(const uint32_t comUnit) = 0; + virtual const QList & audioInputDevices(const uint32_t comUnit) const = 0; + virtual const QList & audioOutputDevices(const uint32_t comUnit) const = 0; virtual void setInputDevice(const uint32_t comUnit, BlackMisc::Voice::CInputAudioDevice &device) = 0; virtual void setOutputDevice(const uint32_t comUnit, BlackMisc::Voice::COutputAudioDevice &device) = 0; diff --git a/src/blackcore/voiceclient_vatlib.cpp b/src/blackcore/voiceclient_vatlib.cpp index 58cd02e25..e41e16052 100644 --- a/src/blackcore/voiceclient_vatlib.cpp +++ b/src/blackcore/voiceclient_vatlib.cpp @@ -5,13 +5,22 @@ #include "voiceclient_vatlib.h" +#include + namespace BlackCore { - CVoiceClientVatlib::CVoiceClientVatlib(QObject *parent) : IVoiceClient(parent), m_voice(Create_Cvatlib_Voice_Simple()) { + m_voice->Setup(true, 3290, 2, 1, onRoomStatusUpdate, this); + m_voice->GetInputDevices(onInputHardwareDeviceReceived, this); + m_voice->GetOutputDevices(onOutputHardwareDeviceReceived, this); + } + + CVoiceClientVatlib::~CVoiceClientVatlib() + { + } void CVoiceClientVatlib::setCallsign(const BlackMisc::Aviation::CCallsign &callsign) @@ -59,14 +68,14 @@ namespace BlackCore } - void CVoiceClientVatlib::audioInputDevices(const uint32_t comIndex) + const QList &CVoiceClientVatlib::audioInputDevices(const uint32_t comIndex) const { - + return m_inputDevices; } - void CVoiceClientVatlib::audioOutputDevices(const uint32_t comIndex) + const QList &CVoiceClientVatlib::audioOutputDevices(const uint32_t comIndex) const { - + return m_outputDevices; } void CVoiceClientVatlib::setInputDevice(const uint32_t comUnit, BlackMisc::Voice::CInputAudioDevice &device) @@ -84,6 +93,15 @@ namespace BlackCore } + /********************************** * * * * * * * * * * * * * * * * * * * ************************************/ + /********************************** shimlib callbacks ************************************/ + /********************************** * * * * * * * * * * * * * * * * * * * ************************************/ + + CVoiceClientVatlib *cbvar_cast(void *cbvar) + { + return static_cast(cbvar); + } + void CVoiceClientVatlib::onRoomStatusUpdate(Cvatlib_Voice_Simple *obj, Cvatlib_Voice_Simple::roomStatusUpdate upd, int32_t roomIndex, void *cbVar) { @@ -94,9 +112,16 @@ namespace BlackCore } - void CVoiceClientVatlib::onHardwareDeviceReceived(Cvatlib_Voice_Simple *obj, const char *name, void *cbVar) + void CVoiceClientVatlib::onInputHardwareDeviceReceived(Cvatlib_Voice_Simple *obj, const char *name, void *cbVar) { + BlackMisc::Voice::CInputAudioDevice inputDevice(cbvar_cast(cbVar)->m_inputDevices.size(), QString(name)); + cbvar_cast(cbVar)->m_inputDevices.append(inputDevice); + } + void CVoiceClientVatlib::onOutputHardwareDeviceReceived(Cvatlib_Voice_Simple *obj, const char *name, void *cbVar) + { + BlackMisc::Voice::COutputAudioDevice outputDevice(cbvar_cast(cbVar)->m_outputDevices.size(), QString(name)); + cbvar_cast(cbVar)->m_outputDevices.append(outputDevice); } } // namespace BlackCore diff --git a/src/blackcore/voiceclient_vatlib.h b/src/blackcore/voiceclient_vatlib.h index 6d4bb8da1..d116e7e0e 100644 --- a/src/blackcore/voiceclient_vatlib.h +++ b/src/blackcore/voiceclient_vatlib.h @@ -32,8 +32,8 @@ namespace BlackCore virtual bool isConnected(const uint32_t comUnit); virtual void roomUserList(const uint32_t comUnit); - virtual void audioInputDevices(const uint32_t comUnit); - virtual void audioOutputDevices(const uint32_t comUnit); + virtual const QList &audioInputDevices(const uint32_t comUnit) const ; + virtual const QList & audioOutputDevices(const uint32_t comUnit) const; virtual void setInputDevice(const uint32_t comUnit, BlackMisc::Voice::CInputAudioDevice &device); virtual void setOutputDevice(const uint32_t comUnit, BlackMisc::Voice::COutputAudioDevice &device); @@ -47,14 +47,16 @@ namespace BlackCore private: // shimlib callbacks - void onRoomStatusUpdate(Cvatlib_Voice_Simple* obj, Cvatlib_Voice_Simple::roomStatusUpdate upd, INT roomIndex, void* cbVar); - void onRoomUserReceived(Cvatlib_Voice_Simple* obj, const char* name, void* cbVar); - void onHardwareDeviceReceived(Cvatlib_Voice_Simple* obj, const char* name, void* cbVar); + static void onRoomStatusUpdate(Cvatlib_Voice_Simple* obj, Cvatlib_Voice_Simple::roomStatusUpdate upd, INT roomIndex, void* cbVar); + static void onRoomUserReceived(Cvatlib_Voice_Simple* obj, const char* name, void* cbVar); + static void onInputHardwareDeviceReceived(Cvatlib_Voice_Simple* obj, const char* name, void* cbVar); + static void onOutputHardwareDeviceReceived(Cvatlib_Voice_Simple* obj, const char* name, void* cbVar); QScopedPointer m_voice; BlackMisc::Aviation::CCallsign m_callsign; QMap m_voiceRoomMap; - + QList m_inputDevices; + QList m_outputDevices; }; } // namespace BlackCore