Upgrade to vatlib v0.9.7

This commit is contained in:
Roland Winklmeier
2017-12-11 14:48:44 +01:00
committed by Klaus Basan
parent dd0f4058f2
commit d68f678cc5
11 changed files with 138 additions and 131 deletions

View File

@@ -7,6 +7,7 @@
* contained in the LICENSE file.
*/
#include "blackcore/audiodevice.h"
#include "blackcore/audiomixer.h"
#include "blackcore/context/contextaudioimpl.h"

View File

@@ -35,9 +35,8 @@ namespace BlackCore
return static_cast<CAudioOutputDeviceVatlib *>(cbvar);
}
CAudioInputDeviceVatlib::CAudioInputDeviceVatlib(VatAudioService audioService, QObject *parent)
: IAudioInputDevice(parent),
m_audioService(audioService)
CAudioInputDeviceVatlib::CAudioInputDeviceVatlib(VatAudioService *audioService, QObject *parent)
: IAudioInputDevice(parent)
{
m_inputCodec.reset(Vat_CreateLocalInputCodec(audioService, vatCodecLegacy));
Vat_GetInputDeviceInfo(m_inputCodec.data(), onInputHardwareDeviceReceived, this, nullptr);
@@ -82,11 +81,10 @@ namespace BlackCore
cbvar_cast_inputDevice(cbVar)->m_devices.push_back(inputDevice);
}
CAudioOutputDeviceVatlib::CAudioOutputDeviceVatlib(VatAudioService audioService, QObject *parent)
: IAudioOutputDevice(parent),
m_audioService(audioService)
CAudioOutputDeviceVatlib::CAudioOutputDeviceVatlib(VatAudioService *audioService, QObject *parent)
: IAudioOutputDevice(parent)
{
m_outputCodec.reset(Vat_CreateLocalOutputCodec(m_audioService, vatCodecLegacy));
m_outputCodec.reset(Vat_CreateLocalOutputCodec(audioService, vatCodecLegacy));
Vat_GetOutputDeviceInfo(m_outputCodec.data(), onOutputHardwareDeviceReceived, this, nullptr);
m_currentDevice = getDefaultOutputDevice();
}

View File

@@ -21,9 +21,6 @@
#include <QObject>
#include <QScopedPointer>
struct VatConsumer_tag;
struct VatProducer_tag;
namespace BlackCore
{
namespace Vatsim
@@ -36,7 +33,7 @@ namespace BlackCore
public:
//! Constructor
CAudioInputDeviceVatlib(VatAudioService audioService, QObject *parent = nullptr);
CAudioInputDeviceVatlib(VatAudioService *audioService, QObject *parent = nullptr);
//! Destructor
virtual ~CAudioInputDeviceVatlib() = default;
@@ -54,13 +51,13 @@ namespace BlackCore
virtual void setInputDevice(const BlackMisc::Audio::CAudioDeviceInfo &device) override;
//! Get vatlib input device pointer
VatLocalInputCodec getVatLocalInputCodec() { return m_inputCodec.data(); }
VatLocalInputCodec *getVatLocalInputCodec() { return m_inputCodec.data(); }
private:
struct VatLocalInputCodecDeleter
{
static inline void cleanup(VatProducer_tag *obj)
static inline void cleanup(VatLocalInputCodec *obj)
{
if (obj) Vat_DestroyLocalInputCodec(obj);
}
@@ -71,8 +68,7 @@ namespace BlackCore
BlackMisc::Audio::CAudioDeviceInfoList m_devices; /*!< in and output devices */
BlackMisc::Audio::CAudioDeviceInfo m_currentDevice;
VatAudioService m_audioService;
QScopedPointer<VatProducer_tag, VatLocalInputCodecDeleter> m_inputCodec;
QScopedPointer<VatLocalInputCodec, VatLocalInputCodecDeleter> m_inputCodec;
};
//! Audio Output Device
@@ -83,7 +79,7 @@ namespace BlackCore
public:
//! Constructor
CAudioOutputDeviceVatlib(VatAudioService audioService, QObject *parent = nullptr);
CAudioOutputDeviceVatlib(VatAudioService *audioService, QObject *parent = nullptr);
//! Destructor
virtual ~CAudioOutputDeviceVatlib() = default;
@@ -107,13 +103,13 @@ namespace BlackCore
virtual int getOutputVolume() const override;
//! Get vatlib output device pointer
VatLocalOutputCodec getVatLocalOutputCodec() { return m_outputCodec.data(); }
VatLocalOutputCodec *getVatLocalOutputCodec() { return m_outputCodec.data(); }
private:
struct VatLocalOutputCodecDeleter
{
static inline void cleanup(VatConsumer_tag *obj)
static inline void cleanup(VatLocalOutputCodec *obj)
{
if (obj) Vat_DestroyLocalOutputCodec(obj);
}
@@ -125,8 +121,7 @@ namespace BlackCore
BlackMisc::Audio::CAudioDeviceInfoList m_devices; /*!< in and output devices */
BlackMisc::Audio::CAudioDeviceInfo m_currentDevice;
VatAudioService m_audioService;
QScopedPointer<VatConsumer_tag, VatLocalOutputCodecDeleter> m_outputCodec;
QScopedPointer<VatLocalOutputCodec, VatLocalOutputCodecDeleter> m_outputCodec;
};
} // ns
} // ns

View File

@@ -20,8 +20,6 @@
#include <QObject>
#include <QScopedPointer>
struct VatProducerConsumer_tag;
namespace BlackCore
{
namespace Vatsim
@@ -52,19 +50,19 @@ namespace BlackCore
virtual bool hasMixerConnection(InputPort inputPort, OutputPort outputPort) override;
//! Return the pointer to vatlib audio mixer
VatAudioMixer getVatAudioMixer() { return m_audioMixer.data(); }
VatAudioMixer *getVatAudioMixer() { return m_audioMixer.data(); }
private:
struct VatAudioMixerDeleter
{
static inline void cleanup(VatProducerConsumer_tag *obj)
static inline void cleanup(VatAudioMixer *obj)
{
if (obj) Vat_DestroyAudioMixer(obj);
}
};
QScopedPointer<VatProducerConsumer_tag, VatAudioMixerDeleter> m_audioMixer;
QScopedPointer<VatAudioMixer, VatAudioMixerDeleter> m_audioMixer;
};
} // ns
} // ns

View File

@@ -60,7 +60,7 @@
#include <type_traits>
static_assert(! std::is_abstract<BlackCore::Vatsim::CNetworkVatlib>::value, "Must implement all pure virtuals");
static_assert(VAT_LIBVATLIB_VERSION == 906, "Wrong vatlib header installed");
static_assert(VAT_LIBVATLIB_VERSION == 907, "Wrong vatlib header installed");
using namespace BlackConfig;
using namespace BlackMisc;
@@ -84,7 +84,7 @@ namespace BlackCore
CNetworkVatlib::CNetworkVatlib(IOwnAircraftProvider *ownAircraft, QObject *parent)
: INetwork(parent), COwnAircraftAware(ownAircraft),
m_loginMode(LoginNormal),
m_status(vatStatusIdle),
m_status(vatStatusDisconnected),
m_tokenBucket(10, CTime(5, CTimeUnit::s()), 1)
{
connect(this, &CNetworkVatlib::terminate, this, &INetwork::terminateConnection, Qt::QueuedConnection);
@@ -132,7 +132,8 @@ namespace BlackCore
}
m_net.reset(Vat_CreateNetworkSession(serverType, sApp->swiftVersionChar(),
CBuildConfig::getVersion().majorVersion(), CBuildConfig::getVersion().minorVersion(),
CBuildConfig::getVersion().majorVersion(),
CBuildConfig::getVersion().minorVersion(),
"None", clientId, clientKey.toLocal8Bit().constData(),
clientCapabilities));
@@ -149,7 +150,7 @@ namespace BlackCore
Vat_SetMetarResponseHandler(m_net.data(), onMetarReceived, this);
Vat_SetClientQueryHandler(m_net.data(), onInfoQueryRequestReceived, this);
Vat_SetClientQueryResponseHandler(m_net.data(), onInfoQueryReplyReceived, this);
Vat_SetInfoCAPSReplyHandler(m_net.data(), onCapabilitiesReplyReceived, this);
Vat_SetClientCapabilitiesReplyHandler(m_net.data(), onCapabilitiesReplyReceived, this);
Vat_SetControllerAtisHandler(m_net.data(), onAtisReplyReceived, this);
Vat_SetFlightPlanHandler(m_net.data(), onFlightPlanReceived, this);
Vat_SetServerErrorHandler(m_net.data(), onErrorReceived, this);
@@ -248,12 +249,10 @@ namespace BlackCore
{
switch (status)
{
case vatStatusIdle: return INetwork::Disconnected;
case vatStatusConnecting: return INetwork::Connecting;
case vatStatusConnected: return INetwork::Connected;
case vatStatusDisconnected: return INetwork::Disconnected;
case vatStatusDisconnecting: return INetwork::Disconnecting;
case vatStatusError: return INetwork::DisconnectedError;
}
qFatal("unrecognised connection status");
return INetwork::DisconnectedError;
@@ -372,11 +371,11 @@ namespace BlackCore
//! \fixme Define recognized simulators somewhere */
if (simInfo.getSimulator() == "fs9" || simInfo.getSimulator() == "fsx")
{
return vatSimTypeMSCFS;
return vatSimTypeMSFS95;
}
else if (simInfo.getSimulator() == "xplane")
{
return vatSimTypeXPLANE;
return vatSimTypeXPLANE10;
}
else
{
@@ -795,19 +794,19 @@ namespace BlackCore
return static_cast<CNetworkVatlib *>(cbvar);
}
void CNetworkVatlib::onConnectionStatusChanged(VatSessionID, VatConnectionStatus, VatConnectionStatus newStatus, void *cbvar)
void CNetworkVatlib::onConnectionStatusChanged(VatFsdClient *, VatConnectionStatus, VatConnectionStatus newStatus, void *cbvar)
{
cbvar_cast(cbvar)->changeConnectionStatus(newStatus);
}
void CNetworkVatlib::onTextMessageReceived(VatSessionID, const char *from, const char *to, const char *msg, void *cbvar)
void CNetworkVatlib::onTextMessageReceived(VatFsdClient *, const char *from, const char *to, const char *msg, void *cbvar)
{
CTextMessage tm(cbvar_cast(cbvar)->fromFSD(msg), CCallsign(cbvar_cast(cbvar)->fromFSD(from)), CCallsign(cbvar_cast(cbvar)->fromFSD(to)));
tm.setCurrentUtcTime();
cbvar_cast(cbvar)->consolidateTextMessage(tm);
}
void CNetworkVatlib::onRadioMessageReceived(VatSessionID, const char *from, int numFreq, int *freqList, const char *msg, void *cbvar)
void CNetworkVatlib::onRadioMessageReceived(VatFsdClient *, const char *from, int numFreq, int *freqList, const char *msg, void *cbvar)
{
auto *self = cbvar_cast(cbvar);
const int com1 = self->getOwnAircraft().getCom1System().getFrequencyActive().valueInteger(CFrequencyUnit::kHz());
@@ -826,18 +825,18 @@ namespace BlackCore
emit cbvar_cast(cbvar)->textMessagesReceived(messages);
}
void CNetworkVatlib::onPilotDisconnected(VatSessionID, const char *callsign, void *cbvar)
void CNetworkVatlib::onPilotDisconnected(VatFsdClient *, const char *callsign, void *cbvar)
{
auto *self = cbvar_cast(cbvar);
emit self->pilotDisconnected(CCallsign(self->fromFSD(callsign), CCallsign::Aircraft));
}
void CNetworkVatlib::onControllerDisconnected(VatSessionID, const char *callsign, void *cbvar)
void CNetworkVatlib::onControllerDisconnected(VatFsdClient *, const char *callsign, void *cbvar)
{
emit cbvar_cast(cbvar)->atcDisconnected(CCallsign(cbvar_cast(cbvar)->fromFSD(callsign), CCallsign::Atc));
}
void CNetworkVatlib::onPilotPositionUpdate(VatSessionID, const char *callsignChar , const VatPilotPosition *position, void *cbvar)
void CNetworkVatlib::onPilotPositionUpdate(VatFsdClient *, const char *callsignChar , const VatPilotPosition *position, void *cbvar)
{
const CCallsign callsign(callsignChar, CCallsign::Aircraft);
CAircraftSituation situation(
@@ -878,7 +877,7 @@ namespace BlackCore
emit cbvar_cast(cbvar)->aircraftPositionUpdate(situation, transponder);
}
void CNetworkVatlib::onAircraftConfigReceived(VatSessionID, const char *callsignChar, const char *aircraftConfig, void *cbvar)
void CNetworkVatlib::onAircraftConfigReceived(VatFsdClient *, const char *callsignChar, const char *aircraftConfig, void *cbvar)
{
const QByteArray json = cbvar_cast(cbvar)->fromFSD(aircraftConfig).toUtf8();
QJsonParseError parserError;
@@ -905,7 +904,7 @@ namespace BlackCore
emit self->aircraftConfigPacketReceived(callsign, config, isFull);
}
void CNetworkVatlib::onInterimPilotPositionUpdate(VatSessionID, const char *sender, const VatInterimPilotPosition *position, void *cbvar)
void CNetworkVatlib::onInterimPilotPositionUpdate(VatFsdClient *, const char *sender, const VatInterimPilotPosition *position, void *cbvar)
{
auto *self = cbvar_cast(cbvar);
CAircraftSituation situation(
@@ -924,7 +923,7 @@ namespace BlackCore
emit self->aircraftInterimPositionUpdate(situation);
}
void CNetworkVatlib::onAtcPositionUpdate(VatSessionID, const char *callsign, const VatAtcPosition *pos, void *cbvar)
void CNetworkVatlib::onAtcPositionUpdate(VatFsdClient *, const char *callsign, const VatAtcPosition *pos, void *cbvar)
{
const int frequencyKHz = pos->frequency;
CFrequency freq(frequencyKHz, CFrequencyUnit::kHz());
@@ -934,17 +933,17 @@ namespace BlackCore
CCoordinateGeodetic(pos->latitude, pos->longitude, 0), CLength(pos->visibleRange, CLengthUnit::NM()));
}
void CNetworkVatlib::onKicked(VatSessionID, const char *reason, void *cbvar)
void CNetworkVatlib::onKicked(VatFsdClient *, const char *reason, void *cbvar)
{
emit cbvar_cast(cbvar)->kicked(cbvar_cast(cbvar)->fromFSD(reason));
}
void CNetworkVatlib::onPong(VatSessionID, const char *sender, double elapsedTime, void *cbvar)
void CNetworkVatlib::onPong(VatFsdClient *, const char *sender, double elapsedTime, void *cbvar)
{
emit cbvar_cast(cbvar)->pongReceived(cbvar_cast(cbvar)->fromFSD(sender), CTime(elapsedTime, CTimeUnit::ms()));
}
void CNetworkVatlib::onCustomPacketReceived(VatSessionID, const char *callsign, const char *packetId, const char **data, int dataSize, void *cbvar)
void CNetworkVatlib::onCustomPacketReceived(VatFsdClient *, const char *callsign, const char *packetId, const char **data, int dataSize, void *cbvar)
{
cbvar_cast(cbvar)->customPacketDispatcher(cbvar_cast(cbvar)->fromFSD(callsign), cbvar_cast(cbvar)->fromFSD(packetId), cbvar_cast(cbvar)->fromFSD(data, dataSize));
}
@@ -1007,13 +1006,13 @@ namespace BlackCore
m_textMessagesToConsolidate.clear();
}
void CNetworkVatlib::onMetarReceived(VatSessionID, const char *data, void *cbvar)
void CNetworkVatlib::onMetarReceived(VatFsdClient *, const char *data, void *cbvar)
{
auto *self = cbvar_cast(cbvar);
emit self->metarReplyReceived(self->fromFSD(data));
}
void CNetworkVatlib::onInfoQueryRequestReceived(VatSessionID, const char *callsignString, VatClientQueryType type, const char *, void *cbvar)
void CNetworkVatlib::onInfoQueryRequestReceived(VatFsdClient *, const char *callsignString, VatClientQueryType type, const char *, void *cbvar)
{
auto *self = cbvar_cast(cbvar);
const CCallsign callsign(self->fromFSD(callsignString));
@@ -1030,7 +1029,7 @@ namespace BlackCore
}
}
void CNetworkVatlib::onInfoQueryReplyReceived(VatSessionID, const char *callsign, VatClientQueryType type, const char *data, const char *data2, void *cbvar)
void CNetworkVatlib::onInfoQueryReplyReceived(VatFsdClient *, const char *callsign, VatClientQueryType type, const char *data, const char *data2, void *cbvar)
{
auto *self = cbvar_cast(cbvar);
switch (type)
@@ -1044,7 +1043,7 @@ namespace BlackCore
}
}
void CNetworkVatlib::onCapabilitiesReplyReceived(VatSessionID, const char *callsign, int capabilityFlags, void *cbvar)
void CNetworkVatlib::onCapabilitiesReplyReceived(VatFsdClient *, const char *callsign, int capabilityFlags, void *cbvar)
{
int flags = 0;
if (capabilityFlags & vatCapsAtcInfo) { flags |= AcceptsAtisResponses; }
@@ -1055,7 +1054,7 @@ namespace BlackCore
emit self->capabilitiesReplyReceived(self->fromFSD(callsign), flags);
}
void CNetworkVatlib::onAtisReplyReceived(VatSessionID, const char *callsign, const VatControllerAtis *atis, void *cbvar)
void CNetworkVatlib::onAtisReplyReceived(VatFsdClient *, const char *callsign, const VatControllerAtis *atis, void *cbvar)
{
auto *self = cbvar_cast(cbvar);
emit self->atisVoiceRoomReplyReceived(self->fromFSD(callsign), self->fromFSD(atis->voiceRoom));
@@ -1084,7 +1083,7 @@ namespace BlackCore
emit self->atisReplyReceived(CCallsign(self->fromFSD(callsign), CCallsign::Atc), atisMessage);
}
void CNetworkVatlib::onFlightPlanReceived(VatSessionID, const char *callsignChar, const VatFlightPlan *fp, void *cbvar)
void CNetworkVatlib::onFlightPlanReceived(VatFsdClient *, const char *callsignChar, const VatFlightPlan *fp, void *cbvar)
{
CFlightPlan::FlightRules rules = CFlightPlan::VFR;
switch (fp->flightType)
@@ -1130,7 +1129,7 @@ namespace BlackCore
emit self->flightPlanReplyReceived(callsign, flightPlan);
}
void CNetworkVatlib::onErrorReceived(VatSessionID, VatServerError error, const char *msg, const char *data, void *cbvar)
void CNetworkVatlib::onErrorReceived(VatFsdClient *, VatServerError error, const char *msg, const char *data, void *cbvar)
{
auto *self = cbvar_cast(cbvar);
switch (error)
@@ -1160,14 +1159,14 @@ namespace BlackCore
}
}
void CNetworkVatlib::onPilotInfoRequestReceived(VatSessionID, const char *callsignChar, void *cbvar)
void CNetworkVatlib::onPilotInfoRequestReceived(VatFsdClient *, const char *callsignChar, void *cbvar)
{
auto *self = cbvar_cast(cbvar);
const CCallsign callsign(self->fromFSD(callsignChar));
QTimer::singleShot(0, self, [ = ]() { self->sendAircraftInfo(callsign); });
}
void CNetworkVatlib::onPilotInfoReceived(VatSessionID, const char *callsignChar, const VatAircraftInfo *aircraftInfo, void *cbvar)
void CNetworkVatlib::onPilotInfoReceived(VatFsdClient *, const char *callsignChar, const VatAircraftInfo *aircraftInfo, void *cbvar)
{
auto *self = cbvar_cast(cbvar);
const CCallsign callsign(self->fromFSD(callsignChar), CCallsign::Aircraft);
@@ -1179,9 +1178,13 @@ namespace BlackCore
);
}
void CNetworkVatlib::networkLogHandler(SeverityLevel /** severity **/, const char *message)
void CNetworkVatlib::networkLogHandler(SeverityLevel /** severity **/, const char *context, const char *message)
{
CLogMessage(static_cast<CNetworkVatlib *>(nullptr)).error(message);
QString errorMessage("vatlib ");
errorMessage += context;
errorMessage += ": ";
errorMessage += message;
CLogMessage(static_cast<CNetworkVatlib *>(nullptr)).error(errorMessage);
}
const QJsonObject &CNetworkVatlib::JsonPackets::aircraftConfigRequest()

View File

@@ -141,27 +141,27 @@ namespace BlackCore
//! \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);
static void onConnectionStatusChanged(VatFsdClient *, VatConnectionStatus oldStatus, VatConnectionStatus newStatus, void *cbvar);
static void onTextMessageReceived(VatFsdClient *, const char *from, const char *to, const char *msg, void *cbvar);
static void onRadioMessageReceived(VatFsdClient *, const char *from, int freqCount, int *freqList, const char *message, void *cbvar);
static void onControllerDisconnected(VatFsdClient *, const char *callsign, void *cbvar);
static void onInterimPilotPositionUpdate(VatFsdClient *, const char *sender, const VatInterimPilotPosition *position, void *cbvar);
static void onAtcPositionUpdate(VatFsdClient *, const char *callsign, const VatAtcPosition *pos, void *cbvar);
static void onKicked(VatFsdClient *, const char *reason, void *cbvar);
static void onPong(VatFsdClient *, const char *sender, double elapsedTime, void *cbvar);
static void onMetarReceived(VatFsdClient *, const char *data, void *cbvar);
static void onInfoQueryRequestReceived(VatFsdClient *, const char *callsign, VatClientQueryType type, const char *data, void *cbvar);
static void onInfoQueryReplyReceived(VatFsdClient *, const char *callsign, VatClientQueryType type, const char *data, const char *data2, void *cbvar);
static void onCapabilitiesReplyReceived(VatFsdClient *, const char *callsign, int capabilityFlags, void *cbvar);
static void onAtisReplyReceived(VatFsdClient *, const char *callsign, const VatControllerAtis *atis, void *cbvar);
static void onFlightPlanReceived(VatFsdClient *, const char *callsign, const VatFlightPlan *fp, void *cbvar);
static void onErrorReceived(VatFsdClient *, VatServerError error, const char *msg, const char *data, void *cbvar);
static void onPilotDisconnected(VatFsdClient *, const char *callsign, void *cbvar);
static void onPilotInfoRequestReceived(VatFsdClient *, const char *callsign, void *cbvar);
static void onPilotInfoReceived(VatFsdClient *, const char *callsign, const VatAircraftInfo *aircraftInfo, void *cbvar);
static void onPilotPositionUpdate(VatFsdClient *, const char *callsign, const VatPilotPosition *position, void *cbvar);
static void onAircraftConfigReceived(VatFsdClient *, const char *callsign, const char *aircraftConfig, void *cbvar);
static void onCustomPacketReceived(VatFsdClient *, const char *callsign, const char *packetId, const char **data, int dataSize, void *cbvar);
//! @}
QByteArray toFSD(const QString &qstr) const;
@@ -177,7 +177,7 @@ namespace BlackCore
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);
static void networkLogHandler(SeverityLevel severity, const char *context, const char *message);
void sendCustomPacket(const BlackMisc::Aviation::CCallsign &callsign, const QString &packetId, const QStringList &data);
static const QString &defaultModelString()
@@ -208,13 +208,13 @@ namespace BlackCore
void emitConsolidatedTextMessages();
//! Deletion policy for QScopedPointer
struct VatlibQScopedPointerDeleter
struct VatFsdClientDeleter
{
//! Called by QScopedPointer destructor
static void cleanup(VatSessionID session) { if (session) Vat_DestroyNetworkSession(session); }
static void cleanup(VatFsdClient *session) { if (session) Vat_DestroyNetworkSession(session); }
};
QScopedPointer<PCSBClient, VatlibQScopedPointerDeleter> m_net;
QScopedPointer<VatFsdClient, VatFsdClientDeleter> m_net;
LoginMode m_loginMode;
VatConnectionStatus m_status;
BlackMisc::Network::CServer m_server;

View File

@@ -9,6 +9,8 @@
//! \cond PRIVATE
#include "blackcore/application.h"
#include "blackcore/context/contextnetwork.h"
#include "blackcore/vatsim/voicechannelvatlib.h"
#include "blackmisc/logmessage.h"
#include "blackmisc/statusmessage.h"
@@ -20,21 +22,20 @@
using namespace BlackMisc;
using namespace BlackMisc::Audio;
using namespace BlackMisc::Aviation;
using namespace BlackMisc::Network;
namespace BlackCore
{
namespace Vatsim
{
CVoiceChannelVatlib::CVoiceChannelVatlib(VatAudioService audioService, VatUDPAudioPort udpPort, QObject *parent)
: IVoiceChannel(parent),
m_audioService(audioService),
m_udpPort(udpPort)
CVoiceChannelVatlib::CVoiceChannelVatlib(VatAudioService *audioService, VatUDPAudioPort *udpPort, QObject *parent)
: IVoiceChannel(parent)
{
m_voiceChannel.reset(Vat_CreateVoiceChannel(m_audioService, "", 3782, "", "", m_udpPort));
m_voiceChannel.reset(Vat_CreateVoiceChannel(audioService, "", 3782, "", "", 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);
Vat_SetVoiceReceptionHandler(m_voiceChannel.data(), processVoiceReceptionChanged, this);
}
@@ -47,6 +48,14 @@ namespace BlackCore
{
if (m_roomStatus == IVoiceChannel::Connecting || m_roomStatus == IVoiceChannel::Connected) return;
// Make sure we are connected to a VATSIM FSD
CServer::ServerType connectedServerType = sApp->getIContextNetwork()->getConnectedServer().getServerType();
if (!sApp->getIContextNetwork()->isConnected() || connectedServerType != CServer::FSDServerVatsim)
{
CLogMessage(this).warning("Cannot join VATSIM voice channel without active VATSIM FSD connection!");
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,
@@ -101,7 +110,7 @@ namespace BlackCore
return 100;
}
VatVoiceChannel CVoiceChannelVatlib::getVoiceChannel() const
VatVoiceChannel *CVoiceChannelVatlib::getVoiceChannel() const
{
return m_voiceChannel.data();
}
@@ -126,27 +135,27 @@ namespace BlackCore
return callsign;
}
void CVoiceChannelVatlib::userJoinedVoiceRoom(VatVoiceChannel, int /** id **/, const char *name)
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)
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)
void CVoiceChannelVatlib::voiceReceptionChanged(VatVoiceChannel *, bool isVoiceReceiving)
{
if (status == vatVoiceStarted) emit audioStarted();
if (isVoiceReceiving) emit audioStarted();
else emit audioStopped();
}
void CVoiceChannelVatlib::updateRoomStatus(VatVoiceChannel channel, VatConnectionStatus oldVatStatus, VatConnectionStatus newVatStatus)
void CVoiceChannelVatlib::updateRoomStatus(VatVoiceChannel *channel, VatConnectionStatus oldVatStatus, VatConnectionStatus newVatStatus)
{
Q_UNUSED(channel);
Q_UNUSED(oldVatStatus);
@@ -190,25 +199,25 @@ namespace BlackCore
return static_cast<CVoiceChannelVatlib *>(cbvar);
}
void CVoiceChannelVatlib::processUserJoined(VatVoiceChannel channel, int id, const char *name, void *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)
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)
void CVoiceChannelVatlib::processVoiceReceptionChanged(VatVoiceChannel *channel, bool isVoiceReceiving, void *cbVar)
{
auto obj = cbvar_cast_voiceChannel(cbVar);
obj->transmissionChanged(channel, status);
obj->voiceReceptionChanged(channel, isVoiceReceiving);
}
void CVoiceChannelVatlib::roomStatusUpdate(VatVoiceChannel channel, VatConnectionStatus oldStatus, VatConnectionStatus newStatus, void *cbVar)
void CVoiceChannelVatlib::roomStatusUpdate(VatVoiceChannel *channel, VatConnectionStatus oldStatus, VatConnectionStatus newStatus, void *cbVar)
{
auto obj = cbvar_cast_voiceChannel(cbVar);
obj->updateRoomStatus(channel, oldStatus, newStatus);

View File

@@ -24,8 +24,6 @@
#include <QScopedPointer>
#include <QString>
struct VatProducerConsumer_tag;
namespace BlackCore
{
namespace Vatsim
@@ -40,7 +38,7 @@ namespace BlackCore
public:
//! Default constructor
CVoiceChannelVatlib(VatAudioService audioService, VatUDPAudioPort udpPort, QObject *parent = nullptr);
CVoiceChannelVatlib(VatAudioService *audioService, VatUDPAudioPort *udpPort, QObject *parent = nullptr);
//! Destructor
virtual ~CVoiceChannelVatlib();
@@ -70,13 +68,13 @@ namespace BlackCore
virtual int getVolume() const override;
//! Get vatlib channel pointer
VatVoiceChannel getVoiceChannel() const;
VatVoiceChannel *getVoiceChannel() const;
private:
struct VatVoiceChannelDeleter
{
static inline void cleanup(VatProducerConsumer_tag *obj)
static inline void cleanup(VatVoiceChannel *obj)
{
if (obj) Vat_DestroyVoiceChannel(obj);
}
@@ -84,26 +82,23 @@ namespace BlackCore
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);
void userJoinedVoiceRoom(VatVoiceChannel *, int id, const char *name);
void userLeftVoiceRoom(VatVoiceChannel *, int id, const char *name);
void voiceReceptionChanged(VatVoiceChannel *, bool isVoiceReceiving);
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 processUserJoined(VatVoiceChannel *channel, int id, const char *name, void *cbVar);
static void processUserLeft(VatVoiceChannel *channel, int id, const char *name, void *cbVar);
static void processVoiceReceptionChanged(VatVoiceChannel *channel, bool isVoiceReceiving, void *cbVar);
static void roomStatusUpdate(VatVoiceChannel channel, VatConnectionStatus oldStatus, VatConnectionStatus newStatus, 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;
QScopedPointer<VatVoiceChannel, VatVoiceChannelDeleter> m_voiceChannel;
};
} // ns
} // ns

View File

@@ -74,7 +74,8 @@ namespace BlackCore
auto audioMixerVatlib = qobject_cast<CAudioMixerVatlib *>(mixer);
Q_ASSERT_X(audioMixerVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioMixerVatlib pointer.");
Vat_ConnectProducerToProducerConsumer(audioInputVatlib->getVatLocalInputCodec(), 0, audioMixerVatlib->getVatAudioMixer(), inputPort);
Vat_VoiceConnect(VatProducerLocalInput, audioInputVatlib->getVatLocalInputCodec(), 0,
VatConsumerAudioMixer, audioMixerVatlib->getVatAudioMixer(), inputPort);
}
void CVoiceVatlib::connectVoice(IVoiceChannel *channel, IAudioMixer *mixer, IAudioMixer::InputPort inputPort)
@@ -85,7 +86,8 @@ namespace BlackCore
auto audioMixerVatlib = qobject_cast<CAudioMixerVatlib *>(mixer);
Q_ASSERT_X(audioMixerVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioMixerVatlib pointer.");
Vat_ConnectProducerConsumerToProducerConsumer(voiceChannelVatlib->getVoiceChannel(), 0, audioMixerVatlib->getVatAudioMixer(), inputPort);
Vat_VoiceConnect(VatProducerVoiceChannel, voiceChannelVatlib->getVoiceChannel(), 0,
VatConsumerAudioMixer, audioMixerVatlib->getVatAudioMixer(), inputPort);
}
void CVoiceVatlib::connectVoice(IAudioMixer *mixer, IAudioMixer::OutputPort outputPort, IAudioOutputDevice *device)
@@ -96,7 +98,8 @@ namespace BlackCore
auto audioDeviceVatlib = qobject_cast<CAudioOutputDeviceVatlib *>(device);
Q_ASSERT_X(audioDeviceVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioOutputDeviceVatlib pointer.");
Vat_ConnectProducerConsumerToConsumer(audioMixerVatlib->getVatAudioMixer(), outputPort, audioDeviceVatlib->getVatLocalOutputCodec(), 0);
Vat_VoiceConnect(VatProducerAudioMixer, audioMixerVatlib->getVatAudioMixer(), outputPort,
VatConsumerLocalOutput, audioDeviceVatlib->getVatLocalOutputCodec(), 0);
}
void CVoiceVatlib::connectVoice(IAudioMixer *mixer, IAudioMixer::OutputPort outputPort, IVoiceChannel *channel)
@@ -107,39 +110,44 @@ namespace BlackCore
auto voiceChannelVatlib = qobject_cast<CVoiceChannelVatlib *>(channel);
Q_ASSERT_X(voiceChannelVatlib, "CVoiceVatlib::connectVoice", "No valid CVoiceChannelVatlib pointer.");
Vat_ConnectProducerConsumerToProducerConsumer(audioMixerVatlib->getVatAudioMixer(), outputPort, voiceChannelVatlib->getVoiceChannel(), 0);
Vat_VoiceConnect(VatProducerAudioMixer, audioMixerVatlib->getVatAudioMixer(), outputPort,
VatConsumerVoiceChannel, 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);
Vat_VoiceConnect(VatProducerLocalInput, audioInputVatlib->getVatLocalInputCodec(), 0, VatConsumerNone, 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);
Vat_VoiceConnect(VatProducerVoiceChannel, voiceChannelVatlib->getVoiceChannel(), 0, VatConsumerNone, 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);
Vat_VoiceConnect(VatProducerAudioMixer, audioMixerVatlib->getVatAudioMixer(), outputPort, VatConsumerNone, nullptr, 0);
}
void CVoiceVatlib::timerEvent(QTimerEvent *)
{
Q_ASSERT_X(m_audioService, "CVoiceVatlib", "VatAudioService invalid!");
Vat_ExecuteTasks(m_audioService.data());
Vat_ExecuteVoiceTasks(m_audioService.data());
}
void CVoiceVatlib::voiceLogHandler(SeverityLevel /** severity **/, const char *message)
void CVoiceVatlib::voiceLogHandler(SeverityLevel /** severity **/, const char *context, const char *message)
{
CLogMessage(static_cast<CVoiceVatlib *>(nullptr)).error(message);
QString errorMessage ("vatlib ");
errorMessage += context;
errorMessage += ": ";
errorMessage += message;
CLogMessage(static_cast<CVoiceVatlib *>(nullptr)).error(errorMessage);
}
} // namespace
} // namespace

View File

@@ -99,7 +99,7 @@ namespace BlackCore
//! this struct calls Vat_DestroyAudioService to delete the pointer
struct VatAudioServiceDeleter
{
static inline void cleanup(VatAudioService_tag *obj)
static inline void cleanup(VatAudioService *obj)
{
Vat_DestroyAudioService(obj);
}
@@ -108,16 +108,16 @@ namespace BlackCore
//! this struct calls Vat_DestroyUDPAudioPort to delete the pointer
struct VatUDPAudioPortDeleter
{
static inline void cleanup(VatUDPAudioPort_tag *obj)
static inline void cleanup(VatUDPAudioPort *obj)
{
Vat_DestroyUDPAudioPort(obj);
}
};
static void voiceLogHandler(SeverityLevel severity, const char *message);
static void voiceLogHandler(SeverityLevel severity, const char *context, const char *message);
QScopedPointer<VatAudioService_tag, VatAudioServiceDeleter> m_audioService;
QScopedPointer<VatUDPAudioPort_tag, VatUDPAudioPortDeleter> m_udpPort;
QScopedPointer<VatAudioService, VatAudioServiceDeleter> m_audioService;
QScopedPointer<VatUDPAudioPort, VatUDPAudioPortDeleter> m_udpPort;
};
} // namespace
} // namespace