From 158de31c0bc2f01cb356e1c56c3061f6b1a3979e Mon Sep 17 00:00:00 2001 From: Roland Winklmeier Date: Fri, 29 Nov 2013 00:25:51 +0100 Subject: [PATCH] Added CAudioDevice and cleaning up IVoice refs #36 - Added a common class CAudioDevice encapsulating each audio device - One subclass for input and output devices - Changed IVoice interface slightly to better fit into the event flow refs #81 --- src/blackcore/voiceclient.h | 28 ++-- src/blackcore/voiceclient_vatlib.cpp | 25 +++- src/blackcore/voiceclient_vatlib.h | 15 ++- src/blackmisc/blackmisc.pro | 3 +- src/blackmisc/vaudiodevice.cpp | 91 +++++++++++++ src/blackmisc/vaudiodevice.h | 190 +++++++++++++++++++++++++++ src/blackmisc/vvoiceroom.cpp | 9 ++ 7 files changed, 340 insertions(+), 21 deletions(-) create mode 100644 src/blackmisc/vaudiodevice.cpp create mode 100644 src/blackmisc/vaudiodevice.h diff --git a/src/blackcore/voiceclient.h b/src/blackcore/voiceclient.h index 1308efa96..47ffd869d 100644 --- a/src/blackcore/voiceclient.h +++ b/src/blackcore/voiceclient.h @@ -13,6 +13,7 @@ #include "../blackmisc/context.h" #include "../blackmisc/avcallsign.h" #include "../blackmisc/vvoiceroom.h" +#include "../blackmisc/vaudiodevice.h" #include @@ -25,11 +26,9 @@ namespace BlackCore /* TODOS: * - Find a replacement for comUnit. Maybe map it to the ComUnit in the aircraft as a class - * - Object: class encapsulating a hardware device (vatlib uses integer index, which is necessarily persistent) * - Settings: Settings classes to store hardware settings (squelch, background noise, hardware device) */ - Q_OBJECT protected: @@ -54,13 +53,23 @@ namespace BlackCore virtual bool isReceiving(const uint32_t comUnit) = 0; virtual bool isConnected(const uint32_t comUnit) = 0; - virtual void getUserList(const uint32_t comUnit) = 0; - virtual void getInputDevices(const uint32_t comUnit) = 0; - virtual void getOutputDevices(const uint32_t comUnit) = 0; + + // The following methods should be called everytime you receive a update signal. + // Reason: + // We cannot say when the device and user lists are completed. Instead information is cached internally + // 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 void setInputDevice(const uint32_t comUnit, BlackMisc::Voice::CInputAudioDevice &device) = 0; + virtual void setOutputDevice(const uint32_t comUnit, BlackMisc::Voice::COutputAudioDevice &device) = 0; virtual const BlackMisc::Voice::CVoiceRoom &voiceRoom (const uint32_t comUnit) = 0; signals: + // Signals regarding the voice server connection void notConnected(const uint32_t comUnit); void connecting(const uint32_t comUnit); void connected(const uint32_t comUnit); @@ -68,16 +77,15 @@ namespace BlackCore void kicked(const uint32_t comUnit); void disconnecting(const uint32_t comUnit); void disconnected(const uint32_t comUnit); + + // Signals about users joining and leaving void userJoined(const uint32_t comUnit, const BlackMisc::Aviation::CCallsign &callsign); void userLeft(const uint32_t comUnit, const BlackMisc::Aviation::CCallsign &callsign); + + // Audio signals void audioStarted(const uint32_t comUnit); void audioStopped(const uint32_t comUnit); - void userList(const uint32_t comIndex); - - void outputDeviceList(); - void inputDeviceList(); - public slots: }; diff --git a/src/blackcore/voiceclient_vatlib.cpp b/src/blackcore/voiceclient_vatlib.cpp index c014266a5..58cd02e25 100644 --- a/src/blackcore/voiceclient_vatlib.cpp +++ b/src/blackcore/voiceclient_vatlib.cpp @@ -19,12 +19,12 @@ namespace BlackCore m_callsign = callsign; } - void CVoiceClientVatlib::joinVoiceServer(const uint32_t comIndex, const QString &serverSpec) + void CVoiceClientVatlib::joinVoiceRoom(const uint32_t comUnit, const BlackMisc::Voice::CVoiceRoom &voiceRoom) { } - void CVoiceClientVatlib::leaveVoiceServer(const uint32_t comIndex) + void CVoiceClientVatlib::leaveVoiceRoom(const uint32_t comUnit) { } @@ -54,17 +54,32 @@ namespace BlackCore } - void CVoiceClientVatlib::getUserList(const uint32_t comIndex) + void CVoiceClientVatlib::roomUserList(const uint32_t comIndex) { } - void CVoiceClientVatlib::getInputDevices(const uint32_t comIndex) + void CVoiceClientVatlib::audioInputDevices(const uint32_t comIndex) { } - void CVoiceClientVatlib::getOutputDevices(const uint32_t comIndex) + void CVoiceClientVatlib::audioOutputDevices(const uint32_t comIndex) + { + + } + + void CVoiceClientVatlib::setInputDevice(const uint32_t comUnit, BlackMisc::Voice::CInputAudioDevice &device) + { + + } + + void CVoiceClientVatlib::setOutputDevice(const uint32_t comUnit, BlackMisc::Voice::COutputAudioDevice &device) + { + + } + + const BlackMisc::Voice::CVoiceRoom &CVoiceClientVatlib::voiceRoom(const uint32_t comUnit) { } diff --git a/src/blackcore/voiceclient_vatlib.h b/src/blackcore/voiceclient_vatlib.h index f10a917a8..6d4bb8da1 100644 --- a/src/blackcore/voiceclient_vatlib.h +++ b/src/blackcore/voiceclient_vatlib.h @@ -23,17 +23,22 @@ namespace BlackCore virtual ~CVoiceClientVatlib(); virtual void setCallsign(const BlackMisc::Aviation::CCallsign &callsign); - virtual void joinVoiceServer(const uint32_t comUnit, const QString &serverSpec); - virtual void leaveVoiceServer(const uint32_t comUnit) = 0; + virtual void joinVoiceRoom(const uint32_t comUnit, const BlackMisc::Voice::CVoiceRoom &voiceRoom); + virtual void leaveVoiceRoom(const uint32_t comUnit); virtual void setVolume(const uint32_t comUnit, const uint32_t volumne); virtual void startTransmitting(const uint32_t comUnit); virtual void stopTransmitting(const uint32_t comUnit); virtual bool isReceiving(const uint32_t comUnit); virtual bool isConnected(const uint32_t comUnit); - virtual void getUserList(const uint32_t comUnit); - virtual void getInputDevices(const uint32_t comUnit); - virtual void getOutputDevices(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 void setInputDevice(const uint32_t comUnit, BlackMisc::Voice::CInputAudioDevice &device); + virtual void setOutputDevice(const uint32_t comUnit, BlackMisc::Voice::COutputAudioDevice &device); + + virtual const BlackMisc::Voice::CVoiceRoom &voiceRoom (const uint32_t comUnit); signals: diff --git a/src/blackmisc/blackmisc.pro b/src/blackmisc/blackmisc.pro index 5b609124e..bfa251f6f 100644 --- a/src/blackmisc/blackmisc.pro +++ b/src/blackmisc/blackmisc.pro @@ -20,7 +20,8 @@ TRANSLATIONS += translations/blackmisc_i18n_de.ts \ translations/blackmisc_i18n_fr.ts \ translations/blackmisc_i18n_en.ts -HEADERS += *.h +HEADERS += *.h \ + vaudiodevice.h SOURCES += *.cpp DESTDIR = ../../lib OTHER_FILES += $$TRANSLATIONS readme.txt diff --git a/src/blackmisc/vaudiodevice.cpp b/src/blackmisc/vaudiodevice.cpp new file mode 100644 index 000000000..d6baf1074 --- /dev/null +++ b/src/blackmisc/vaudiodevice.cpp @@ -0,0 +1,91 @@ +/* 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/. */ + +/*! + \file +*/ + +#include "vaudiodevice.h" +#include "blackmisc/blackmiscfreefunctions.h" + +namespace BlackMisc +{ + namespace Voice + { + bool CAudioDevice::operator ==(const CAudioDevice &other) const + { + if (&other == this) + { + return true; + } + + if (m_deviceIndex == other.m_deviceIndex) + { + return true; + } + + // otherwise + return false; + } + + /* + * Unequal? + */ + bool CAudioDevice::operator !=(const CAudioDevice &other) const + { + return !((*this) == other); + } + + uint CAudioDevice::getValueHash() const + { + QList hashs; + hashs << qHash(m_deviceIndex); + hashs << qHash(m_deviceName); + return BlackMisc::calculateHash(hashs, "CAudioDevice"); + } + + void CAudioDevice::registerMetadata() + { + qRegisterMetaType(); + qDBusRegisterMetaType(); + } + + QString CAudioDevice::convertToQString(bool i18n) const + { + return m_deviceName; + } + + /* + * Marshall to DBus + */ + void CAudioDevice::marshallToDbus(QDBusArgument &argument) const + { + argument << m_deviceIndex; + argument << m_deviceName; + } + + /* + * Unmarshall from DBus + */ + void CAudioDevice::unmarshallFromDbus(const QDBusArgument &argument) + { + argument >> m_deviceIndex; + argument >> m_deviceName; + } + + void CInputAudioDevice::registerMetadata() + { + qRegisterMetaType(); + qDBusRegisterMetaType(); + } + + void COutputAudioDevice::registerMetadata() + { + qRegisterMetaType(); + qDBusRegisterMetaType(); + } + + } // Voice +} // BlackMisc diff --git a/src/blackmisc/vaudiodevice.h b/src/blackmisc/vaudiodevice.h new file mode 100644 index 000000000..6926d45b7 --- /dev/null +++ b/src/blackmisc/vaudiodevice.h @@ -0,0 +1,190 @@ +/* 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/. */ + +/*! + \file +*/ + +#include "valueobject.h" + +#include + +#ifndef BLACKMISC_AUDIODEVICE_H +#define BLACKMISC_AUDIODEVICE_H + +namespace BlackMisc +{ + namespace Voice + { + /*! + * \brief Value object encapsulating information of a audio device. + * If you want to safe this object, use the name instead of the index, since the index can change after + * a restart. + */ + class CAudioDevice : public BlackMisc::CValueObject + { + public: + + /*! + * Default constructor. + */ + CAudioDevice() : m_deviceIndex(-1), m_deviceName("") {} + + + /*! + * Constructor. + */ + CAudioDevice(const int16_t index, const QString &name) : m_deviceIndex(index), m_deviceName(name) {} + + /*! + * \brief QVariant, required for DBus QVariant lists + * \return + */ + virtual QVariant toQVariant() const + { + return QVariant::fromValue(*this); + } + + /*! + * Get the device index + * \return + */ + int16_t index() const { return m_deviceIndex; } + + /*! + * Get the device name + * \return + */ + const QString &name() const { return m_deviceName; } + + /*! + * \brief Valid voice room object? + * \return + */ + bool isValid() const { return m_deviceIndex >= 0 && !m_deviceName.isEmpty(); } + + /*! + * \brief Equal operator == + * \param other + * @return + */ + bool operator ==(const CAudioDevice &other) const; + + /*! + * \brief Unequal operator == + * \param other + * @return + */ + bool operator !=(const CAudioDevice &other) const; + + /*! + * \brief Value hash + */ + virtual uint getValueHash() const; + + /*! + * \brief Register metadata + */ + static void registerMetadata(); + + protected: + + /*! + * \brief Rounded value as string + * \param i18n + * \return + */ + virtual QString convertToQString(bool i18n = false) const; + + /*! + * \brief Stream to DBus << + * \param argument + */ + virtual void marshallToDbus(QDBusArgument &argument) const; + + /*! + * \brief Stream from DBus >> + * \param argument + */ + virtual void unmarshallFromDbus(const QDBusArgument &argument); + + protected: + /*! + * deviceIndex is the number is the reference for the VVL. The device is selected by this index. + * The managing class needs to take care, that indexes are valid. + */ + int16_t m_deviceIndex; + QString m_deviceName; + + }; + + class CInputAudioDevice : public CAudioDevice + { + public: + /*! + * Default constructor. + */ + CInputAudioDevice() : CAudioDevice() {} + + + /*! + * Constructor. + */ + CInputAudioDevice(const int16_t index, const QString &name) : CAudioDevice(index, name) {} + + /*! + * \brief QVariant, required for DBus QVariant lists + * \return + */ + virtual QVariant toQVariant() const + { + return QVariant::fromValue(*this); + } + + /*! + * \brief Register metadata + */ + static void registerMetadata(); + + }; + + class COutputAudioDevice : public CAudioDevice + { + public: + /*! + * Default constructor. + */ + COutputAudioDevice() : CAudioDevice() {} + + + /*! + * Constructor. + */ + COutputAudioDevice(const int16_t index, const QString &name) : CAudioDevice(index, name) {} + + /*! + * \brief QVariant, required for DBus QVariant lists + * \return + */ + virtual QVariant toQVariant() const + { + return QVariant::fromValue(*this); + } + + /*! + * \brief Register metadata + */ + static void registerMetadata(); + + }; + } // Voice +} // BlackMisc + +Q_DECLARE_METATYPE(BlackMisc::Voice::CAudioDevice) +Q_DECLARE_METATYPE(BlackMisc::Voice::COutputAudioDevice) +Q_DECLARE_METATYPE(BlackMisc::Voice::CInputAudioDevice) + + +#endif // BLACKMISC_AUDIODEVICE_H diff --git a/src/blackmisc/vvoiceroom.cpp b/src/blackmisc/vvoiceroom.cpp index fe9b23a56..acc41f532 100644 --- a/src/blackmisc/vvoiceroom.cpp +++ b/src/blackmisc/vvoiceroom.cpp @@ -1,3 +1,12 @@ +/* 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/. */ + +/*! + \file +*/ + #include "vvoiceroom.h" #include "blackmisc/blackmiscfreefunctions.h"