mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-12 23:35:33 +08:00
refs #704, moved VATSIM specific stuff to ns VATSIM/subdir
This commit is contained in:
@@ -12,7 +12,7 @@
|
||||
#include "blackcore/context/contextapplication.h"
|
||||
#include "blackcore/cookiemanager.h"
|
||||
#include "blackcore/corefacade.h"
|
||||
#include "blackcore/networkvatlib.h"
|
||||
#include "blackcore/vatsim/networkvatlib.h"
|
||||
#include "blackcore/registermetadata.h"
|
||||
#include "blackcore/setupreader.h"
|
||||
#include "blackcore/webdataservices.h"
|
||||
@@ -62,6 +62,7 @@ using namespace BlackMisc::Simulation;
|
||||
using namespace BlackMisc::Weather;
|
||||
using namespace BlackCore;
|
||||
using namespace BlackCore::Context;
|
||||
using namespace BlackCore::Vatsim;
|
||||
using namespace BlackCore::Data;
|
||||
using namespace BlackCore::Db;
|
||||
|
||||
|
||||
@@ -1,140 +0,0 @@
|
||||
/* Copyright (C) 2014
|
||||
* swift project community / contributors
|
||||
*
|
||||
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
|
||||
* directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
|
||||
* including this file, may be copied, modified, propagated, or distributed except according to the terms
|
||||
* contained in the LICENSE file.
|
||||
*/
|
||||
|
||||
//! \cond PRIVATE
|
||||
|
||||
#include "blackcore/audiodevicevatlib.h"
|
||||
#include "blackmisc/logmessage.h"
|
||||
|
||||
#include <QString>
|
||||
#include <QtGlobal>
|
||||
|
||||
using namespace BlackMisc;
|
||||
using namespace BlackMisc::Audio;
|
||||
using namespace BlackMisc::Aviation;
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
//! Cast void* to a pointer of CAudioInputDeviceVatlib
|
||||
CAudioInputDeviceVatlib *cbvar_cast_inputDevice(void *cbvar)
|
||||
{
|
||||
return static_cast<CAudioInputDeviceVatlib *>(cbvar);
|
||||
}
|
||||
|
||||
//! Cast void* to a pointer of CAudioOutputDeviceVatlib
|
||||
CAudioOutputDeviceVatlib *cbvar_cast_outputDevice(void *cbvar)
|
||||
{
|
||||
return static_cast<CAudioOutputDeviceVatlib *>(cbvar);
|
||||
}
|
||||
|
||||
CAudioInputDeviceVatlib::CAudioInputDeviceVatlib(VatAudioService audioService, QObject *parent)
|
||||
: IAudioInputDevice(parent),
|
||||
m_audioService(audioService)
|
||||
{
|
||||
m_inputCodec.reset(Vat_CreateLocalInputCodec(audioService, vatCodecLegacy));
|
||||
Vat_GetInputDeviceInfo(m_inputCodec.data(), onInputHardwareDeviceReceived, this, nullptr);
|
||||
m_currentDevice = getDefaultInputDevice();
|
||||
}
|
||||
|
||||
const BlackMisc::Audio::CAudioDeviceInfoList &CAudioInputDeviceVatlib::getInputDevices() const
|
||||
{
|
||||
return m_devices;
|
||||
}
|
||||
|
||||
const BlackMisc::Audio::CAudioDeviceInfo &CAudioInputDeviceVatlib::getDefaultInputDevice() const
|
||||
{
|
||||
static BlackMisc::Audio::CAudioDeviceInfo info(BlackMisc::Audio::CAudioDeviceInfo::InputDevice, BlackMisc::Audio::CAudioDeviceInfo::defaultDeviceIndex(), "default");
|
||||
return info;
|
||||
}
|
||||
|
||||
const BlackMisc::Audio::CAudioDeviceInfo &CAudioInputDeviceVatlib::getCurrentInputDevice() const
|
||||
{
|
||||
return m_currentDevice;
|
||||
}
|
||||
|
||||
void CAudioInputDeviceVatlib::setInputDevice(const BlackMisc::Audio::CAudioDeviceInfo &device)
|
||||
{
|
||||
Q_ASSERT_X(m_inputCodec, "CAudioInputDeviceVatlib", "VatLocalCodec is invalid!");
|
||||
if (!device.isValid())
|
||||
{
|
||||
CLogMessage(this).warning("Cannot set invalid input device!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Vat_SetAudioInputDevice(m_inputCodec.data(), device.getIndex()))
|
||||
{
|
||||
CLogMessage(this).warning("Setting input device failed");
|
||||
}
|
||||
m_currentDevice = device;
|
||||
}
|
||||
|
||||
void CAudioInputDeviceVatlib::onInputHardwareDeviceReceived(int deviceIndex, const char *hardwareName, void *cbVar)
|
||||
{
|
||||
BlackMisc::Audio::CAudioDeviceInfo inputDevice(BlackMisc::Audio::CAudioDeviceInfo::InputDevice, deviceIndex, QString(hardwareName));
|
||||
cbvar_cast_inputDevice(cbVar)->m_devices.push_back(inputDevice);
|
||||
}
|
||||
|
||||
CAudioOutputDeviceVatlib::CAudioOutputDeviceVatlib(VatAudioService audioService, QObject *parent)
|
||||
: IAudioOutputDevice(parent),
|
||||
m_audioService(audioService)
|
||||
{
|
||||
m_outputCodec.reset(Vat_CreateLocalOutputCodec(m_audioService, vatCodecLegacy));
|
||||
Vat_GetOutputDeviceInfo(m_outputCodec.data(), onOutputHardwareDeviceReceived, this, nullptr);
|
||||
m_currentDevice = getDefaultOutputDevice();
|
||||
}
|
||||
|
||||
const BlackMisc::Audio::CAudioDeviceInfoList &CAudioOutputDeviceVatlib::getOutputDevices() const
|
||||
{
|
||||
return m_devices;
|
||||
}
|
||||
|
||||
const BlackMisc::Audio::CAudioDeviceInfo &CAudioOutputDeviceVatlib::getDefaultOutputDevice() const
|
||||
{
|
||||
static BlackMisc::Audio::CAudioDeviceInfo info(BlackMisc::Audio::CAudioDeviceInfo::OutputDevice, BlackMisc::Audio::CAudioDeviceInfo::defaultDeviceIndex(), "default");
|
||||
return info;
|
||||
}
|
||||
|
||||
const BlackMisc::Audio::CAudioDeviceInfo &CAudioOutputDeviceVatlib::getCurrentOutputDevice() const
|
||||
{
|
||||
return m_currentDevice;
|
||||
}
|
||||
|
||||
void CAudioOutputDeviceVatlib::setOutputDevice(const BlackMisc::Audio::CAudioDeviceInfo &device)
|
||||
{
|
||||
Q_ASSERT_X(m_outputCodec, "CAudioOutputDeviceVatlib", "VatLocalCodec is invalid!");
|
||||
if (!device.isValid())
|
||||
{
|
||||
CLogMessage(this).warning("Cannot set invalid output device!");
|
||||
return;
|
||||
}
|
||||
|
||||
Vat_SetAudioOutputDevice(m_outputCodec.data(), device.getIndex());
|
||||
this->m_currentDevice = device;
|
||||
}
|
||||
|
||||
void CAudioOutputDeviceVatlib::setOutputVolume(int volume)
|
||||
{
|
||||
Q_ASSERT(m_outputCodec);
|
||||
Vat_SetOutputVolume(m_outputCodec.data(), volume);
|
||||
}
|
||||
|
||||
int CAudioOutputDeviceVatlib::getOutputVolume() const
|
||||
{
|
||||
Q_ASSERT(m_outputCodec);
|
||||
return Vat_GetOutputVolume(m_outputCodec.data());
|
||||
}
|
||||
|
||||
void CAudioOutputDeviceVatlib::onOutputHardwareDeviceReceived(int deviceIndex, const char *hardwareName, void *cbVar)
|
||||
{
|
||||
BlackMisc::Audio::CAudioDeviceInfo outputDevice(BlackMisc::Audio::CAudioDeviceInfo::OutputDevice, deviceIndex, QString(hardwareName));
|
||||
cbvar_cast_outputDevice(cbVar)->m_devices.push_back(outputDevice);
|
||||
}
|
||||
}
|
||||
|
||||
//! \endcond
|
||||
@@ -1,131 +0,0 @@
|
||||
/* Copyright (C) 2014
|
||||
* swift project community / contributors
|
||||
*
|
||||
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
|
||||
* directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
|
||||
* including this file, may be copied, modified, propagated, or distributed except according to the terms
|
||||
* contained in the LICENSE file.
|
||||
*/
|
||||
|
||||
//! \file
|
||||
|
||||
#ifndef BLACKCORE_AUDIODEVICEVATLIB_H
|
||||
#define BLACKCORE_AUDIODEVICEVATLIB_H
|
||||
|
||||
#include "blackcore/audiodevice.h"
|
||||
#include "blackcore/blackcoreexport.h"
|
||||
#include "blackmisc/audio/audiodeviceinfo.h"
|
||||
#include "blackmisc/audio/audiodeviceinfolist.h"
|
||||
#include "vatlib/vatlib.h"
|
||||
|
||||
#include <QObject>
|
||||
#include <QScopedPointer>
|
||||
|
||||
struct VatConsumer_tag;
|
||||
struct VatProducer_tag;
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
//! Audio Input Device
|
||||
class BLACKCORE_EXPORT CAudioInputDeviceVatlib : public IAudioInputDevice
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
//! Constructor
|
||||
CAudioInputDeviceVatlib(VatAudioService audioService, QObject *parent = nullptr);
|
||||
|
||||
//! Destructor
|
||||
virtual ~CAudioInputDeviceVatlib() = default;
|
||||
|
||||
//! \copydoc IAudioInputDevice::getInputDevices
|
||||
virtual const BlackMisc::Audio::CAudioDeviceInfoList &getInputDevices() const override;
|
||||
|
||||
//! \copydoc IAudioInputDevice::getDefaultInputDevice
|
||||
virtual const BlackMisc::Audio::CAudioDeviceInfo &getDefaultInputDevice() const override;
|
||||
|
||||
//! \copydoc IAudioInputDevice::getCurrentInputDevice
|
||||
virtual const BlackMisc::Audio::CAudioDeviceInfo &getCurrentInputDevice() const override;
|
||||
|
||||
//! \copydoc IAudioInputDevice::setInputDevice
|
||||
virtual void setInputDevice(const BlackMisc::Audio::CAudioDeviceInfo &device) override;
|
||||
|
||||
//! Get vatlib input device pointer
|
||||
VatLocalInputCodec getVatLocalInputCodec() { return m_inputCodec.data(); }
|
||||
|
||||
private:
|
||||
|
||||
struct VatLocalInputCodecDeleter
|
||||
{
|
||||
static inline void cleanup(VatProducer_tag *obj)
|
||||
{
|
||||
if (obj) Vat_DestroyLocalInputCodec(obj);
|
||||
}
|
||||
};
|
||||
|
||||
static void onInputHardwareDeviceReceived(int deviceIndex, const char *hardwareName, void *cbVar);
|
||||
|
||||
BlackMisc::Audio::CAudioDeviceInfoList m_devices; /*!< in and output devices */
|
||||
BlackMisc::Audio::CAudioDeviceInfo m_currentDevice;
|
||||
|
||||
VatAudioService m_audioService;
|
||||
QScopedPointer<VatProducer_tag, VatLocalInputCodecDeleter> m_inputCodec;
|
||||
};
|
||||
|
||||
//! Audio Output Device
|
||||
class CAudioOutputDeviceVatlib : public IAudioOutputDevice
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
//! Constructor
|
||||
CAudioOutputDeviceVatlib(VatAudioService audioService, QObject *parent = nullptr);
|
||||
|
||||
//! Destructor
|
||||
virtual ~CAudioOutputDeviceVatlib() = default;
|
||||
|
||||
//! \copydoc IAudioOutputDevice::getOutputDevices
|
||||
virtual const BlackMisc::Audio::CAudioDeviceInfoList &getOutputDevices() const override;
|
||||
|
||||
//! \copydoc IAudioOutputDevice::getDefaultOutputDevice
|
||||
virtual const BlackMisc::Audio::CAudioDeviceInfo &getDefaultOutputDevice() const override;
|
||||
|
||||
//! \copydoc IAudioOutputDevice::getCurrentOutputDevice
|
||||
virtual const BlackMisc::Audio::CAudioDeviceInfo &getCurrentOutputDevice() const override;
|
||||
|
||||
//! \copydoc IAudioOutputDevice::setOutputDevice
|
||||
virtual void setOutputDevice(const BlackMisc::Audio::CAudioDeviceInfo &device) override;
|
||||
|
||||
//! \copydoc IAudioOutputDevice::setOutputVolume
|
||||
virtual void setOutputVolume(int volume) override;
|
||||
|
||||
//! \copydoc IAudioOutputDevice::getOutputVolume
|
||||
virtual int getOutputVolume() const override;
|
||||
|
||||
//! Get vatlib output device pointer
|
||||
VatLocalOutputCodec getVatLocalOutputCodec() { return m_outputCodec.data(); }
|
||||
|
||||
private:
|
||||
|
||||
struct VatLocalOutputCodecDeleter
|
||||
{
|
||||
static inline void cleanup(VatConsumer_tag *obj)
|
||||
{
|
||||
if (obj) Vat_DestroyLocalOutputCodec(obj);
|
||||
}
|
||||
};
|
||||
|
||||
static void onOutputHardwareDeviceReceived(int deviceIndex, const char *hardwareName, void *cbVar);
|
||||
|
||||
|
||||
BlackMisc::Audio::CAudioDeviceInfoList m_devices; /*!< in and output devices */
|
||||
BlackMisc::Audio::CAudioDeviceInfo m_currentDevice;
|
||||
|
||||
VatAudioService m_audioService;
|
||||
QScopedPointer<VatConsumer_tag, VatLocalOutputCodecDeleter> m_outputCodec;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // guard
|
||||
@@ -1,34 +0,0 @@
|
||||
/* Copyright (C) 2014
|
||||
* swift project community / contributors
|
||||
*
|
||||
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
|
||||
* directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
|
||||
* including this file, may be copied, modified, propagated, or distributed except according to the terms
|
||||
* contained in the LICENSE file.
|
||||
*/
|
||||
|
||||
#include "blackcore/audiomixervatlib.h"
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
CAudioMixerVatlib::CAudioMixerVatlib(QObject *parent)
|
||||
: IAudioMixer(parent)
|
||||
{
|
||||
m_audioMixer.reset(Vat_CreateAudioMixer());
|
||||
}
|
||||
|
||||
void CAudioMixerVatlib::makeMixerConnection(InputPort inputPort, OutputPort outputPort)
|
||||
{
|
||||
Vat_MakeMixerConnection(m_audioMixer.data(), inputPort, outputPort, true);
|
||||
}
|
||||
|
||||
void CAudioMixerVatlib::removeMixerConnection(InputPort inputPort, OutputPort outputPort)
|
||||
{
|
||||
Vat_MakeMixerConnection(m_audioMixer.data(), inputPort, outputPort, false);
|
||||
}
|
||||
|
||||
bool CAudioMixerVatlib::hasMixerConnection(InputPort inputPort, OutputPort outputPort)
|
||||
{
|
||||
return Vat_HasMixerConnection(m_audioMixer.data(), inputPort, outputPort);
|
||||
}
|
||||
}
|
||||
@@ -1,71 +0,0 @@
|
||||
/* Copyright (C) 2014
|
||||
* swift project community / contributors
|
||||
*
|
||||
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
|
||||
* directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
|
||||
* including this file, may be copied, modified, propagated, or distributed except according to the terms
|
||||
* contained in the LICENSE file.
|
||||
*/
|
||||
|
||||
//! \file
|
||||
|
||||
#ifndef BLACKCORE_AUDIOMIXERVATLIB_H
|
||||
#define BLACKCORE_AUDIOMIXERVATLIB_H
|
||||
|
||||
#include "blackcore/audiomixer.h"
|
||||
#include "blackcore/blackcoreexport.h"
|
||||
#include "vatlib/vatlib.h"
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <QObject>
|
||||
#include <QScopedPointer>
|
||||
|
||||
struct VatProducerConsumer_tag;
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
//! Interface to an audio mixer
|
||||
class BLACKCORE_EXPORT CAudioMixerVatlib : public IAudioMixer
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
/*!
|
||||
* \brief Default constructor with parent
|
||||
* \param parent
|
||||
*/
|
||||
CAudioMixerVatlib(QObject *parent = nullptr);
|
||||
|
||||
//! Virtual destructor.
|
||||
virtual ~CAudioMixerVatlib() {}
|
||||
|
||||
//! \copydoc IAudioMixer::makeMixerConnection
|
||||
virtual void makeMixerConnection(InputPort inputPort, OutputPort outputPort) override;
|
||||
|
||||
//! \copydoc IAudioMixer::removeMixerConnection
|
||||
virtual void removeMixerConnection(InputPort inputPort, OutputPort outputPort) override;
|
||||
|
||||
//! \copydoc IAudioMixer::hasMixerConnection
|
||||
virtual bool hasMixerConnection(InputPort inputPort, OutputPort outputPort) override;
|
||||
|
||||
//! Return the pointer to vatlib audio mixer
|
||||
VatAudioMixer getVatAudioMixer() { return m_audioMixer.data(); }
|
||||
|
||||
private:
|
||||
|
||||
struct VatAudioMixerDeleter
|
||||
{
|
||||
static inline void cleanup(VatProducerConsumer_tag *obj)
|
||||
{
|
||||
if (obj) Vat_DestroyAudioMixer(obj);
|
||||
}
|
||||
};
|
||||
|
||||
QScopedPointer<VatProducerConsumer_tag, VatAudioMixerDeleter> m_audioMixer;
|
||||
|
||||
};
|
||||
|
||||
} // namespace BlackCore
|
||||
|
||||
#endif // guard
|
||||
@@ -14,7 +14,7 @@
|
||||
#include "blackcore/context/contextownaircraft.h"
|
||||
#include "blackcore/corefacade.h"
|
||||
#include "blackcore/voice.h"
|
||||
#include "blackcore/voicevatlib.h"
|
||||
#include "blackcore/vatsim/voicevatlib.h"
|
||||
#include "blackmisc/audio/audiodeviceinfo.h"
|
||||
#include "blackmisc/audio/notificationsounds.h"
|
||||
#include "blackmisc/audio/settings/settingsaudio.h"
|
||||
@@ -41,6 +41,7 @@ using namespace BlackMisc::Audio;
|
||||
using namespace BlackMisc::Input;
|
||||
using namespace BlackMisc::Audio;
|
||||
using namespace BlackSound;
|
||||
using namespace BlackCore::Vatsim;
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
#include "blackcore/context/contextownaircraftimpl.h"
|
||||
#include "blackcore/context/contextsimulator.h"
|
||||
#include "blackcore/corefacade.h"
|
||||
#include "blackcore/networkvatlib.h"
|
||||
#include "blackcore/vatsim/networkvatlib.h"
|
||||
#include "blackcore/webdataservices.h"
|
||||
#include "blackmisc/aviation/aircrafticaocode.h"
|
||||
#include "blackmisc/aviation/aircraftparts.h"
|
||||
@@ -48,6 +48,7 @@ using namespace BlackMisc::Geo;
|
||||
using namespace BlackMisc::Audio;
|
||||
using namespace BlackMisc::Simulation;
|
||||
using namespace BlackMisc::Weather;
|
||||
using namespace BlackCore::Vatsim;
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,226 +0,0 @@
|
||||
/* Copyright (C) 2013
|
||||
* swift Project Community / Contributors
|
||||
*
|
||||
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
|
||||
* directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
|
||||
* including this file, may be copied, modified, propagated, or distributed except according to the terms
|
||||
* contained in the LICENSE file.
|
||||
*/
|
||||
|
||||
//! \file
|
||||
|
||||
#ifndef BLACKCORE_NETWORK_VATLIB_H
|
||||
#define BLACKCORE_NETWORK_VATLIB_H
|
||||
|
||||
#include "blackcore/blackcoreexport.h"
|
||||
#include "blackcore/network.h"
|
||||
#include "blackcore/settings/network.h"
|
||||
#include "blackcore/tokenbucket.h"
|
||||
#include "blackmisc/aviation/aircrafticaocode.h"
|
||||
#include "blackmisc/aviation/aircraftparts.h"
|
||||
#include "blackmisc/aviation/airlineicaocode.h"
|
||||
#include "blackmisc/aviation/airporticaocode.h"
|
||||
#include "blackmisc/aviation/callsign.h"
|
||||
#include "blackmisc/aviation/callsignset.h"
|
||||
#include "blackmisc/network/server.h"
|
||||
#include "blackmisc/network/textmessagelist.h"
|
||||
#include "blackmisc/settingscache.h"
|
||||
#include "blackmisc/simulation/ownaircraftprovider.h"
|
||||
#include "blackmisc/simulation/simulatorplugininfo.h"
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <vatlib/vatlib.h>
|
||||
#include <QByteArray>
|
||||
#include <QJsonObject>
|
||||
#include <QList>
|
||||
#include <QObject>
|
||||
#include <QScopedPointer>
|
||||
#include <QString>
|
||||
#include <QStringList>
|
||||
#include <QTimer>
|
||||
#include <QTextCodec>
|
||||
#include <functional>
|
||||
|
||||
class QCommandLineOption;
|
||||
|
||||
namespace BlackMisc
|
||||
{
|
||||
namespace Aviation { class CFlightPlan; }
|
||||
namespace Simulation { class CSimulatedAircraft; }
|
||||
}
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
//! Implementation of INetwork using the vatlib shim
|
||||
class BLACKCORE_EXPORT CNetworkVatlib :
|
||||
public INetwork,
|
||||
public BlackMisc::Simulation::COwnAircraftAware // network vatlib consumes own aircraft data and sets ICAO/callsign data
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
//! Constructor
|
||||
CNetworkVatlib(BlackMisc::Simulation::IOwnAircraftProvider *ownAircraft, QObject *parent = nullptr);
|
||||
|
||||
//! Destructor
|
||||
virtual ~CNetworkVatlib();
|
||||
|
||||
//! \name Network functions
|
||||
//! @{
|
||||
virtual bool isConnected() const override { return m_status == vatStatusConnected; }
|
||||
virtual BlackMisc::Network::CServer getPresetServer() const override { return m_server; }
|
||||
virtual bool isPendingConnection() const override { return m_status == vatStatusConnecting; }
|
||||
virtual void presetLoginMode(LoginMode mode) override;
|
||||
virtual void presetServer(const BlackMisc::Network::CServer &server) override;
|
||||
virtual void presetCallsign(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
virtual void presetIcaoCodes(const BlackMisc::Simulation::CSimulatedAircraft &ownAircraft) override;
|
||||
virtual void presetSimulatorInfo(const BlackMisc::Simulation::CSimulatorPluginInfo &simInfo) override;
|
||||
virtual void initiateConnection() override;
|
||||
virtual void terminateConnection() override;
|
||||
virtual void sendPing(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
virtual void sendRealNameQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
virtual void sendIpQuery() override;
|
||||
virtual void sendServerQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
virtual void sendCustomPacket(const BlackMisc::Aviation::CCallsign &callsign, const QString &packetId, const QStringList &data) override;
|
||||
virtual void sendCustomFsinnQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
virtual void sendCustomFsinnReponse(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
|
||||
virtual void broadcastAircraftConfig(const QJsonObject &config) override;
|
||||
virtual void sendAircraftConfigQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
//! @}
|
||||
|
||||
//! \name Text message functions
|
||||
//! @{
|
||||
virtual void sendTextMessages(const BlackMisc::Network::CTextMessageList &messages) override;
|
||||
//! @}
|
||||
|
||||
//! \name ATC functions
|
||||
//! @{
|
||||
virtual void sendAtcQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
virtual void sendAtisQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
virtual void sendFlightPlan(const BlackMisc::Aviation::CFlightPlan &flightPlan) override;
|
||||
virtual void sendFlightPlanQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
//! @}
|
||||
|
||||
//! \name Aircraft functions
|
||||
//! @{
|
||||
virtual void sendCapabilitiesQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
virtual void sendIcaoCodesQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
virtual void sendFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
virtual void sendUserInfoQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
virtual void setInterimPositionReceivers(const BlackMisc::Aviation::CCallsignSet &receivers) override;
|
||||
//! @}
|
||||
|
||||
//! \name Weather functions
|
||||
//! @{
|
||||
virtual void sendMetarQuery(const BlackMisc::Aviation::CAirportIcaoCode &airportIcao) override;
|
||||
//! @}
|
||||
|
||||
//! Cmd.line options this library can handle
|
||||
static const QList<QCommandLineOption> &getCmdLineOptions();
|
||||
|
||||
//! Key if any from cmd.line arguments
|
||||
QString getCmdLineFsdKey() const;
|
||||
|
||||
private slots:
|
||||
void replyToFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign);
|
||||
void replyToNameQuery(const BlackMisc::Aviation::CCallsign &callsign);
|
||||
void replyToConfigQuery(const BlackMisc::Aviation::CCallsign &callsign);
|
||||
void sendAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign);
|
||||
void sendIncrementalAircraftConfig();
|
||||
|
||||
private:
|
||||
//! \name Shimlib callbacks
|
||||
//! @{
|
||||
static void onConnectionStatusChanged(VatSessionID, VatConnectionStatus oldStatus, VatConnectionStatus newStatus, void *cbvar);
|
||||
static void onTextMessageReceived(VatSessionID, const char *from, const char *to, const char *msg, void *cbvar);
|
||||
static void onRadioMessageReceived(VatSessionID, const char *from, int freqCount, int *freqList, const char *message, void *cbvar);
|
||||
static void onControllerDisconnected(VatSessionID, const char *callsign, void *cbvar);
|
||||
static void onInterimPilotPositionUpdate(VatSessionID, const char *sender, const VatInterimPilotPosition *position, void *cbvar);
|
||||
static void onAtcPositionUpdate(VatSessionID, const char *callsign, const VatAtcPosition *pos, void *cbvar);
|
||||
static void onKicked(VatSessionID, const char *reason, void *cbvar);
|
||||
static void onPong(VatSessionID, const char *sender, double elapsedTime, void *cbvar);
|
||||
static void onMetarReceived(VatSessionID, const char *data, void *cbvar);
|
||||
static void onInfoQueryRequestReceived(VatSessionID, const char *callsign, VatClientQueryType type, const char *data, void *cbvar);
|
||||
static void onInfoQueryReplyReceived(VatSessionID, const char *callsign, VatClientQueryType type, const char *data, const char *data2, void *cbvar);
|
||||
static void onCapabilitiesReplyReceived(VatSessionID, const char *callsign, int capabilityFlags, void *cbvar);
|
||||
static void onAtisReplyReceived(VatSessionID, const char *callsign, const VatControllerAtis *atis, void *cbvar);
|
||||
static void onFlightPlanReceived(VatSessionID, const char *callsign, const VatFlightPlan *fp, void *cbvar);
|
||||
static void onErrorReceived(VatSessionID, VatServerError error, const char *msg, const char *data, void *cbvar);
|
||||
static void onPilotDisconnected(VatSessionID, const char *callsign, void *cbvar);
|
||||
static void onPilotInfoRequestReceived(VatSessionID, const char *callsign, void *cbvar);
|
||||
static void onPilotInfoReceived(VatSessionID, const char *callsign, const VatAircraftInfo *aircraftInfo, void *cbvar);
|
||||
static void onPilotPositionUpdate(VatSessionID, const char *callsign, const VatPilotPosition *position, void *cbvar);
|
||||
static void onAircraftConfigReceived(VatSessionID, const char *callsign, const char *aircraftConfig, void *cbvar);
|
||||
static void onCustomPacketReceived(VatSessionID, const char *callsign, const char *packetId, const char **data, int dataSize, void *cbvar);
|
||||
//! @}
|
||||
|
||||
QByteArray toFSD(QString qstr) const;
|
||||
QByteArray toFSD(const BlackMisc::Aviation::CCallsign &callsign) const;
|
||||
std::function<const char **()> toFSD(QStringList qstrList) const;
|
||||
QString fromFSD(const char *cstr) const;
|
||||
QStringList fromFSD(const char **cstrArray, int size) const;
|
||||
bool isInterimPositionUpdateEnabledForServer() const;
|
||||
void startPositionTimers();
|
||||
void stopPositionTimers();
|
||||
void initializeSession();
|
||||
void changeConnectionStatus(VatConnectionStatus newStatus);
|
||||
bool isDisconnected() const { return m_status != vatStatusConnecting && m_status != vatStatusConnected; }
|
||||
static QString convertToUnicodeEscaped(const QString &str);
|
||||
static VatSimType convertToSimType(BlackMisc::Simulation::CSimulatorPluginInfo &simInfo);
|
||||
static void networkLogHandler(SeverityLevel severity, const char *message);
|
||||
|
||||
inline QString defaultModelString()
|
||||
{
|
||||
return QStringLiteral("Cessna Skyhawk 172SP");
|
||||
}
|
||||
|
||||
struct JsonPackets
|
||||
{
|
||||
static QJsonObject aircraftConfigRequest();
|
||||
};
|
||||
|
||||
private slots:
|
||||
void process();
|
||||
void sendPositionUpdate();
|
||||
void sendInterimPositions();
|
||||
void customPacketDispatcher(const BlackMisc::Aviation::CCallsign &callsign, const QString &packetId, const QStringList &data);
|
||||
|
||||
signals:
|
||||
void terminate(); //!< \private
|
||||
|
||||
private:
|
||||
//! Deletion policy for QScopedPointer
|
||||
struct VatlibQScopedPointerDeleter
|
||||
{
|
||||
//! Called by QScopedPointer destructor
|
||||
static void cleanup(VatSessionID session) { if (session) Vat_DestroyNetworkSession(session); }
|
||||
};
|
||||
|
||||
QScopedPointer<PCSBClient, VatlibQScopedPointerDeleter> m_net;
|
||||
LoginMode m_loginMode;
|
||||
VatConnectionStatus m_status;
|
||||
BlackMisc::Network::CServer m_server;
|
||||
QTextCodec *m_fsdTextCodec = nullptr;
|
||||
BlackMisc::Simulation::CSimulatorPluginInfo m_simulatorInfo;
|
||||
BlackMisc::Aviation::CCallsign m_ownCallsign; //!< "buffered callsign", as this must not change when connected
|
||||
BlackMisc::Aviation::CAircraftIcaoCode m_ownAircraftIcaoCode; //!< "buffered icao", as this must not change when connected
|
||||
BlackMisc::Aviation::CAirlineIcaoCode m_ownAirlineIcaoCode; //!< "buffered icao", as this must not change when connected
|
||||
QString m_ownLiveryDescription; //!< "buffered livery", as this must not change when connected
|
||||
BlackMisc::Aviation::CCallsignSet m_interimPositionReceivers;
|
||||
BlackMisc::Aviation::CAircraftParts m_sentAircraftConfig;
|
||||
CTokenBucket m_tokenBucket;
|
||||
|
||||
QTimer m_scheduledConfigUpdate;
|
||||
QTimer m_processingTimer;
|
||||
QTimer m_positionUpdateTimer;
|
||||
QTimer m_interimPositionUpdateTimer;
|
||||
|
||||
static int const c_processingIntervalMsec = 100;
|
||||
static int const c_updatePostionIntervalMsec = 5000;
|
||||
static int const c_updateInterimPostionIntervalMsec = 1000;
|
||||
static int const c_logoffTimeoutSec = 5;
|
||||
};
|
||||
} //namespace
|
||||
|
||||
#endif // guard
|
||||
142
src/blackcore/vatsim/audiodevicevatlib.cpp
Normal file
142
src/blackcore/vatsim/audiodevicevatlib.cpp
Normal file
@@ -0,0 +1,142 @@
|
||||
/* Copyright (C) 2014
|
||||
* swift project community / contributors
|
||||
*
|
||||
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
|
||||
* directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
|
||||
* including this file, may be copied, modified, propagated, or distributed except according to the terms
|
||||
* contained in the LICENSE file.
|
||||
*/
|
||||
|
||||
//! \cond PRIVATE
|
||||
|
||||
#include "blackcore/vatsim/audiodevicevatlib.h"
|
||||
#include "blackmisc/logmessage.h"
|
||||
|
||||
#include <QString>
|
||||
#include <QtGlobal>
|
||||
|
||||
using namespace BlackMisc;
|
||||
using namespace BlackMisc::Audio;
|
||||
using namespace BlackMisc::Aviation;
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
namespace Vatsim
|
||||
{
|
||||
//! Cast void* to a pointer of CAudioInputDeviceVatlib
|
||||
CAudioInputDeviceVatlib *cbvar_cast_inputDevice(void *cbvar)
|
||||
{
|
||||
return static_cast<CAudioInputDeviceVatlib *>(cbvar);
|
||||
}
|
||||
|
||||
//! Cast void* to a pointer of CAudioOutputDeviceVatlib
|
||||
CAudioOutputDeviceVatlib *cbvar_cast_outputDevice(void *cbvar)
|
||||
{
|
||||
return static_cast<CAudioOutputDeviceVatlib *>(cbvar);
|
||||
}
|
||||
|
||||
CAudioInputDeviceVatlib::CAudioInputDeviceVatlib(VatAudioService audioService, QObject *parent)
|
||||
: IAudioInputDevice(parent),
|
||||
m_audioService(audioService)
|
||||
{
|
||||
m_inputCodec.reset(Vat_CreateLocalInputCodec(audioService, vatCodecLegacy));
|
||||
Vat_GetInputDeviceInfo(m_inputCodec.data(), onInputHardwareDeviceReceived, this, nullptr);
|
||||
m_currentDevice = getDefaultInputDevice();
|
||||
}
|
||||
|
||||
const BlackMisc::Audio::CAudioDeviceInfoList &CAudioInputDeviceVatlib::getInputDevices() const
|
||||
{
|
||||
return m_devices;
|
||||
}
|
||||
|
||||
const BlackMisc::Audio::CAudioDeviceInfo &CAudioInputDeviceVatlib::getDefaultInputDevice() const
|
||||
{
|
||||
static BlackMisc::Audio::CAudioDeviceInfo info(BlackMisc::Audio::CAudioDeviceInfo::InputDevice, BlackMisc::Audio::CAudioDeviceInfo::defaultDeviceIndex(), "default");
|
||||
return info;
|
||||
}
|
||||
|
||||
const BlackMisc::Audio::CAudioDeviceInfo &CAudioInputDeviceVatlib::getCurrentInputDevice() const
|
||||
{
|
||||
return m_currentDevice;
|
||||
}
|
||||
|
||||
void CAudioInputDeviceVatlib::setInputDevice(const BlackMisc::Audio::CAudioDeviceInfo &device)
|
||||
{
|
||||
Q_ASSERT_X(m_inputCodec, "CAudioInputDeviceVatlib", "VatLocalCodec is invalid!");
|
||||
if (!device.isValid())
|
||||
{
|
||||
CLogMessage(this).warning("Cannot set invalid input device!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Vat_SetAudioInputDevice(m_inputCodec.data(), device.getIndex()))
|
||||
{
|
||||
CLogMessage(this).warning("Setting input device failed");
|
||||
}
|
||||
m_currentDevice = device;
|
||||
}
|
||||
|
||||
void CAudioInputDeviceVatlib::onInputHardwareDeviceReceived(int deviceIndex, const char *hardwareName, void *cbVar)
|
||||
{
|
||||
BlackMisc::Audio::CAudioDeviceInfo inputDevice(BlackMisc::Audio::CAudioDeviceInfo::InputDevice, deviceIndex, QString(hardwareName));
|
||||
cbvar_cast_inputDevice(cbVar)->m_devices.push_back(inputDevice);
|
||||
}
|
||||
|
||||
CAudioOutputDeviceVatlib::CAudioOutputDeviceVatlib(VatAudioService audioService, QObject *parent)
|
||||
: IAudioOutputDevice(parent),
|
||||
m_audioService(audioService)
|
||||
{
|
||||
m_outputCodec.reset(Vat_CreateLocalOutputCodec(m_audioService, vatCodecLegacy));
|
||||
Vat_GetOutputDeviceInfo(m_outputCodec.data(), onOutputHardwareDeviceReceived, this, nullptr);
|
||||
m_currentDevice = getDefaultOutputDevice();
|
||||
}
|
||||
|
||||
const BlackMisc::Audio::CAudioDeviceInfoList &CAudioOutputDeviceVatlib::getOutputDevices() const
|
||||
{
|
||||
return m_devices;
|
||||
}
|
||||
|
||||
const BlackMisc::Audio::CAudioDeviceInfo &CAudioOutputDeviceVatlib::getDefaultOutputDevice() const
|
||||
{
|
||||
static BlackMisc::Audio::CAudioDeviceInfo info(BlackMisc::Audio::CAudioDeviceInfo::OutputDevice, BlackMisc::Audio::CAudioDeviceInfo::defaultDeviceIndex(), "default");
|
||||
return info;
|
||||
}
|
||||
|
||||
const BlackMisc::Audio::CAudioDeviceInfo &CAudioOutputDeviceVatlib::getCurrentOutputDevice() const
|
||||
{
|
||||
return m_currentDevice;
|
||||
}
|
||||
|
||||
void CAudioOutputDeviceVatlib::setOutputDevice(const BlackMisc::Audio::CAudioDeviceInfo &device)
|
||||
{
|
||||
Q_ASSERT_X(m_outputCodec, "CAudioOutputDeviceVatlib", "VatLocalCodec is invalid!");
|
||||
if (!device.isValid())
|
||||
{
|
||||
CLogMessage(this).warning("Cannot set invalid output device!");
|
||||
return;
|
||||
}
|
||||
|
||||
Vat_SetAudioOutputDevice(m_outputCodec.data(), device.getIndex());
|
||||
this->m_currentDevice = device;
|
||||
}
|
||||
|
||||
void CAudioOutputDeviceVatlib::setOutputVolume(int volume)
|
||||
{
|
||||
Q_ASSERT(m_outputCodec);
|
||||
Vat_SetOutputVolume(m_outputCodec.data(), volume);
|
||||
}
|
||||
|
||||
int CAudioOutputDeviceVatlib::getOutputVolume() const
|
||||
{
|
||||
Q_ASSERT(m_outputCodec);
|
||||
return Vat_GetOutputVolume(m_outputCodec.data());
|
||||
}
|
||||
|
||||
void CAudioOutputDeviceVatlib::onOutputHardwareDeviceReceived(int deviceIndex, const char *hardwareName, void *cbVar)
|
||||
{
|
||||
BlackMisc::Audio::CAudioDeviceInfo outputDevice(BlackMisc::Audio::CAudioDeviceInfo::OutputDevice, deviceIndex, QString(hardwareName));
|
||||
cbvar_cast_outputDevice(cbVar)->m_devices.push_back(outputDevice);
|
||||
}
|
||||
} // ns
|
||||
} // ns
|
||||
//! \endcond
|
||||
134
src/blackcore/vatsim/audiodevicevatlib.h
Normal file
134
src/blackcore/vatsim/audiodevicevatlib.h
Normal file
@@ -0,0 +1,134 @@
|
||||
/* Copyright (C) 2014
|
||||
* swift project community / contributors
|
||||
*
|
||||
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
|
||||
* directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
|
||||
* including this file, may be copied, modified, propagated, or distributed except according to the terms
|
||||
* contained in the LICENSE file.
|
||||
*/
|
||||
|
||||
//! \file
|
||||
|
||||
#ifndef BLACKCORE_VATSIM_AUDIODEVICEVATLIB_H
|
||||
#define BLACKCORE_VATSIM_AUDIODEVICEVATLIB_H
|
||||
|
||||
#include "blackcore/audiodevice.h"
|
||||
#include "blackcore/blackcoreexport.h"
|
||||
#include "blackmisc/audio/audiodeviceinfo.h"
|
||||
#include "blackmisc/audio/audiodeviceinfolist.h"
|
||||
#include "vatlib/vatlib.h"
|
||||
|
||||
#include <QObject>
|
||||
#include <QScopedPointer>
|
||||
|
||||
struct VatConsumer_tag;
|
||||
struct VatProducer_tag;
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
namespace Vatsim
|
||||
{
|
||||
//! Audio Input Device
|
||||
class BLACKCORE_EXPORT CAudioInputDeviceVatlib : public IAudioInputDevice
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
//! Constructor
|
||||
CAudioInputDeviceVatlib(VatAudioService audioService, QObject *parent = nullptr);
|
||||
|
||||
//! Destructor
|
||||
virtual ~CAudioInputDeviceVatlib() = default;
|
||||
|
||||
//! \copydoc IAudioInputDevice::getInputDevices
|
||||
virtual const BlackMisc::Audio::CAudioDeviceInfoList &getInputDevices() const override;
|
||||
|
||||
//! \copydoc IAudioInputDevice::getDefaultInputDevice
|
||||
virtual const BlackMisc::Audio::CAudioDeviceInfo &getDefaultInputDevice() const override;
|
||||
|
||||
//! \copydoc IAudioInputDevice::getCurrentInputDevice
|
||||
virtual const BlackMisc::Audio::CAudioDeviceInfo &getCurrentInputDevice() const override;
|
||||
|
||||
//! \copydoc IAudioInputDevice::setInputDevice
|
||||
virtual void setInputDevice(const BlackMisc::Audio::CAudioDeviceInfo &device) override;
|
||||
|
||||
//! Get vatlib input device pointer
|
||||
VatLocalInputCodec getVatLocalInputCodec() { return m_inputCodec.data(); }
|
||||
|
||||
private:
|
||||
|
||||
struct VatLocalInputCodecDeleter
|
||||
{
|
||||
static inline void cleanup(VatProducer_tag *obj)
|
||||
{
|
||||
if (obj) Vat_DestroyLocalInputCodec(obj);
|
||||
}
|
||||
};
|
||||
|
||||
static void onInputHardwareDeviceReceived(int deviceIndex, const char *hardwareName, void *cbVar);
|
||||
|
||||
BlackMisc::Audio::CAudioDeviceInfoList m_devices; /*!< in and output devices */
|
||||
BlackMisc::Audio::CAudioDeviceInfo m_currentDevice;
|
||||
|
||||
VatAudioService m_audioService;
|
||||
QScopedPointer<VatProducer_tag, VatLocalInputCodecDeleter> m_inputCodec;
|
||||
};
|
||||
|
||||
//! Audio Output Device
|
||||
class CAudioOutputDeviceVatlib : public IAudioOutputDevice
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
//! Constructor
|
||||
CAudioOutputDeviceVatlib(VatAudioService audioService, QObject *parent = nullptr);
|
||||
|
||||
//! Destructor
|
||||
virtual ~CAudioOutputDeviceVatlib() = default;
|
||||
|
||||
//! \copydoc IAudioOutputDevice::getOutputDevices
|
||||
virtual const BlackMisc::Audio::CAudioDeviceInfoList &getOutputDevices() const override;
|
||||
|
||||
//! \copydoc IAudioOutputDevice::getDefaultOutputDevice
|
||||
virtual const BlackMisc::Audio::CAudioDeviceInfo &getDefaultOutputDevice() const override;
|
||||
|
||||
//! \copydoc IAudioOutputDevice::getCurrentOutputDevice
|
||||
virtual const BlackMisc::Audio::CAudioDeviceInfo &getCurrentOutputDevice() const override;
|
||||
|
||||
//! \copydoc IAudioOutputDevice::setOutputDevice
|
||||
virtual void setOutputDevice(const BlackMisc::Audio::CAudioDeviceInfo &device) override;
|
||||
|
||||
//! \copydoc IAudioOutputDevice::setOutputVolume
|
||||
virtual void setOutputVolume(int volume) override;
|
||||
|
||||
//! \copydoc IAudioOutputDevice::getOutputVolume
|
||||
virtual int getOutputVolume() const override;
|
||||
|
||||
//! Get vatlib output device pointer
|
||||
VatLocalOutputCodec getVatLocalOutputCodec() { return m_outputCodec.data(); }
|
||||
|
||||
private:
|
||||
|
||||
struct VatLocalOutputCodecDeleter
|
||||
{
|
||||
static inline void cleanup(VatConsumer_tag *obj)
|
||||
{
|
||||
if (obj) Vat_DestroyLocalOutputCodec(obj);
|
||||
}
|
||||
};
|
||||
|
||||
static void onOutputHardwareDeviceReceived(int deviceIndex, const char *hardwareName, void *cbVar);
|
||||
|
||||
|
||||
BlackMisc::Audio::CAudioDeviceInfoList m_devices; /*!< in and output devices */
|
||||
BlackMisc::Audio::CAudioDeviceInfo m_currentDevice;
|
||||
|
||||
VatAudioService m_audioService;
|
||||
QScopedPointer<VatConsumer_tag, VatLocalOutputCodecDeleter> m_outputCodec;
|
||||
};
|
||||
} // ns
|
||||
} // ns
|
||||
|
||||
#endif // guard
|
||||
37
src/blackcore/vatsim/audiomixervatlib.cpp
Normal file
37
src/blackcore/vatsim/audiomixervatlib.cpp
Normal file
@@ -0,0 +1,37 @@
|
||||
/* Copyright (C) 2014
|
||||
* swift project community / contributors
|
||||
*
|
||||
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
|
||||
* directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
|
||||
* including this file, may be copied, modified, propagated, or distributed except according to the terms
|
||||
* contained in the LICENSE file.
|
||||
*/
|
||||
|
||||
#include "blackcore/vatsim/audiomixervatlib.h"
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
namespace Vatsim
|
||||
{
|
||||
CAudioMixerVatlib::CAudioMixerVatlib(QObject *parent)
|
||||
: IAudioMixer(parent)
|
||||
{
|
||||
m_audioMixer.reset(Vat_CreateAudioMixer());
|
||||
}
|
||||
|
||||
void CAudioMixerVatlib::makeMixerConnection(InputPort inputPort, OutputPort outputPort)
|
||||
{
|
||||
Vat_MakeMixerConnection(m_audioMixer.data(), inputPort, outputPort, true);
|
||||
}
|
||||
|
||||
void CAudioMixerVatlib::removeMixerConnection(InputPort inputPort, OutputPort outputPort)
|
||||
{
|
||||
Vat_MakeMixerConnection(m_audioMixer.data(), inputPort, outputPort, false);
|
||||
}
|
||||
|
||||
bool CAudioMixerVatlib::hasMixerConnection(InputPort inputPort, OutputPort outputPort)
|
||||
{
|
||||
return Vat_HasMixerConnection(m_audioMixer.data(), inputPort, outputPort);
|
||||
}
|
||||
} // ns
|
||||
} // ns
|
||||
72
src/blackcore/vatsim/audiomixervatlib.h
Normal file
72
src/blackcore/vatsim/audiomixervatlib.h
Normal file
@@ -0,0 +1,72 @@
|
||||
/* Copyright (C) 2014
|
||||
* swift project community / contributors
|
||||
*
|
||||
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
|
||||
* directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
|
||||
* including this file, may be copied, modified, propagated, or distributed except according to the terms
|
||||
* contained in the LICENSE file.
|
||||
*/
|
||||
|
||||
//! \file
|
||||
|
||||
#ifndef BLACKCORE_VATSIM_AUDIOMIXERVATLIB_H
|
||||
#define BLACKCORE_VATSIM_AUDIOMIXERVATLIB_H
|
||||
|
||||
#include "blackcore/audiomixer.h"
|
||||
#include "blackcore/blackcoreexport.h"
|
||||
#include "vatlib/vatlib.h"
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <QObject>
|
||||
#include <QScopedPointer>
|
||||
|
||||
struct VatProducerConsumer_tag;
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
namespace Vatsim
|
||||
{
|
||||
//! Interface to an audio mixer
|
||||
class BLACKCORE_EXPORT CAudioMixerVatlib : public IAudioMixer
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
/*!
|
||||
* \brief Default constructor with parent
|
||||
* \param parent
|
||||
*/
|
||||
CAudioMixerVatlib(QObject *parent = nullptr);
|
||||
|
||||
//! Virtual destructor.
|
||||
virtual ~CAudioMixerVatlib() {}
|
||||
|
||||
//! \copydoc IAudioMixer::makeMixerConnection
|
||||
virtual void makeMixerConnection(InputPort inputPort, OutputPort outputPort) override;
|
||||
|
||||
//! \copydoc IAudioMixer::removeMixerConnection
|
||||
virtual void removeMixerConnection(InputPort inputPort, OutputPort outputPort) override;
|
||||
|
||||
//! \copydoc IAudioMixer::hasMixerConnection
|
||||
virtual bool hasMixerConnection(InputPort inputPort, OutputPort outputPort) override;
|
||||
|
||||
//! Return the pointer to vatlib audio mixer
|
||||
VatAudioMixer getVatAudioMixer() { return m_audioMixer.data(); }
|
||||
|
||||
private:
|
||||
|
||||
struct VatAudioMixerDeleter
|
||||
{
|
||||
static inline void cleanup(VatProducerConsumer_tag *obj)
|
||||
{
|
||||
if (obj) Vat_DestroyAudioMixer(obj);
|
||||
}
|
||||
};
|
||||
|
||||
QScopedPointer<VatProducerConsumer_tag, VatAudioMixerDeleter> m_audioMixer;
|
||||
};
|
||||
} // ns
|
||||
} // ns
|
||||
|
||||
#endif // guard
|
||||
1110
src/blackcore/vatsim/networkvatlib.cpp
Normal file
1110
src/blackcore/vatsim/networkvatlib.cpp
Normal file
File diff suppressed because it is too large
Load Diff
228
src/blackcore/vatsim/networkvatlib.h
Normal file
228
src/blackcore/vatsim/networkvatlib.h
Normal file
@@ -0,0 +1,228 @@
|
||||
/* Copyright (C) 2013
|
||||
* swift Project Community / Contributors
|
||||
*
|
||||
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
|
||||
* directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
|
||||
* including this file, may be copied, modified, propagated, or distributed except according to the terms
|
||||
* contained in the LICENSE file.
|
||||
*/
|
||||
|
||||
//! \file
|
||||
|
||||
#ifndef BLACKCORE_VATSIM_NETWORK_VATLIB_H
|
||||
#define BLACKCORE_VATSIM_NETWORK_VATLIB_H
|
||||
|
||||
#include "blackcore/blackcoreexport.h"
|
||||
#include "blackcore/network.h"
|
||||
#include "blackcore/settings/network.h"
|
||||
#include "blackcore/tokenbucket.h"
|
||||
#include "blackmisc/aviation/aircrafticaocode.h"
|
||||
#include "blackmisc/aviation/aircraftparts.h"
|
||||
#include "blackmisc/aviation/airlineicaocode.h"
|
||||
#include "blackmisc/aviation/airporticaocode.h"
|
||||
#include "blackmisc/aviation/callsign.h"
|
||||
#include "blackmisc/aviation/callsignset.h"
|
||||
#include "blackmisc/network/server.h"
|
||||
#include "blackmisc/network/textmessagelist.h"
|
||||
#include "blackmisc/settingscache.h"
|
||||
#include "blackmisc/simulation/ownaircraftprovider.h"
|
||||
#include "blackmisc/simulation/simulatorplugininfo.h"
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <vatlib/vatlib.h>
|
||||
#include <QByteArray>
|
||||
#include <QJsonObject>
|
||||
#include <QList>
|
||||
#include <QObject>
|
||||
#include <QScopedPointer>
|
||||
#include <QString>
|
||||
#include <QStringList>
|
||||
#include <QTimer>
|
||||
#include <QTextCodec>
|
||||
#include <functional>
|
||||
|
||||
class QCommandLineOption;
|
||||
|
||||
namespace BlackMisc
|
||||
{
|
||||
namespace Aviation { class CFlightPlan; }
|
||||
namespace Simulation { class CSimulatedAircraft; }
|
||||
}
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
namespace Vatsim
|
||||
{
|
||||
//! Implementation of INetwork using the vatlib shim
|
||||
class BLACKCORE_EXPORT CNetworkVatlib :
|
||||
public INetwork,
|
||||
public BlackMisc::Simulation::COwnAircraftAware // network vatlib consumes own aircraft data and sets ICAO/callsign data
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
//! Constructor
|
||||
CNetworkVatlib(BlackMisc::Simulation::IOwnAircraftProvider *ownAircraft, QObject *parent = nullptr);
|
||||
|
||||
//! Destructor
|
||||
virtual ~CNetworkVatlib();
|
||||
|
||||
//! \name Network functions
|
||||
//! @{
|
||||
virtual bool isConnected() const override { return m_status == vatStatusConnected; }
|
||||
virtual BlackMisc::Network::CServer getPresetServer() const override { return m_server; }
|
||||
virtual bool isPendingConnection() const override { return m_status == vatStatusConnecting; }
|
||||
virtual void presetLoginMode(LoginMode mode) override;
|
||||
virtual void presetServer(const BlackMisc::Network::CServer &server) override;
|
||||
virtual void presetCallsign(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
virtual void presetIcaoCodes(const BlackMisc::Simulation::CSimulatedAircraft &ownAircraft) override;
|
||||
virtual void presetSimulatorInfo(const BlackMisc::Simulation::CSimulatorPluginInfo &simInfo) override;
|
||||
virtual void initiateConnection() override;
|
||||
virtual void terminateConnection() override;
|
||||
virtual void sendPing(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
virtual void sendRealNameQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
virtual void sendIpQuery() override;
|
||||
virtual void sendServerQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
virtual void sendCustomPacket(const BlackMisc::Aviation::CCallsign &callsign, const QString &packetId, const QStringList &data) override;
|
||||
virtual void sendCustomFsinnQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
virtual void sendCustomFsinnReponse(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
|
||||
virtual void broadcastAircraftConfig(const QJsonObject &config) override;
|
||||
virtual void sendAircraftConfigQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
//! @}
|
||||
|
||||
//! \name Text message functions
|
||||
//! @{
|
||||
virtual void sendTextMessages(const BlackMisc::Network::CTextMessageList &messages) override;
|
||||
//! @}
|
||||
|
||||
//! \name ATC functions
|
||||
//! @{
|
||||
virtual void sendAtcQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
virtual void sendAtisQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
virtual void sendFlightPlan(const BlackMisc::Aviation::CFlightPlan &flightPlan) override;
|
||||
virtual void sendFlightPlanQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
//! @}
|
||||
|
||||
//! \name Aircraft functions
|
||||
//! @{
|
||||
virtual void sendCapabilitiesQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
virtual void sendIcaoCodesQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
virtual void sendFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
virtual void sendUserInfoQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
virtual void setInterimPositionReceivers(const BlackMisc::Aviation::CCallsignSet &receivers) override;
|
||||
//! @}
|
||||
|
||||
//! \name Weather functions
|
||||
//! @{
|
||||
virtual void sendMetarQuery(const BlackMisc::Aviation::CAirportIcaoCode &airportIcao) override;
|
||||
//! @}
|
||||
|
||||
//! Cmd.line options this library can handle
|
||||
static const QList<QCommandLineOption> &getCmdLineOptions();
|
||||
|
||||
//! Key if any from cmd.line arguments
|
||||
QString getCmdLineFsdKey() const;
|
||||
|
||||
private slots:
|
||||
void replyToFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign);
|
||||
void replyToNameQuery(const BlackMisc::Aviation::CCallsign &callsign);
|
||||
void replyToConfigQuery(const BlackMisc::Aviation::CCallsign &callsign);
|
||||
void sendAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign);
|
||||
void sendIncrementalAircraftConfig();
|
||||
|
||||
private:
|
||||
//! \name Shimlib callbacks
|
||||
//! @{
|
||||
static void onConnectionStatusChanged(VatSessionID, VatConnectionStatus oldStatus, VatConnectionStatus newStatus, void *cbvar);
|
||||
static void onTextMessageReceived(VatSessionID, const char *from, const char *to, const char *msg, void *cbvar);
|
||||
static void onRadioMessageReceived(VatSessionID, const char *from, int freqCount, int *freqList, const char *message, void *cbvar);
|
||||
static void onControllerDisconnected(VatSessionID, const char *callsign, void *cbvar);
|
||||
static void onInterimPilotPositionUpdate(VatSessionID, const char *sender, const VatInterimPilotPosition *position, void *cbvar);
|
||||
static void onAtcPositionUpdate(VatSessionID, const char *callsign, const VatAtcPosition *pos, void *cbvar);
|
||||
static void onKicked(VatSessionID, const char *reason, void *cbvar);
|
||||
static void onPong(VatSessionID, const char *sender, double elapsedTime, void *cbvar);
|
||||
static void onMetarReceived(VatSessionID, const char *data, void *cbvar);
|
||||
static void onInfoQueryRequestReceived(VatSessionID, const char *callsign, VatClientQueryType type, const char *data, void *cbvar);
|
||||
static void onInfoQueryReplyReceived(VatSessionID, const char *callsign, VatClientQueryType type, const char *data, const char *data2, void *cbvar);
|
||||
static void onCapabilitiesReplyReceived(VatSessionID, const char *callsign, int capabilityFlags, void *cbvar);
|
||||
static void onAtisReplyReceived(VatSessionID, const char *callsign, const VatControllerAtis *atis, void *cbvar);
|
||||
static void onFlightPlanReceived(VatSessionID, const char *callsign, const VatFlightPlan *fp, void *cbvar);
|
||||
static void onErrorReceived(VatSessionID, VatServerError error, const char *msg, const char *data, void *cbvar);
|
||||
static void onPilotDisconnected(VatSessionID, const char *callsign, void *cbvar);
|
||||
static void onPilotInfoRequestReceived(VatSessionID, const char *callsign, void *cbvar);
|
||||
static void onPilotInfoReceived(VatSessionID, const char *callsign, const VatAircraftInfo *aircraftInfo, void *cbvar);
|
||||
static void onPilotPositionUpdate(VatSessionID, const char *callsign, const VatPilotPosition *position, void *cbvar);
|
||||
static void onAircraftConfigReceived(VatSessionID, const char *callsign, const char *aircraftConfig, void *cbvar);
|
||||
static void onCustomPacketReceived(VatSessionID, const char *callsign, const char *packetId, const char **data, int dataSize, void *cbvar);
|
||||
//! @}
|
||||
|
||||
QByteArray toFSD(QString qstr) const;
|
||||
QByteArray toFSD(const BlackMisc::Aviation::CCallsign &callsign) const;
|
||||
std::function<const char **()> toFSD(QStringList qstrList) const;
|
||||
QString fromFSD(const char *cstr) const;
|
||||
QStringList fromFSD(const char **cstrArray, int size) const;
|
||||
bool isInterimPositionUpdateEnabledForServer() const;
|
||||
void startPositionTimers();
|
||||
void stopPositionTimers();
|
||||
void initializeSession();
|
||||
void changeConnectionStatus(VatConnectionStatus newStatus);
|
||||
bool isDisconnected() const { return m_status != vatStatusConnecting && m_status != vatStatusConnected; }
|
||||
static QString convertToUnicodeEscaped(const QString &str);
|
||||
static VatSimType convertToSimType(BlackMisc::Simulation::CSimulatorPluginInfo &simInfo);
|
||||
static void networkLogHandler(SeverityLevel severity, const char *message);
|
||||
|
||||
inline QString defaultModelString()
|
||||
{
|
||||
return QStringLiteral("Cessna Skyhawk 172SP");
|
||||
}
|
||||
|
||||
struct JsonPackets
|
||||
{
|
||||
static QJsonObject aircraftConfigRequest();
|
||||
};
|
||||
|
||||
private slots:
|
||||
void process();
|
||||
void sendPositionUpdate();
|
||||
void sendInterimPositions();
|
||||
void customPacketDispatcher(const BlackMisc::Aviation::CCallsign &callsign, const QString &packetId, const QStringList &data);
|
||||
|
||||
signals:
|
||||
void terminate(); //!< \private
|
||||
|
||||
private:
|
||||
//! Deletion policy for QScopedPointer
|
||||
struct VatlibQScopedPointerDeleter
|
||||
{
|
||||
//! Called by QScopedPointer destructor
|
||||
static void cleanup(VatSessionID session) { if (session) Vat_DestroyNetworkSession(session); }
|
||||
};
|
||||
|
||||
QScopedPointer<PCSBClient, VatlibQScopedPointerDeleter> m_net;
|
||||
LoginMode m_loginMode;
|
||||
VatConnectionStatus m_status;
|
||||
BlackMisc::Network::CServer m_server;
|
||||
QTextCodec *m_fsdTextCodec = nullptr;
|
||||
BlackMisc::Simulation::CSimulatorPluginInfo m_simulatorInfo;
|
||||
BlackMisc::Aviation::CCallsign m_ownCallsign; //!< "buffered callsign", as this must not change when connected
|
||||
BlackMisc::Aviation::CAircraftIcaoCode m_ownAircraftIcaoCode; //!< "buffered icao", as this must not change when connected
|
||||
BlackMisc::Aviation::CAirlineIcaoCode m_ownAirlineIcaoCode; //!< "buffered icao", as this must not change when connected
|
||||
QString m_ownLiveryDescription; //!< "buffered livery", as this must not change when connected
|
||||
BlackMisc::Aviation::CCallsignSet m_interimPositionReceivers;
|
||||
BlackMisc::Aviation::CAircraftParts m_sentAircraftConfig;
|
||||
CTokenBucket m_tokenBucket;
|
||||
|
||||
QTimer m_scheduledConfigUpdate;
|
||||
QTimer m_processingTimer;
|
||||
QTimer m_positionUpdateTimer;
|
||||
QTimer m_interimPositionUpdateTimer;
|
||||
|
||||
static int const c_processingIntervalMsec = 100;
|
||||
static int const c_updatePostionIntervalMsec = 5000;
|
||||
static int const c_updateInterimPostionIntervalMsec = 1000;
|
||||
static int const c_logoffTimeoutSec = 5;
|
||||
};
|
||||
} //namespace
|
||||
} //namespace
|
||||
#endif // guard
|
||||
218
src/blackcore/vatsim/voicechannelvatlib.cpp
Normal file
218
src/blackcore/vatsim/voicechannelvatlib.cpp
Normal file
@@ -0,0 +1,218 @@
|
||||
/* Copyright (C) 2014
|
||||
* swift project community / contributors
|
||||
*
|
||||
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
|
||||
* directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
|
||||
* including this file, may be copied, modified, propagated, or distributed except according to the terms
|
||||
* contained in the LICENSE file.
|
||||
*/
|
||||
|
||||
//! \cond PRIVATE
|
||||
|
||||
#include "blackcore/vatsim/voicechannelvatlib.h"
|
||||
#include "blackmisc/logmessage.h"
|
||||
#include "blackmisc/statusmessage.h"
|
||||
|
||||
#include <QList>
|
||||
#include <QStringList>
|
||||
#include <QtGlobal>
|
||||
|
||||
using namespace BlackMisc;
|
||||
using namespace BlackMisc::Audio;
|
||||
using namespace BlackMisc::Aviation;
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
namespace Vatsim
|
||||
{
|
||||
CVoiceChannelVatlib::CVoiceChannelVatlib(VatAudioService audioService, VatUDPAudioPort udpPort, QObject *parent)
|
||||
: IVoiceChannel(parent),
|
||||
m_audioService(audioService),
|
||||
m_udpPort(udpPort)
|
||||
{
|
||||
m_voiceChannel.reset(Vat_CreateVoiceChannel(m_audioService, "", 3782, "", "", m_udpPort));
|
||||
Vat_SetConnectionChangedHandler(m_voiceChannel.data(), roomStatusUpdate, this);
|
||||
Vat_SetClientJoinedHandler(m_voiceChannel.data(), processUserJoined, this);
|
||||
Vat_SetClientLeftHandler(m_voiceChannel.data(), processUserLeft, this);
|
||||
Vat_SetVoiceTransmissionChangedHandler(m_voiceChannel.data(), processTransmissionChange, this);
|
||||
|
||||
}
|
||||
|
||||
CVoiceChannelVatlib::~CVoiceChannelVatlib()
|
||||
{
|
||||
Q_ASSERT(m_roomStatus == IVoiceChannel::Disconnected);
|
||||
}
|
||||
|
||||
void CVoiceChannelVatlib::joinVoiceRoom(const CVoiceRoom &voiceRoom)
|
||||
{
|
||||
if (m_roomStatus == IVoiceChannel::Connecting || m_roomStatus == IVoiceChannel::Connected) return;
|
||||
|
||||
// No one else is using this voice room, so prepare to join
|
||||
m_voiceRoom = voiceRoom;
|
||||
Vat_SetRoomInfo(m_voiceChannel.data(), qPrintable(voiceRoom.getHostname()), 3782,
|
||||
qPrintable(voiceRoom.getChannel()),
|
||||
qPrintable(m_callsign.toQString()));
|
||||
|
||||
CLogMessage(this).debug() << "Joining voice room " << m_voiceRoom.getVoiceRoomUrl();
|
||||
Vat_JoinRoom(m_voiceChannel.data());
|
||||
}
|
||||
|
||||
// Leave room
|
||||
void CVoiceChannelVatlib::leaveVoiceRoom()
|
||||
{
|
||||
// If this room is not connected, there is nothing to do
|
||||
if (m_roomStatus == IVoiceChannel::Disconnecting || m_roomStatus == IVoiceChannel::Disconnected) return;
|
||||
|
||||
CLogMessage(this).debug() << "Leaving voice room " << m_voiceRoom.getVoiceRoomUrl();
|
||||
Vat_DisconnectFromRoom(m_voiceChannel.data());
|
||||
m_voiceRoom = {};
|
||||
m_listCallsigns = {};
|
||||
}
|
||||
|
||||
CCallsignSet CVoiceChannelVatlib::getVoiceRoomCallsigns() const
|
||||
{
|
||||
return m_listCallsigns;
|
||||
}
|
||||
|
||||
void CVoiceChannelVatlib::setOwnAircraftCallsign(const CCallsign &callsign)
|
||||
{
|
||||
m_callsign = callsign;
|
||||
}
|
||||
|
||||
BlackMisc::Audio::CVoiceRoom CVoiceChannelVatlib::getVoiceRoom() const
|
||||
{
|
||||
return m_voiceRoom;
|
||||
}
|
||||
|
||||
bool CVoiceChannelVatlib::isMuted() const
|
||||
{
|
||||
// Remove
|
||||
return false;
|
||||
}
|
||||
|
||||
void CVoiceChannelVatlib::setVolume(int /* volume */)
|
||||
{
|
||||
// Remove
|
||||
}
|
||||
|
||||
int CVoiceChannelVatlib::getVolume() const
|
||||
{
|
||||
// Remove
|
||||
return 100;
|
||||
}
|
||||
|
||||
VatVoiceChannel CVoiceChannelVatlib::getVoiceChannel() const
|
||||
{
|
||||
return m_voiceChannel.data();
|
||||
}
|
||||
|
||||
CCallsign CVoiceChannelVatlib::extractCallsign(const QString &name)
|
||||
{
|
||||
CCallsign callsign;
|
||||
if (name.isEmpty()) return callsign;
|
||||
|
||||
// callsign might contain: VATSIM id, user name
|
||||
if (name.contains(" "))
|
||||
{
|
||||
QStringList parts = name.split(" ");
|
||||
callsign = CCallsign(parts[0]);
|
||||
// I throw away VATSIM id here, maybe we could use it
|
||||
}
|
||||
else
|
||||
{
|
||||
callsign = CCallsign(name);
|
||||
}
|
||||
|
||||
return callsign;
|
||||
}
|
||||
|
||||
void CVoiceChannelVatlib::userJoinedVoiceRoom(VatVoiceChannel, int /** id **/, const char *name)
|
||||
{
|
||||
CCallsign callsign(extractCallsign(name));
|
||||
m_listCallsigns.push_back(callsign);
|
||||
emit userJoinedRoom(callsign);
|
||||
}
|
||||
|
||||
void CVoiceChannelVatlib::userLeftVoiceRoom(VatVoiceChannel, int /** id **/, const char *name)
|
||||
{
|
||||
CCallsign callsign(extractCallsign(name));
|
||||
m_listCallsigns.remove(callsign);
|
||||
emit userLeftRoom(callsign);
|
||||
}
|
||||
|
||||
void CVoiceChannelVatlib::transmissionChanged(VatVoiceChannel, VatVoiceTransmissionStatus status)
|
||||
{
|
||||
if (status == vatVoiceStarted) emit audioStarted();
|
||||
else emit audioStopped();
|
||||
}
|
||||
|
||||
void CVoiceChannelVatlib::updateRoomStatus(VatVoiceChannel channel, VatConnectionStatus oldVatStatus, VatConnectionStatus newVatStatus)
|
||||
{
|
||||
Q_UNUSED(channel);
|
||||
Q_UNUSED(oldVatStatus);
|
||||
|
||||
IVoiceChannel::ConnectionStatus oldStatus = m_roomStatus;
|
||||
switch (newVatStatus)
|
||||
{
|
||||
case vatStatusConnecting:
|
||||
{
|
||||
m_roomStatus = IVoiceChannel::Connecting;
|
||||
break;
|
||||
}
|
||||
case vatStatusConnected:
|
||||
{
|
||||
m_voiceRoom.setConnected(true);
|
||||
m_roomStatus = IVoiceChannel::Connected;
|
||||
break;
|
||||
}
|
||||
case vatStatusDisconnecting:
|
||||
{
|
||||
m_roomStatus = IVoiceChannel::Disconnecting;
|
||||
break;
|
||||
}
|
||||
case vatStatusDisconnected:
|
||||
{
|
||||
// Clear all internals
|
||||
m_listCallsigns.clear();
|
||||
m_voiceRoom = {};
|
||||
m_roomStatus = IVoiceChannel::Disconnected;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
emit connectionStatusChanged(oldStatus, m_roomStatus);
|
||||
}
|
||||
|
||||
//! Cast void* to a pointer of CVoiceChannelVatlib
|
||||
CVoiceChannelVatlib *cbvar_cast_voiceChannel(void *cbvar)
|
||||
{
|
||||
return static_cast<CVoiceChannelVatlib *>(cbvar);
|
||||
}
|
||||
|
||||
void CVoiceChannelVatlib::processUserJoined(VatVoiceChannel channel, int id, const char *name, void *cbVar)
|
||||
{
|
||||
auto obj = cbvar_cast_voiceChannel(cbVar);
|
||||
obj->userJoinedVoiceRoom(channel, id, name);
|
||||
}
|
||||
|
||||
void CVoiceChannelVatlib::processUserLeft(VatVoiceChannel channel, int id, const char *name, void *cbVar)
|
||||
{
|
||||
auto obj = cbvar_cast_voiceChannel(cbVar);
|
||||
obj->userLeftVoiceRoom(channel, id, name);
|
||||
}
|
||||
|
||||
void CVoiceChannelVatlib::processTransmissionChange(VatVoiceChannel channel, VatVoiceTransmissionStatus status, void *cbVar)
|
||||
{
|
||||
auto obj = cbvar_cast_voiceChannel(cbVar);
|
||||
obj->transmissionChanged(channel, status);
|
||||
}
|
||||
|
||||
void CVoiceChannelVatlib::roomStatusUpdate(VatVoiceChannel channel, VatConnectionStatus oldStatus, VatConnectionStatus newStatus, void *cbVar)
|
||||
{
|
||||
auto obj = cbvar_cast_voiceChannel(cbVar);
|
||||
obj->updateRoomStatus(channel, oldStatus, newStatus);
|
||||
}
|
||||
} // ns
|
||||
} // ns
|
||||
//! \endcond
|
||||
111
src/blackcore/vatsim/voicechannelvatlib.h
Normal file
111
src/blackcore/vatsim/voicechannelvatlib.h
Normal file
@@ -0,0 +1,111 @@
|
||||
/* Copyright (C) 2014
|
||||
* swift project community / contributors
|
||||
*
|
||||
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
|
||||
* directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
|
||||
* including this file, may be copied, modified, propagated, or distributed except according to the terms
|
||||
* contained in the LICENSE file.
|
||||
*/
|
||||
|
||||
//! \file
|
||||
|
||||
#ifndef BLACKCORE_VATSIM_VOICE_CHANNEL_VATLIB_H
|
||||
#define BLACKCORE_VATSIM_VOICE_CHANNEL_VATLIB_H
|
||||
|
||||
#include "blackcore/blackcoreexport.h"
|
||||
#include "blackcore/voicechannel.h"
|
||||
#include "blackmisc/audio/voiceroom.h"
|
||||
#include "blackmisc/aviation/callsign.h"
|
||||
#include "blackmisc/aviation/callsignset.h"
|
||||
#include "vatlib/vatlib.h"
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <QObject>
|
||||
#include <QScopedPointer>
|
||||
#include <QString>
|
||||
|
||||
struct VatProducerConsumer_tag;
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
namespace Vatsim
|
||||
{
|
||||
class CVoiceChannelVatlibPrivate;
|
||||
|
||||
//! Class implementing the voice channel interface
|
||||
class BLACKCORE_EXPORT CVoiceChannelVatlib : public IVoiceChannel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
//! Default constructor
|
||||
CVoiceChannelVatlib(VatAudioService audioService, VatUDPAudioPort udpPort, QObject *parent = nullptr);
|
||||
|
||||
//! Destructor
|
||||
virtual ~CVoiceChannelVatlib();
|
||||
|
||||
//! \copydoc IVoiceChannel::joinVoiceRoom
|
||||
virtual void joinVoiceRoom(const BlackMisc::Audio::CVoiceRoom &voiceRoom) override;
|
||||
|
||||
//! \copydoc IVoiceChannel::leaveVoiceRoom
|
||||
virtual void leaveVoiceRoom() override;
|
||||
|
||||
//! \copydoc IVoiceChannel::getVoiceRoomCallsigns
|
||||
virtual BlackMisc::Aviation::CCallsignSet getVoiceRoomCallsigns() const override;
|
||||
|
||||
//! \copydoc IVoiceChannel::setOwnAircraftCallsign
|
||||
virtual void setOwnAircraftCallsign(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
|
||||
//! \copydoc IVoiceChannel::getVoiceRoom
|
||||
virtual BlackMisc::Audio::CVoiceRoom getVoiceRoom() const override;
|
||||
|
||||
//! \copydoc IVoiceChannel::isMuted
|
||||
virtual bool isMuted() const override;
|
||||
|
||||
//! Set channel volume
|
||||
virtual void setVolume(int volume) override;
|
||||
|
||||
//! Get channel volume
|
||||
virtual int getVolume() const override;
|
||||
|
||||
//! Get vatlib channel pointer
|
||||
VatVoiceChannel getVoiceChannel() const;
|
||||
|
||||
private:
|
||||
|
||||
struct VatVoiceChannelDeleter
|
||||
{
|
||||
static inline void cleanup(VatProducerConsumer_tag *obj)
|
||||
{
|
||||
if (obj) Vat_DestroyVoiceChannel(obj);
|
||||
}
|
||||
};
|
||||
|
||||
BlackMisc::Aviation::CCallsign extractCallsign(const QString &name);
|
||||
|
||||
void userJoinedVoiceRoom(VatVoiceChannel, int id, const char *name);
|
||||
void userLeftVoiceRoom(VatVoiceChannel, int id, const char *name);
|
||||
void transmissionChanged(VatVoiceChannel, VatVoiceTransmissionStatus status);
|
||||
void updateRoomStatus(VatVoiceChannel channel, VatConnectionStatus oldStatus, VatConnectionStatus newStatus);
|
||||
|
||||
static void processUserJoined(VatVoiceChannel channel, int id, const char *name, void *cbVar);
|
||||
static void processUserLeft(VatVoiceChannel channel, int id, const char *name, void *cbVar);
|
||||
static void processTransmissionChange(VatVoiceChannel channel, VatVoiceTransmissionStatus status, void *cbVar);
|
||||
|
||||
static void roomStatusUpdate(VatVoiceChannel channel, VatConnectionStatus oldStatus, VatConnectionStatus newStatus, void *cbVar);
|
||||
|
||||
BlackMisc::Aviation::CCallsign m_callsign; // Own callsign
|
||||
BlackMisc::Audio::CVoiceRoom m_voiceRoom; // Voice Room
|
||||
BlackMisc::Aviation::CCallsignSet m_listCallsigns; // Callsigns connected to room
|
||||
IVoiceChannel::ConnectionStatus m_roomStatus = IVoiceChannel::Disconnected; // Room connection status
|
||||
|
||||
VatAudioService m_audioService;
|
||||
VatUDPAudioPort m_udpPort;
|
||||
|
||||
QScopedPointer<VatProducerConsumer_tag, VatVoiceChannelDeleter> m_voiceChannel;
|
||||
};
|
||||
} // ns
|
||||
} // ns
|
||||
|
||||
#endif // guard
|
||||
142
src/blackcore/vatsim/voicevatlib.cpp
Normal file
142
src/blackcore/vatsim/voicevatlib.cpp
Normal file
@@ -0,0 +1,142 @@
|
||||
/* Copyright (C) 2013
|
||||
* swift Project Community / Contributors
|
||||
*
|
||||
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
|
||||
* directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
|
||||
* including this file, may be copied, modified, propagated, or distributed except according to the terms
|
||||
* contained in the LICENSE file.
|
||||
*/
|
||||
|
||||
#include "blackcore/audiodevice.h"
|
||||
#include "blackcore/vatsim/audiodevicevatlib.h"
|
||||
#include "blackcore/vatsim/audiomixervatlib.h"
|
||||
#include "blackcore/voicechannel.h"
|
||||
#include "blackcore/vatsim/voicechannelvatlib.h"
|
||||
#include "blackcore/vatsim/voicevatlib.h"
|
||||
#include "blackmisc/logmessage.h"
|
||||
#include "vatlib/vatlib.h"
|
||||
|
||||
#include <QtGlobal>
|
||||
#include <memory>
|
||||
|
||||
using namespace BlackMisc;
|
||||
using namespace BlackMisc::Audio;
|
||||
using namespace BlackMisc::Aviation;
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
namespace Vatsim
|
||||
{
|
||||
CVoiceVatlib::CVoiceVatlib(QObject *parent) :
|
||||
IVoice(parent),
|
||||
m_audioService(Vat_CreateAudioService()),
|
||||
m_udpPort(Vat_CreateUDPAudioPort(m_audioService.data(), 0))
|
||||
{
|
||||
Vat_SetVoiceLogHandler(SeverityLevel::SeverityError, CVoiceVatlib::voiceLogHandler);
|
||||
|
||||
// do processing
|
||||
this->startTimer(10);
|
||||
}
|
||||
|
||||
CVoiceVatlib::~CVoiceVatlib() {}
|
||||
|
||||
QSharedPointer<IVoiceChannel> CVoiceVatlib::createVoiceChannel()
|
||||
{
|
||||
return QSharedPointer<IVoiceChannel>(new CVoiceChannelVatlib(m_audioService.data(), m_udpPort.data(), this));
|
||||
}
|
||||
|
||||
std::unique_ptr<IAudioInputDevice> CVoiceVatlib::createInputDevice()
|
||||
{
|
||||
return std::make_unique<CAudioInputDeviceVatlib>(m_audioService.data(), this);
|
||||
}
|
||||
|
||||
std::unique_ptr<IAudioOutputDevice> CVoiceVatlib::createOutputDevice()
|
||||
{
|
||||
return std::make_unique<CAudioOutputDeviceVatlib>(m_audioService.data(), this);
|
||||
}
|
||||
|
||||
std::unique_ptr<IAudioMixer> CVoiceVatlib::createAudioMixer()
|
||||
{
|
||||
return std::make_unique<CAudioMixerVatlib>(this);
|
||||
}
|
||||
|
||||
void CVoiceVatlib::connectVoice(IAudioInputDevice *device, IAudioMixer *mixer, IAudioMixer::InputPort inputPort)
|
||||
{
|
||||
auto audioInputVatlib = qobject_cast<CAudioInputDeviceVatlib *>(device);
|
||||
Q_ASSERT_X(audioInputVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioInputDeviceVatlib pointer.");
|
||||
|
||||
auto audioMixerVatlib = qobject_cast<CAudioMixerVatlib *>(mixer);
|
||||
Q_ASSERT_X(audioMixerVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioMixerVatlib pointer.");
|
||||
|
||||
Vat_ConnectProducerToProducerConsumer(audioInputVatlib->getVatLocalInputCodec(), 0, audioMixerVatlib->getVatAudioMixer(), inputPort);
|
||||
}
|
||||
|
||||
void CVoiceVatlib::connectVoice(IVoiceChannel *channel, IAudioMixer *mixer, IAudioMixer::InputPort inputPort)
|
||||
{
|
||||
auto voiceChannelVatlib = qobject_cast<CVoiceChannelVatlib *>(channel);
|
||||
Q_ASSERT_X(voiceChannelVatlib, "CVoiceVatlib::connectVoice", "No valid CVoiceChannelVatlib pointer.");
|
||||
|
||||
auto audioMixerVatlib = qobject_cast<CAudioMixerVatlib *>(mixer);
|
||||
Q_ASSERT_X(audioMixerVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioMixerVatlib pointer.");
|
||||
|
||||
Vat_ConnectProducerConsumerToProducerConsumer(voiceChannelVatlib->getVoiceChannel(), 0, audioMixerVatlib->getVatAudioMixer(), inputPort);
|
||||
}
|
||||
|
||||
void CVoiceVatlib::connectVoice(IAudioMixer *mixer, IAudioMixer::OutputPort outputPort, IAudioOutputDevice *device)
|
||||
{
|
||||
auto audioMixerVatlib = qobject_cast<CAudioMixerVatlib *>(mixer);
|
||||
Q_ASSERT_X(audioMixerVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioMixerVatlib pointer.");
|
||||
|
||||
auto audioDeviceVatlib = qobject_cast<CAudioOutputDeviceVatlib *>(device);
|
||||
Q_ASSERT_X(audioDeviceVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioOutputDeviceVatlib pointer.");
|
||||
|
||||
Vat_ConnectProducerConsumerToConsumer(audioMixerVatlib->getVatAudioMixer(), outputPort, audioDeviceVatlib->getVatLocalOutputCodec(), 0);
|
||||
}
|
||||
|
||||
void CVoiceVatlib::connectVoice(IAudioMixer *mixer, IAudioMixer::OutputPort outputPort, IVoiceChannel *channel)
|
||||
{
|
||||
auto audioMixerVatlib = qobject_cast<CAudioMixerVatlib *>(mixer);
|
||||
Q_ASSERT_X(audioMixerVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioMixerVatlib pointer.");
|
||||
|
||||
auto voiceChannelVatlib = qobject_cast<CVoiceChannelVatlib *>(channel);
|
||||
Q_ASSERT_X(voiceChannelVatlib, "CVoiceVatlib::connectVoice", "No valid CVoiceChannelVatlib pointer.");
|
||||
|
||||
Vat_ConnectProducerConsumerToProducerConsumer(audioMixerVatlib->getVatAudioMixer(), outputPort, voiceChannelVatlib->getVoiceChannel(), 0);
|
||||
}
|
||||
|
||||
void CVoiceVatlib::disconnectVoice(IAudioInputDevice *device)
|
||||
{
|
||||
auto audioInputVatlib = qobject_cast<CAudioInputDeviceVatlib *>(device);
|
||||
Q_ASSERT_X(audioInputVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioInputDeviceVatlib pointer.");
|
||||
Vat_ConnectProducerToConsumer(audioInputVatlib->getVatLocalInputCodec(), 0, nullptr, 0);
|
||||
}
|
||||
|
||||
void CVoiceVatlib::disconnectVoice(IVoiceChannel *channel)
|
||||
{
|
||||
auto voiceChannelVatlib = qobject_cast<CVoiceChannelVatlib *>(channel);
|
||||
Q_ASSERT_X(voiceChannelVatlib, "CVoiceVatlib::connectVoice", "No valid CVoiceChannelVatlib pointer.");
|
||||
Vat_ConnectProducerConsumerToConsumer(voiceChannelVatlib->getVoiceChannel(), 0, nullptr, 0);
|
||||
}
|
||||
|
||||
void CVoiceVatlib::disconnectVoice(IAudioMixer *mixer, IAudioMixer::OutputPort outputPort)
|
||||
{
|
||||
auto audioMixerVatlib = qobject_cast<CAudioMixerVatlib *>(mixer);
|
||||
Q_ASSERT_X(audioMixerVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioMixerVatlib pointer.");
|
||||
Vat_ConnectProducerConsumerToConsumer(audioMixerVatlib->getVatAudioMixer(), outputPort, nullptr, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Process voice handling
|
||||
*/
|
||||
void CVoiceVatlib::timerEvent(QTimerEvent *)
|
||||
{
|
||||
Q_ASSERT_X(m_audioService, "CVoiceVatlib", "VatAudioService invalid!");
|
||||
Vat_ExecuteTasks(m_audioService.data());
|
||||
}
|
||||
|
||||
void CVoiceVatlib::voiceLogHandler(SeverityLevel /** severity **/, const char *message)
|
||||
{
|
||||
CLogMessage(static_cast<CVoiceVatlib *>(nullptr)).error(message);
|
||||
}
|
||||
} // namespace
|
||||
} // namespace
|
||||
124
src/blackcore/vatsim/voicevatlib.h
Normal file
124
src/blackcore/vatsim/voicevatlib.h
Normal file
@@ -0,0 +1,124 @@
|
||||
/* Copyright (C) 2013
|
||||
* swift Project Community / Contributors
|
||||
*
|
||||
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
|
||||
* directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
|
||||
* including this file, may be copied, modified, propagated, or distributed except according to the terms
|
||||
* contained in the LICENSE file.
|
||||
*/
|
||||
|
||||
//! \file
|
||||
|
||||
#ifndef BLACKCORE_VOICE_VATLIB_H
|
||||
#define BLACKCORE_VOICE_VATLIB_H
|
||||
|
||||
#include "blackcore/audiomixer.h"
|
||||
#include "blackcore/blackcoreexport.h"
|
||||
#include "blackcore/voice.h"
|
||||
|
||||
#include <vatlib/vatlib.h>
|
||||
#include <QObject>
|
||||
#include <QScopedPointer>
|
||||
#include <QSharedPointer>
|
||||
#include <memory>
|
||||
|
||||
class QTimerEvent;
|
||||
|
||||
struct VatAudioService_tag;
|
||||
struct VatUDPAudioPort_tag;
|
||||
template <class T> class QSharedPointer;
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
#ifndef NOMINMAX
|
||||
#define NOMINMAX
|
||||
#endif
|
||||
#include <Windows.h>
|
||||
#endif
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
class IAudioInputDevice;
|
||||
class IAudioOutputDevice;
|
||||
class IVoiceChannel;
|
||||
namespace Vatsim
|
||||
{
|
||||
//! Vatlib implementation of the IVoice interface.
|
||||
class BLACKCORE_EXPORT CVoiceVatlib : public IVoice
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
//! Default constructor
|
||||
CVoiceVatlib(QObject *parent = nullptr);
|
||||
|
||||
//! Destructor
|
||||
virtual ~CVoiceVatlib();
|
||||
|
||||
//! \copydoc IVoice::createVoiceChannel()
|
||||
virtual QSharedPointer<IVoiceChannel> createVoiceChannel() override;
|
||||
|
||||
//! \copydoc IVoice::createInputDevice()
|
||||
virtual std::unique_ptr<IAudioInputDevice> createInputDevice() override;
|
||||
|
||||
//! \copydoc IVoice::createOutputDevice()
|
||||
virtual std::unique_ptr<IAudioOutputDevice> createOutputDevice() override;
|
||||
|
||||
//! \copydoc IVoice::createAudioMixer()
|
||||
virtual std::unique_ptr<IAudioMixer> createAudioMixer() override;
|
||||
|
||||
//! \copydoc IVoice::connectVoice()
|
||||
virtual void connectVoice(IAudioInputDevice *device, IAudioMixer *mixer, IAudioMixer::InputPort inputPort) override;
|
||||
|
||||
//! \copydoc IVoice::connectVoice()
|
||||
virtual void connectVoice(IVoiceChannel *channel, IAudioMixer *mixer, IAudioMixer::InputPort inputPort) override;
|
||||
|
||||
//! \copydoc IVoice::connectVoice()
|
||||
virtual void connectVoice(IAudioMixer *mixer, IAudioMixer::OutputPort outputPort, IAudioOutputDevice *device) override;
|
||||
|
||||
//! \copydoc IVoice::connectVoice()
|
||||
virtual void connectVoice(IAudioMixer *mixer, IAudioMixer::OutputPort outputPort, IVoiceChannel *channel) override;
|
||||
|
||||
//! \copydoc IVoice::disconnectVoice()
|
||||
void disconnectVoice(IAudioInputDevice *device) override;
|
||||
|
||||
//! \copydoc IVoice::disconnectVoice()
|
||||
void disconnectVoice(IVoiceChannel *channel) override;
|
||||
|
||||
//! \copydoc IVoice::disconnectVoice()
|
||||
void disconnectVoice(IAudioMixer *mixer, IAudioMixer::OutputPort outputPort) override;
|
||||
|
||||
protected: // QObject overrides
|
||||
|
||||
//! Process voice lib
|
||||
virtual void timerEvent(QTimerEvent *) override;
|
||||
|
||||
private:
|
||||
|
||||
// this struct calls "myCustomDeallocator" to delete the pointer
|
||||
struct VatAudioServiceDeleter
|
||||
{
|
||||
static inline void cleanup(VatAudioService_tag *obj)
|
||||
{
|
||||
Vat_DestroyAudioService(obj);
|
||||
}
|
||||
};
|
||||
|
||||
struct VatUDPAudioPortDeleter
|
||||
{
|
||||
static inline void cleanup(VatUDPAudioPort_tag *obj)
|
||||
{
|
||||
Vat_DestroyUDPAudioPort(obj);
|
||||
}
|
||||
};
|
||||
|
||||
static void voiceLogHandler(SeverityLevel severity, const char *message);
|
||||
|
||||
QScopedPointer<VatAudioService_tag, VatAudioServiceDeleter> m_audioService;
|
||||
QScopedPointer<VatUDPAudioPort_tag, VatUDPAudioPortDeleter> m_udpPort;
|
||||
|
||||
};
|
||||
} // namespace
|
||||
} // namespace
|
||||
|
||||
#endif // guard
|
||||
@@ -1,216 +0,0 @@
|
||||
/* Copyright (C) 2014
|
||||
* swift project community / contributors
|
||||
*
|
||||
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
|
||||
* directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
|
||||
* including this file, may be copied, modified, propagated, or distributed except according to the terms
|
||||
* contained in the LICENSE file.
|
||||
*/
|
||||
|
||||
//! \cond PRIVATE
|
||||
|
||||
#include "blackcore/voicechannelvatlib.h"
|
||||
#include "blackmisc/logmessage.h"
|
||||
#include "blackmisc/statusmessage.h"
|
||||
|
||||
#include <QList>
|
||||
#include <QStringList>
|
||||
#include <QtGlobal>
|
||||
|
||||
using namespace BlackMisc;
|
||||
using namespace BlackMisc::Audio;
|
||||
using namespace BlackMisc::Aviation;
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
CVoiceChannelVatlib::CVoiceChannelVatlib(VatAudioService audioService, VatUDPAudioPort udpPort, QObject *parent)
|
||||
: IVoiceChannel(parent),
|
||||
m_audioService(audioService),
|
||||
m_udpPort(udpPort)
|
||||
{
|
||||
m_voiceChannel.reset(Vat_CreateVoiceChannel(m_audioService, "", 3782, "", "", m_udpPort));
|
||||
Vat_SetConnectionChangedHandler(m_voiceChannel.data(), roomStatusUpdate, this);
|
||||
Vat_SetClientJoinedHandler(m_voiceChannel.data(), processUserJoined, this);
|
||||
Vat_SetClientLeftHandler(m_voiceChannel.data(), processUserLeft, this);
|
||||
Vat_SetVoiceTransmissionChangedHandler(m_voiceChannel.data(), processTransmissionChange, this);
|
||||
|
||||
}
|
||||
|
||||
CVoiceChannelVatlib::~CVoiceChannelVatlib()
|
||||
{
|
||||
Q_ASSERT(m_roomStatus == IVoiceChannel::Disconnected);
|
||||
}
|
||||
|
||||
void CVoiceChannelVatlib::joinVoiceRoom(const CVoiceRoom &voiceRoom)
|
||||
{
|
||||
if (m_roomStatus == IVoiceChannel::Connecting || m_roomStatus == IVoiceChannel::Connected) return;
|
||||
|
||||
// No one else is using this voice room, so prepare to join
|
||||
m_voiceRoom = voiceRoom;
|
||||
Vat_SetRoomInfo(m_voiceChannel.data(), qPrintable(voiceRoom.getHostname()), 3782,
|
||||
qPrintable(voiceRoom.getChannel()),
|
||||
qPrintable(m_callsign.toQString()));
|
||||
|
||||
CLogMessage(this).debug() << "Joining voice room " << m_voiceRoom.getVoiceRoomUrl();
|
||||
Vat_JoinRoom(m_voiceChannel.data());
|
||||
}
|
||||
|
||||
// Leave room
|
||||
void CVoiceChannelVatlib::leaveVoiceRoom()
|
||||
{
|
||||
// If this room is not connected, there is nothing to do
|
||||
if (m_roomStatus == IVoiceChannel::Disconnecting || m_roomStatus == IVoiceChannel::Disconnected) return;
|
||||
|
||||
CLogMessage(this).debug() << "Leaving voice room " << m_voiceRoom.getVoiceRoomUrl();
|
||||
Vat_DisconnectFromRoom(m_voiceChannel.data());
|
||||
m_voiceRoom = {};
|
||||
m_listCallsigns = {};
|
||||
}
|
||||
|
||||
CCallsignSet CVoiceChannelVatlib::getVoiceRoomCallsigns() const
|
||||
{
|
||||
return m_listCallsigns;
|
||||
}
|
||||
|
||||
void CVoiceChannelVatlib::setOwnAircraftCallsign(const CCallsign &callsign)
|
||||
{
|
||||
m_callsign = callsign;
|
||||
}
|
||||
|
||||
BlackMisc::Audio::CVoiceRoom CVoiceChannelVatlib::getVoiceRoom() const
|
||||
{
|
||||
return m_voiceRoom;
|
||||
}
|
||||
|
||||
bool CVoiceChannelVatlib::isMuted() const
|
||||
{
|
||||
// Remove
|
||||
return false;
|
||||
}
|
||||
|
||||
void CVoiceChannelVatlib::setVolume(int /* volume */)
|
||||
{
|
||||
// Remove
|
||||
}
|
||||
|
||||
int CVoiceChannelVatlib::getVolume() const
|
||||
{
|
||||
// Remove
|
||||
return 100;
|
||||
}
|
||||
|
||||
VatVoiceChannel CVoiceChannelVatlib::getVoiceChannel() const
|
||||
{
|
||||
return m_voiceChannel.data();
|
||||
}
|
||||
|
||||
CCallsign CVoiceChannelVatlib::extractCallsign(const QString &name)
|
||||
{
|
||||
CCallsign callsign;
|
||||
if (name.isEmpty()) return callsign;
|
||||
|
||||
// callsign might contain: VATSIM id, user name
|
||||
if (name.contains(" "))
|
||||
{
|
||||
QStringList parts = name.split(" ");
|
||||
callsign = CCallsign(parts[0]);
|
||||
// I throw away VATSIM id here, maybe we could use it
|
||||
}
|
||||
else
|
||||
{
|
||||
callsign = CCallsign(name);
|
||||
}
|
||||
|
||||
return callsign;
|
||||
}
|
||||
|
||||
void CVoiceChannelVatlib::userJoinedVoiceRoom(VatVoiceChannel, int /** id **/, const char *name)
|
||||
{
|
||||
CCallsign callsign(extractCallsign(name));
|
||||
m_listCallsigns.push_back(callsign);
|
||||
emit userJoinedRoom(callsign);
|
||||
}
|
||||
|
||||
void CVoiceChannelVatlib::userLeftVoiceRoom(VatVoiceChannel, int /** id **/, const char *name)
|
||||
{
|
||||
CCallsign callsign(extractCallsign(name));
|
||||
m_listCallsigns.remove(callsign);
|
||||
emit userLeftRoom(callsign);
|
||||
}
|
||||
|
||||
void CVoiceChannelVatlib::transmissionChanged(VatVoiceChannel, VatVoiceTransmissionStatus status)
|
||||
{
|
||||
if (status == vatVoiceStarted) emit audioStarted();
|
||||
else emit audioStopped();
|
||||
}
|
||||
|
||||
void CVoiceChannelVatlib::updateRoomStatus(VatVoiceChannel channel, VatConnectionStatus oldVatStatus, VatConnectionStatus newVatStatus)
|
||||
{
|
||||
Q_UNUSED(channel);
|
||||
Q_UNUSED(oldVatStatus);
|
||||
|
||||
IVoiceChannel::ConnectionStatus oldStatus = m_roomStatus;
|
||||
switch (newVatStatus)
|
||||
{
|
||||
case vatStatusConnecting:
|
||||
{
|
||||
m_roomStatus = IVoiceChannel::Connecting;
|
||||
break;
|
||||
}
|
||||
case vatStatusConnected:
|
||||
{
|
||||
m_voiceRoom.setConnected(true);
|
||||
m_roomStatus = IVoiceChannel::Connected;
|
||||
break;
|
||||
}
|
||||
case vatStatusDisconnecting:
|
||||
{
|
||||
m_roomStatus = IVoiceChannel::Disconnecting;
|
||||
break;
|
||||
}
|
||||
case vatStatusDisconnected:
|
||||
{
|
||||
// Clear all internals
|
||||
m_listCallsigns.clear();
|
||||
m_voiceRoom = {};
|
||||
m_roomStatus = IVoiceChannel::Disconnected;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
emit connectionStatusChanged(oldStatus, m_roomStatus);
|
||||
}
|
||||
|
||||
//! Cast void* to a pointer of CVoiceChannelVatlib
|
||||
CVoiceChannelVatlib *cbvar_cast_voiceChannel(void *cbvar)
|
||||
{
|
||||
return static_cast<CVoiceChannelVatlib *>(cbvar);
|
||||
}
|
||||
|
||||
void CVoiceChannelVatlib::processUserJoined(VatVoiceChannel channel, int id, const char *name, void *cbVar)
|
||||
{
|
||||
auto obj = cbvar_cast_voiceChannel(cbVar);
|
||||
obj->userJoinedVoiceRoom(channel, id, name);
|
||||
}
|
||||
|
||||
void CVoiceChannelVatlib::processUserLeft(VatVoiceChannel channel, int id, const char *name, void *cbVar)
|
||||
{
|
||||
auto obj = cbvar_cast_voiceChannel(cbVar);
|
||||
obj->userLeftVoiceRoom(channel, id, name);
|
||||
}
|
||||
|
||||
void CVoiceChannelVatlib::processTransmissionChange(VatVoiceChannel channel, VatVoiceTransmissionStatus status, void *cbVar)
|
||||
{
|
||||
auto obj = cbvar_cast_voiceChannel(cbVar);
|
||||
obj->transmissionChanged(channel, status);
|
||||
}
|
||||
|
||||
void CVoiceChannelVatlib::roomStatusUpdate(VatVoiceChannel channel, VatConnectionStatus oldStatus, VatConnectionStatus newStatus, void *cbVar)
|
||||
{
|
||||
auto obj = cbvar_cast_voiceChannel(cbVar);
|
||||
obj->updateRoomStatus(channel, oldStatus, newStatus);
|
||||
}
|
||||
} // ns
|
||||
|
||||
//! \endcond
|
||||
@@ -1,108 +0,0 @@
|
||||
/* Copyright (C) 2014
|
||||
* swift project community / contributors
|
||||
*
|
||||
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
|
||||
* directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
|
||||
* including this file, may be copied, modified, propagated, or distributed except according to the terms
|
||||
* contained in the LICENSE file.
|
||||
*/
|
||||
|
||||
//! \file
|
||||
|
||||
#ifndef BLACKCORE_VOICE_CHANNEL_VATLIB_H
|
||||
#define BLACKCORE_VOICE_CHANNEL_VATLIB_H
|
||||
|
||||
#include "blackcore/blackcoreexport.h"
|
||||
#include "blackcore/voicechannel.h"
|
||||
#include "blackmisc/audio/voiceroom.h"
|
||||
#include "blackmisc/aviation/callsign.h"
|
||||
#include "blackmisc/aviation/callsignset.h"
|
||||
#include "vatlib/vatlib.h"
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <QObject>
|
||||
#include <QScopedPointer>
|
||||
#include <QString>
|
||||
|
||||
struct VatProducerConsumer_tag;
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
class CVoiceChannelVatlibPrivate;
|
||||
|
||||
//! Class implementing the voice channel interface
|
||||
class BLACKCORE_EXPORT CVoiceChannelVatlib : public IVoiceChannel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
//! Default constructor
|
||||
CVoiceChannelVatlib(VatAudioService audioService, VatUDPAudioPort udpPort, QObject *parent = nullptr);
|
||||
|
||||
//! Destructor
|
||||
virtual ~CVoiceChannelVatlib();
|
||||
|
||||
//! \copydoc IVoiceChannel::joinVoiceRoom
|
||||
virtual void joinVoiceRoom(const BlackMisc::Audio::CVoiceRoom &voiceRoom) override;
|
||||
|
||||
//! \copydoc IVoiceChannel::leaveVoiceRoom
|
||||
virtual void leaveVoiceRoom() override;
|
||||
|
||||
//! \copydoc IVoiceChannel::getVoiceRoomCallsigns
|
||||
virtual BlackMisc::Aviation::CCallsignSet getVoiceRoomCallsigns() const override;
|
||||
|
||||
//! \copydoc IVoiceChannel::setOwnAircraftCallsign
|
||||
virtual void setOwnAircraftCallsign(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
|
||||
//! \copydoc IVoiceChannel::getVoiceRoom
|
||||
virtual BlackMisc::Audio::CVoiceRoom getVoiceRoom() const override;
|
||||
|
||||
//! \copydoc IVoiceChannel::isMuted
|
||||
virtual bool isMuted() const override;
|
||||
|
||||
//! Set channel volume
|
||||
virtual void setVolume(int volume) override;
|
||||
|
||||
//! Get channel volume
|
||||
virtual int getVolume() const override;
|
||||
|
||||
//! Get vatlib channel pointer
|
||||
VatVoiceChannel getVoiceChannel() const;
|
||||
|
||||
private:
|
||||
|
||||
struct VatVoiceChannelDeleter
|
||||
{
|
||||
static inline void cleanup(VatProducerConsumer_tag *obj)
|
||||
{
|
||||
if (obj) Vat_DestroyVoiceChannel(obj);
|
||||
}
|
||||
};
|
||||
|
||||
BlackMisc::Aviation::CCallsign extractCallsign(const QString &name);
|
||||
|
||||
void userJoinedVoiceRoom(VatVoiceChannel, int id, const char *name);
|
||||
void userLeftVoiceRoom(VatVoiceChannel, int id, const char *name);
|
||||
void transmissionChanged(VatVoiceChannel, VatVoiceTransmissionStatus status);
|
||||
void updateRoomStatus(VatVoiceChannel channel, VatConnectionStatus oldStatus, VatConnectionStatus newStatus);
|
||||
|
||||
static void processUserJoined(VatVoiceChannel channel, int id, const char *name, void *cbVar);
|
||||
static void processUserLeft(VatVoiceChannel channel, int id, const char *name, void *cbVar);
|
||||
static void processTransmissionChange(VatVoiceChannel channel, VatVoiceTransmissionStatus status, void *cbVar);
|
||||
|
||||
static void roomStatusUpdate(VatVoiceChannel channel, VatConnectionStatus oldStatus, VatConnectionStatus newStatus, void *cbVar);
|
||||
|
||||
BlackMisc::Aviation::CCallsign m_callsign; // Own callsign
|
||||
BlackMisc::Audio::CVoiceRoom m_voiceRoom; // Voice Room
|
||||
BlackMisc::Aviation::CCallsignSet m_listCallsigns; // Callsigns connected to room
|
||||
IVoiceChannel::ConnectionStatus m_roomStatus = IVoiceChannel::Disconnected; // Room connection status
|
||||
|
||||
VatAudioService m_audioService;
|
||||
VatUDPAudioPort m_udpPort;
|
||||
|
||||
QScopedPointer<VatProducerConsumer_tag, VatVoiceChannelDeleter> m_voiceChannel;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // guard
|
||||
@@ -1,140 +0,0 @@
|
||||
/* Copyright (C) 2013
|
||||
* swift Project Community / Contributors
|
||||
*
|
||||
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
|
||||
* directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
|
||||
* including this file, may be copied, modified, propagated, or distributed except according to the terms
|
||||
* contained in the LICENSE file.
|
||||
*/
|
||||
|
||||
#include "blackcore/audiodevice.h"
|
||||
#include "blackcore/audiodevicevatlib.h"
|
||||
#include "blackcore/audiomixervatlib.h"
|
||||
#include "blackcore/voicechannel.h"
|
||||
#include "blackcore/voicechannelvatlib.h"
|
||||
#include "blackcore/voicevatlib.h"
|
||||
#include "blackmisc/logmessage.h"
|
||||
#include "vatlib/vatlib.h"
|
||||
|
||||
#include <QtGlobal>
|
||||
#include <memory>
|
||||
|
||||
using namespace BlackMisc;
|
||||
using namespace BlackMisc::Audio;
|
||||
using namespace BlackMisc::Aviation;
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
CVoiceVatlib::CVoiceVatlib(QObject *parent) :
|
||||
IVoice(parent),
|
||||
m_audioService(Vat_CreateAudioService()),
|
||||
m_udpPort(Vat_CreateUDPAudioPort(m_audioService.data(), 0))
|
||||
{
|
||||
Vat_SetVoiceLogHandler(SeverityLevel::SeverityError, CVoiceVatlib::voiceLogHandler);
|
||||
|
||||
// do processing
|
||||
this->startTimer(10);
|
||||
}
|
||||
|
||||
CVoiceVatlib::~CVoiceVatlib() {}
|
||||
|
||||
QSharedPointer<IVoiceChannel> CVoiceVatlib::createVoiceChannel()
|
||||
{
|
||||
return QSharedPointer<IVoiceChannel>(new CVoiceChannelVatlib(m_audioService.data(), m_udpPort.data(), this));
|
||||
}
|
||||
|
||||
std::unique_ptr<IAudioInputDevice> CVoiceVatlib::createInputDevice()
|
||||
{
|
||||
return std::make_unique<CAudioInputDeviceVatlib>(m_audioService.data(), this);
|
||||
}
|
||||
|
||||
std::unique_ptr<IAudioOutputDevice> CVoiceVatlib::createOutputDevice()
|
||||
{
|
||||
return std::make_unique<CAudioOutputDeviceVatlib>(m_audioService.data(), this);
|
||||
}
|
||||
|
||||
std::unique_ptr<IAudioMixer> CVoiceVatlib::createAudioMixer()
|
||||
{
|
||||
return std::make_unique<CAudioMixerVatlib>(this);
|
||||
}
|
||||
|
||||
void CVoiceVatlib::connectVoice(IAudioInputDevice *device, IAudioMixer *mixer, IAudioMixer::InputPort inputPort)
|
||||
{
|
||||
auto audioInputVatlib = qobject_cast<CAudioInputDeviceVatlib*>(device);
|
||||
Q_ASSERT_X(audioInputVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioInputDeviceVatlib pointer.");
|
||||
|
||||
auto audioMixerVatlib = qobject_cast<CAudioMixerVatlib*>(mixer);
|
||||
Q_ASSERT_X(audioMixerVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioMixerVatlib pointer.");
|
||||
|
||||
Vat_ConnectProducerToProducerConsumer(audioInputVatlib->getVatLocalInputCodec(), 0, audioMixerVatlib->getVatAudioMixer(), inputPort);
|
||||
}
|
||||
|
||||
void CVoiceVatlib::connectVoice(IVoiceChannel *channel, IAudioMixer *mixer, IAudioMixer::InputPort inputPort)
|
||||
{
|
||||
auto voiceChannelVatlib = qobject_cast<CVoiceChannelVatlib*>(channel);
|
||||
Q_ASSERT_X(voiceChannelVatlib, "CVoiceVatlib::connectVoice", "No valid CVoiceChannelVatlib pointer.");
|
||||
|
||||
auto audioMixerVatlib = qobject_cast<CAudioMixerVatlib*>(mixer);
|
||||
Q_ASSERT_X(audioMixerVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioMixerVatlib pointer.");
|
||||
|
||||
Vat_ConnectProducerConsumerToProducerConsumer(voiceChannelVatlib->getVoiceChannel(), 0, audioMixerVatlib->getVatAudioMixer(), inputPort);
|
||||
}
|
||||
|
||||
void CVoiceVatlib::connectVoice(IAudioMixer *mixer, IAudioMixer::OutputPort outputPort, IAudioOutputDevice *device)
|
||||
{
|
||||
auto audioMixerVatlib = qobject_cast<CAudioMixerVatlib*>(mixer);
|
||||
Q_ASSERT_X(audioMixerVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioMixerVatlib pointer.");
|
||||
|
||||
auto audioDeviceVatlib = qobject_cast<CAudioOutputDeviceVatlib*>(device);
|
||||
Q_ASSERT_X(audioDeviceVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioOutputDeviceVatlib pointer.");
|
||||
|
||||
Vat_ConnectProducerConsumerToConsumer(audioMixerVatlib->getVatAudioMixer(), outputPort, audioDeviceVatlib->getVatLocalOutputCodec(), 0);
|
||||
}
|
||||
|
||||
void CVoiceVatlib::connectVoice(IAudioMixer *mixer, IAudioMixer::OutputPort outputPort, IVoiceChannel *channel)
|
||||
{
|
||||
auto audioMixerVatlib = qobject_cast<CAudioMixerVatlib*>(mixer);
|
||||
Q_ASSERT_X(audioMixerVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioMixerVatlib pointer.");
|
||||
|
||||
auto voiceChannelVatlib = qobject_cast<CVoiceChannelVatlib*>(channel);
|
||||
Q_ASSERT_X(voiceChannelVatlib, "CVoiceVatlib::connectVoice", "No valid CVoiceChannelVatlib pointer.");
|
||||
|
||||
Vat_ConnectProducerConsumerToProducerConsumer(audioMixerVatlib->getVatAudioMixer(), outputPort, voiceChannelVatlib->getVoiceChannel(), 0);
|
||||
}
|
||||
|
||||
void CVoiceVatlib::disconnectVoice(IAudioInputDevice *device)
|
||||
{
|
||||
auto audioInputVatlib = qobject_cast<CAudioInputDeviceVatlib*>(device);
|
||||
Q_ASSERT_X(audioInputVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioInputDeviceVatlib pointer.");
|
||||
Vat_ConnectProducerToConsumer(audioInputVatlib->getVatLocalInputCodec(), 0, nullptr, 0);
|
||||
}
|
||||
|
||||
void CVoiceVatlib::disconnectVoice(IVoiceChannel *channel)
|
||||
{
|
||||
auto voiceChannelVatlib = qobject_cast<CVoiceChannelVatlib*>(channel);
|
||||
Q_ASSERT_X(voiceChannelVatlib, "CVoiceVatlib::connectVoice", "No valid CVoiceChannelVatlib pointer.");
|
||||
Vat_ConnectProducerConsumerToConsumer(voiceChannelVatlib->getVoiceChannel(), 0, nullptr, 0);
|
||||
}
|
||||
|
||||
void CVoiceVatlib::disconnectVoice(IAudioMixer *mixer, IAudioMixer::OutputPort outputPort)
|
||||
{
|
||||
auto audioMixerVatlib = qobject_cast<CAudioMixerVatlib*>(mixer);
|
||||
Q_ASSERT_X(audioMixerVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioMixerVatlib pointer.");
|
||||
Vat_ConnectProducerConsumerToConsumer(audioMixerVatlib->getVatAudioMixer(), outputPort, nullptr, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Process voice handling
|
||||
*/
|
||||
void CVoiceVatlib::timerEvent(QTimerEvent *)
|
||||
{
|
||||
Q_ASSERT_X(m_audioService, "CVoiceVatlib", "VatAudioService invalid!");
|
||||
Vat_ExecuteTasks(m_audioService.data());
|
||||
}
|
||||
|
||||
void CVoiceVatlib::voiceLogHandler(SeverityLevel /** severity **/, const char *message)
|
||||
{
|
||||
CLogMessage(static_cast<CVoiceVatlib*>(nullptr)).error(message);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
@@ -1,123 +0,0 @@
|
||||
/* Copyright (C) 2013
|
||||
* swift Project Community / Contributors
|
||||
*
|
||||
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
|
||||
* directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
|
||||
* including this file, may be copied, modified, propagated, or distributed except according to the terms
|
||||
* contained in the LICENSE file.
|
||||
*/
|
||||
|
||||
//! \file
|
||||
|
||||
#ifndef BLACKCORE_VOICE_VATLIB_H
|
||||
#define BLACKCORE_VOICE_VATLIB_H
|
||||
|
||||
#include "blackcore/audiomixer.h"
|
||||
#include "blackcore/blackcoreexport.h"
|
||||
#include "blackcore/voice.h"
|
||||
|
||||
#include <vatlib/vatlib.h>
|
||||
#include <QObject>
|
||||
#include <QScopedPointer>
|
||||
#include <QSharedPointer>
|
||||
#include <memory>
|
||||
|
||||
class QTimerEvent;
|
||||
|
||||
struct VatAudioService_tag;
|
||||
struct VatUDPAudioPort_tag;
|
||||
template <class T> class QSharedPointer;
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
#ifndef NOMINMAX
|
||||
#define NOMINMAX
|
||||
#endif
|
||||
#include <Windows.h>
|
||||
#endif
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
class IAudioInputDevice;
|
||||
class IAudioOutputDevice;
|
||||
class IVoiceChannel;
|
||||
|
||||
//! Vatlib implementation of the IVoice interface.
|
||||
class BLACKCORE_EXPORT CVoiceVatlib : public IVoice
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
//! Default constructor
|
||||
CVoiceVatlib(QObject *parent = nullptr);
|
||||
|
||||
//! Destructor
|
||||
virtual ~CVoiceVatlib();
|
||||
|
||||
//! \copydoc IVoice::createVoiceChannel()
|
||||
virtual QSharedPointer<IVoiceChannel> createVoiceChannel() override;
|
||||
|
||||
//! \copydoc IVoice::createInputDevice()
|
||||
virtual std::unique_ptr<IAudioInputDevice> createInputDevice() override;
|
||||
|
||||
//! \copydoc IVoice::createOutputDevice()
|
||||
virtual std::unique_ptr<IAudioOutputDevice> createOutputDevice() override;
|
||||
|
||||
//! \copydoc IVoice::createAudioMixer()
|
||||
virtual std::unique_ptr<IAudioMixer> createAudioMixer() override;
|
||||
|
||||
//! \copydoc IVoice::connectVoice()
|
||||
virtual void connectVoice(IAudioInputDevice *device, IAudioMixer *mixer, IAudioMixer::InputPort inputPort) override;
|
||||
|
||||
//! \copydoc IVoice::connectVoice()
|
||||
virtual void connectVoice(IVoiceChannel *channel, IAudioMixer *mixer, IAudioMixer::InputPort inputPort) override;
|
||||
|
||||
//! \copydoc IVoice::connectVoice()
|
||||
virtual void connectVoice(IAudioMixer *mixer, IAudioMixer::OutputPort outputPort, IAudioOutputDevice *device) override;
|
||||
|
||||
//! \copydoc IVoice::connectVoice()
|
||||
virtual void connectVoice(IAudioMixer *mixer, IAudioMixer::OutputPort outputPort, IVoiceChannel *channel) override;
|
||||
|
||||
//! \copydoc IVoice::disconnectVoice()
|
||||
void disconnectVoice(IAudioInputDevice *device) override;
|
||||
|
||||
//! \copydoc IVoice::disconnectVoice()
|
||||
void disconnectVoice(IVoiceChannel *channel) override;
|
||||
|
||||
//! \copydoc IVoice::disconnectVoice()
|
||||
void disconnectVoice(IAudioMixer *mixer, IAudioMixer::OutputPort outputPort) override;
|
||||
|
||||
protected: // QObject overrides
|
||||
|
||||
//! Process voice lib
|
||||
virtual void timerEvent(QTimerEvent *) override;
|
||||
|
||||
private:
|
||||
|
||||
// this struct calls "myCustomDeallocator" to delete the pointer
|
||||
struct VatAudioServiceDeleter
|
||||
{
|
||||
static inline void cleanup(VatAudioService_tag *obj)
|
||||
{
|
||||
Vat_DestroyAudioService(obj);
|
||||
}
|
||||
};
|
||||
|
||||
struct VatUDPAudioPortDeleter
|
||||
{
|
||||
static inline void cleanup(VatUDPAudioPort_tag *obj)
|
||||
{
|
||||
Vat_DestroyUDPAudioPort(obj);
|
||||
}
|
||||
};
|
||||
|
||||
static void voiceLogHandler(SeverityLevel severity, const char *message);
|
||||
|
||||
QScopedPointer<VatAudioService_tag, VatAudioServiceDeleter> m_audioService;
|
||||
QScopedPointer<VatUDPAudioPort_tag, VatUDPAudioPortDeleter> m_udpPort;
|
||||
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
#endif // guard
|
||||
Reference in New Issue
Block a user