diff --git a/externals b/externals index fe097bc32..db480d436 160000 --- a/externals +++ b/externals @@ -1 +1 @@ -Subproject commit fe097bc329e6310c37ccb7b51df62d96d7f8a5e4 +Subproject commit db480d43612a0e6cdfbb125aab64a01a1fca0dad diff --git a/src/blackcore/context/contextaudioimpl.cpp b/src/blackcore/context/contextaudioimpl.cpp index d380c97ed..7cdd09363 100644 --- a/src/blackcore/context/contextaudioimpl.cpp +++ b/src/blackcore/context/contextaudioimpl.cpp @@ -7,6 +7,7 @@ * contained in the LICENSE file. */ + #include "blackcore/audiodevice.h" #include "blackcore/audiomixer.h" #include "blackcore/context/contextaudioimpl.h" diff --git a/src/blackcore/vatsim/audiodevicevatlib.cpp b/src/blackcore/vatsim/audiodevicevatlib.cpp index efd998d32..0af5938ef 100644 --- a/src/blackcore/vatsim/audiodevicevatlib.cpp +++ b/src/blackcore/vatsim/audiodevicevatlib.cpp @@ -35,9 +35,8 @@ namespace BlackCore return static_cast(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(); } diff --git a/src/blackcore/vatsim/audiodevicevatlib.h b/src/blackcore/vatsim/audiodevicevatlib.h index 0790e02d5..cb32159b8 100644 --- a/src/blackcore/vatsim/audiodevicevatlib.h +++ b/src/blackcore/vatsim/audiodevicevatlib.h @@ -21,9 +21,6 @@ #include #include -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 m_inputCodec; + QScopedPointer 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 m_outputCodec; + QScopedPointer m_outputCodec; }; } // ns } // ns diff --git a/src/blackcore/vatsim/audiomixervatlib.h b/src/blackcore/vatsim/audiomixervatlib.h index 31c925857..a19a31471 100644 --- a/src/blackcore/vatsim/audiomixervatlib.h +++ b/src/blackcore/vatsim/audiomixervatlib.h @@ -20,8 +20,6 @@ #include #include -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 m_audioMixer; + QScopedPointer m_audioMixer; }; } // ns } // ns diff --git a/src/blackcore/vatsim/networkvatlib.cpp b/src/blackcore/vatsim/networkvatlib.cpp index 69c155e20..2f0049523 100644 --- a/src/blackcore/vatsim/networkvatlib.cpp +++ b/src/blackcore/vatsim/networkvatlib.cpp @@ -60,7 +60,7 @@ #include static_assert(! std::is_abstract::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(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(nullptr)).error(message); + QString errorMessage("vatlib "); + errorMessage += context; + errorMessage += ": "; + errorMessage += message; + CLogMessage(static_cast(nullptr)).error(errorMessage); } const QJsonObject &CNetworkVatlib::JsonPackets::aircraftConfigRequest() diff --git a/src/blackcore/vatsim/networkvatlib.h b/src/blackcore/vatsim/networkvatlib.h index 288dece52..de8132e22 100644 --- a/src/blackcore/vatsim/networkvatlib.h +++ b/src/blackcore/vatsim/networkvatlib.h @@ -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 m_net; + QScopedPointer m_net; LoginMode m_loginMode; VatConnectionStatus m_status; BlackMisc::Network::CServer m_server; diff --git a/src/blackcore/vatsim/voicechannelvatlib.cpp b/src/blackcore/vatsim/voicechannelvatlib.cpp index e4bf2a836..d1d95a0f7 100644 --- a/src/blackcore/vatsim/voicechannelvatlib.cpp +++ b/src/blackcore/vatsim/voicechannelvatlib.cpp @@ -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(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); diff --git a/src/blackcore/vatsim/voicechannelvatlib.h b/src/blackcore/vatsim/voicechannelvatlib.h index 5dede108a..8f095854b 100644 --- a/src/blackcore/vatsim/voicechannelvatlib.h +++ b/src/blackcore/vatsim/voicechannelvatlib.h @@ -24,8 +24,6 @@ #include #include -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 m_voiceChannel; + QScopedPointer m_voiceChannel; }; } // ns } // ns diff --git a/src/blackcore/vatsim/voicevatlib.cpp b/src/blackcore/vatsim/voicevatlib.cpp index f4826f539..c8bfbd499 100644 --- a/src/blackcore/vatsim/voicevatlib.cpp +++ b/src/blackcore/vatsim/voicevatlib.cpp @@ -74,7 +74,8 @@ namespace BlackCore auto audioMixerVatlib = qobject_cast(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(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(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(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(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(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(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(nullptr)).error(message); + QString errorMessage ("vatlib "); + errorMessage += context; + errorMessage += ": "; + errorMessage += message; + CLogMessage(static_cast(nullptr)).error(errorMessage); } } // namespace } // namespace diff --git a/src/blackcore/vatsim/voicevatlib.h b/src/blackcore/vatsim/voicevatlib.h index 92ad9990a..c2eda0287 100644 --- a/src/blackcore/vatsim/voicevatlib.h +++ b/src/blackcore/vatsim/voicevatlib.h @@ -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 m_audioService; - QScopedPointer m_udpPort; + QScopedPointer m_audioService; + QScopedPointer m_udpPort; }; } // namespace } // namespace