Ref T730, removed voice vatlib

This commit is contained in:
Klaus Basan
2019-09-29 02:57:24 +02:00
committed by Mat Sutcliffe
parent 5f6aebebe8
commit c1470f6069
9 changed files with 7 additions and 1020 deletions

View File

@@ -15,12 +15,10 @@
#include "blackcore/audiodevice.h"
#include "blackcore/corefacade.h"
#include "blackcore/voice.h"
#include "blackcore/vatsim/voicevatlib.h"
#include "blackmisc/simulation/simulatedaircraft.h"
#include "blackmisc/audio/audiodeviceinfo.h"
#include "blackmisc/audio/notificationsounds.h"
#include "blackmisc/audio/audiosettings.h"
#include "blackmisc/audio/voiceroomlist.h"
#include "blackmisc/aviation/callsign.h"
#include "blackmisc/compare.h"
#include "blackmisc/dbusserver.h"
@@ -61,13 +59,6 @@ namespace BlackCore
m_voiceClient(("https://voice1.vatsim.uk"))
{
/**
initVoiceChannels();
initInputDevice();
initOutputDevice();
initAudioMixer();
**/
this->setVoiceOutputVolume(m_audioSettings.getThreadLocal().getOutVolume());
m_selcalPlayer = new CSelcalPlayer(QAudioDeviceInfo::defaultOutputDevice(), this);
@@ -251,8 +242,9 @@ namespace BlackCore
void CContextAudio::setVoiceSetup(const CVoiceSetup &setup)
{
// could be recycled for some AFV setup
if (m_debugEnabled) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; }
// if (m_voice) { m_voice->setVoiceSetup(setup); }
Q_UNUSED(setup)
}
CVoiceSetup CContextAudio::getVoiceSetup() const
@@ -450,23 +442,19 @@ namespace BlackCore
void CContextAudio::xCtxChangedAircraftCockpit(const CSimulatedAircraft &aircraft, const CIdentifier &originator)
{
Q_UNUSED(aircraft)
Q_UNUSED(originator)
/**
if (CIdentifiable::isMyIdentifier(originator)) { return; }
const bool integrated = this->isComIntegratedWithSimulator();
if (integrated)
{
// set as in cockpit
const bool com1Rec = aircraft.getCom1System().isReceiveEnabled();
const bool com2Rec = aircraft.getCom2System().isReceiveEnabled();
// m_audioMixer->makeOrRemoveConnection(IAudioMixer::InputVoiceChannel1, IAudioMixer::OutputDevice1, com1Rec);
// m_audioMixer->makeOrRemoveConnection(IAudioMixer::InputVoiceChannel2, IAudioMixer::OutputDevice1, com2Rec);
}
else
{
// reset
// m_audioMixer->makeMixerConnectionIfNotExisting(IAudioMixer::InputVoiceChannel1, IAudioMixer::OutputDevice1);
// m_audioMixer->makeMixerConnectionIfNotExisting(IAudioMixer::InputVoiceChannel2, IAudioMixer::OutputDevice1);
}
**/
}
void CContextAudio::xCtxNetworkConnectionStatusChanged(const CConnectionStatus &from, const CConnectionStatus &to)

View File

@@ -1,129 +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. 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_inputCodec.reset(Vat_CreateLocalInputCodec(audioService, vatCodecLegacy));
int currentDeviceIndex;
Vat_GetInputDeviceInfo(m_inputCodec.data(), onInputHardwareDeviceReceived, this, &currentDeviceIndex);
m_currentDevice = m_devices.findByDeviceIndex(currentDeviceIndex);
}
const CAudioDeviceInfoList &CAudioInputDeviceVatlib::getInputDevices() const
{
return m_devices;
}
const CAudioDeviceInfo &CAudioInputDeviceVatlib::getCurrentInputDevice() const
{
return m_currentDevice;
}
void CAudioInputDeviceVatlib::setInputDevice(const CAudioDeviceInfo &device)
{
Q_ASSERT_X(m_inputCodec, "CAudioInputDeviceVatlib", "VatLocalCodec is invalid!");
if (!device.isValid())
{
CLogMessage(this).warning(u"Cannot set invalid input device!");
return;
}
if (!Vat_SetAudioInputDevice(m_inputCodec.data(), device.getIndex()))
{
CLogMessage(this).warning(u"Setting input device failed");
}
m_currentDevice = device;
}
void CAudioInputDeviceVatlib::onInputHardwareDeviceReceived(int deviceIndex, const char *hardwareName, void *cbVar)
{
CAudioDeviceInfo inputDevice(CAudioDeviceInfo::InputDevice, deviceIndex, QString(hardwareName));
cbvar_cast_inputDevice(cbVar)->m_devices.push_back(inputDevice);
}
CAudioOutputDeviceVatlib::CAudioOutputDeviceVatlib(VatAudioService *audioService, QObject *parent)
: IAudioOutputDevice(parent)
{
m_outputCodec.reset(Vat_CreateLocalOutputCodec(audioService, vatCodecLegacy));
int currentDeviceIndex;
Vat_GetOutputDeviceInfo(m_outputCodec.data(), onOutputHardwareDeviceReceived, this, &currentDeviceIndex);
m_currentDevice = m_devices.findByDeviceIndex(currentDeviceIndex);
}
const CAudioDeviceInfoList &CAudioOutputDeviceVatlib::getOutputDevices() const
{
return m_devices;
}
const CAudioDeviceInfo &CAudioOutputDeviceVatlib::getCurrentOutputDevice() const
{
return m_currentDevice;
}
void CAudioOutputDeviceVatlib::setOutputDevice(const CAudioDeviceInfo &device)
{
Q_ASSERT_X(m_outputCodec, "CAudioOutputDeviceVatlib", "VatLocalCodec is invalid!");
if (!device.isValid())
{
CLogMessage(this).warning(u"Cannot set invalid output device!");
return;
}
Vat_SetAudioOutputDevice(m_outputCodec.data(), device.getIndex());
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)
{
CAudioDeviceInfo outputDevice(CAudioDeviceInfo::OutputDevice, deviceIndex, QString(hardwareName));
cbvar_cast_outputDevice(cbVar)->m_devices.push_back(outputDevice);
}
} // ns
} // ns
//! \endcond

View File

@@ -1,125 +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. 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>
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::getCurrentInputDevice
virtual const BlackMisc::Audio::CAudioDeviceInfo &getCurrentInputDevice() const override;
//! \copydoc IAudioInputDevice::setInputDevice
virtual void setInputDevice(const BlackMisc::Audio::CAudioDeviceInfo &device) override;
//! \copydoc IAudioInputDevice::isDummyDevice
virtual bool isDummyDevice() const override { return false; }
//! Get vatlib input device pointer
VatLocalInputCodec *getVatLocalInputCodec() { return m_inputCodec.data(); }
private:
struct VatLocalInputCodecDeleter
{
static inline void cleanup(VatLocalInputCodec *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;
QScopedPointer<VatLocalInputCodec, 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::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(VatLocalOutputCodec *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;
QScopedPointer<VatLocalOutputCodec, VatLocalOutputCodecDeleter> m_outputCodec;
};
} // ns
} // ns
#endif // guard

View File

@@ -1,36 +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. 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

View File

@@ -1,69 +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. 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>
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(VatAudioMixer *obj)
{
if (obj) Vat_DestroyAudioMixer(obj);
}
};
QScopedPointer<VatAudioMixer, VatAudioMixerDeleter> m_audioMixer;
};
} // ns
} // ns
#endif // guard

View File

@@ -1,232 +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. 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/application.h"
#include "blackcore/context/contextnetwork.h"
#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;
using namespace BlackMisc::Network;
namespace BlackCore
{
namespace Vatsim
{
CVoiceChannelVatlib::CVoiceChannelVatlib(VatAudioService *audioService, VatUDPAudioPort *udpPort, QObject *parent)
: IVoiceChannel(parent)
{
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_SetVoiceReceptionHandler(m_voiceChannel.data(), processVoiceReceptionChanged, 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;
// 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(u"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;
QString callsign = QStringLiteral("%1 (%2)").arg(m_callsign.toQString(), m_userId);
Vat_SetRoomInfo(m_voiceChannel.data(), qPrintable(voiceRoom.getHostname()), 3782,
qPrintable(voiceRoom.getChannel()),
qPrintable(callsign));
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;
}
void CVoiceChannelVatlib::setUserId(const QString &id)
{
m_userId = id;
}
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::voiceReceptionChanged(VatVoiceChannel *, bool isVoiceReceiving)
{
if (isVoiceReceiving) 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::processVoiceReceptionChanged(VatVoiceChannel *channel, bool isVoiceReceiving, void *cbVar)
{
auto obj = cbvar_cast_voiceChannel(cbVar);
obj->voiceReceptionChanged(channel, isVoiceReceiving);
}
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

View File

@@ -1,109 +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. 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>
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::setUserId
virtual void setUserId(const QString &id) 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(VatVoiceChannel *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 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 processVoiceReceptionChanged(VatVoiceChannel *channel, bool isVoiceReceiving, void *cbVar);
static void roomStatusUpdate(VatVoiceChannel *channel, VatConnectionStatus oldStatus, VatConnectionStatus newStatus, void *cbVar);
BlackMisc::Aviation::CCallsign m_callsign; // Own callsign
QString m_userId; // Pilot user id
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
QScopedPointer<VatVoiceChannel, VatVoiceChannelDeleter> m_voiceChannel;
};
} // ns
} // ns
#endif // guard

View File

@@ -1,168 +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. 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
{
const CLogCategoryList &CVoiceVatlib::getLogCategories()
{
static const CLogCategoryList cats({ CLogCategory::vatsimSpecific(), CLogCategory::network() });
return cats;
}
CVoiceVatlib::CVoiceVatlib(QObject *parent) :
IVoice(parent),
m_audioService(Vat_CreateAudioService())
{
const int udpPort = m_vatsimVoiceSettings.get().getVatsimUdpVoicePort();
Vat_SetVoiceLogHandler(vatSeverityDebug, CVoiceVatlib::voiceLogHandler);
m_udpPort.reset(Vat_CreateUDPAudioPort(m_audioService.data(), udpPort));
// do processing
this->startTimer(10);
}
CVoiceVatlib::~CVoiceVatlib() {}
void CVoiceVatlib::setVoiceSetup(const CVoiceSetup &setup)
{
if (m_vatsimVoiceSettings.get() == setup) { return; }
m_vatsimVoiceSettings.setAndSave(setup);
// CHANGE VOICE PORT WOULD NEED TO GO HERE
}
CVoiceSetup CVoiceVatlib::getVoiceSetup() const
{
return m_vatsimVoiceSettings.get();
}
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_VoiceConnect(VatProducerLocalInput, audioInputVatlib->getVatLocalInputCodec(), 0,
VatConsumerAudioMixer, 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_VoiceConnect(VatProducerVoiceChannel, voiceChannelVatlib->getVoiceChannel(), 0,
VatConsumerAudioMixer, 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_VoiceConnect(VatProducerAudioMixer, audioMixerVatlib->getVatAudioMixer(), outputPort,
VatConsumerLocalOutput, 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_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_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_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_VoiceConnect(VatProducerAudioMixer, audioMixerVatlib->getVatAudioMixer(), outputPort, VatConsumerNone, nullptr, 0);
}
void CVoiceVatlib::timerEvent(QTimerEvent *)
{
Q_ASSERT_X(m_audioService, "CVoiceVatlib", "VatAudioService invalid!");
Vat_ExecuteVoiceTasks(m_audioService.data());
}
void CVoiceVatlib::voiceLogHandler(VatSeverityLevel severity, const char *context, const char *message)
{
QString logMessage(context);
logMessage += ": ";
logMessage += message;
if (severity == vatSeverityDebug) { CLogMessage(static_cast<CVoiceVatlib *>(nullptr)).debug(logMessage); }
else if (severity == vatSeverityInfo) { CLogMessage(static_cast<CVoiceVatlib *>(nullptr)).info(logMessage); }
else if (severity == vatSeverityWarning) { CLogMessage(static_cast<CVoiceVatlib *>(nullptr)).warning(logMessage); }
else if (severity == vatSeverityError) { CLogMessage(static_cast<CVoiceVatlib *>(nullptr)).error(logMessage); }
}
} // namespace
} // namespace

View File

@@ -1,133 +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. 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 "blackmisc/audio/settings/voicesettings.h"
#include "blackmisc/logcategorylist.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:
//! Log. categories
static const BlackMisc::CLogCategoryList &getLogCategories();
//! Default constructor
CVoiceVatlib(QObject *parent = nullptr);
//! Destructor
virtual ~CVoiceVatlib() override;
//! \copydoc IVoice::setVoiceSetup()
virtual void setVoiceSetup(const BlackMisc::Audio::CVoiceSetup &setup) override;
//! \copydoc IVoice::getVoiceSetup()
virtual BlackMisc::Audio::CVoiceSetup getVoiceSetup() const override;
//! \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:
//! Process voice lib
virtual void timerEvent(QTimerEvent *) override;
private:
//! this struct calls Vat_DestroyAudioService to delete the pointer
struct VatAudioServiceDeleter
{
static inline void cleanup(VatAudioService *obj)
{
Vat_DestroyAudioService(obj);
}
};
//! this struct calls Vat_DestroyUDPAudioPort to delete the pointer
struct VatUDPAudioPortDeleter
{
static inline void cleanup(VatUDPAudioPort *obj)
{
Vat_DestroyUDPAudioPort(obj);
}
};
static void voiceLogHandler(VatSeverityLevel severity, const char *context, const char *message);
BlackMisc::CSetting<BlackMisc::Audio::Settings::TVoiceSetup> m_vatsimVoiceSettings { this };
QScopedPointer<VatAudioService, VatAudioServiceDeleter> m_audioService;
QScopedPointer<VatUDPAudioPort, VatUDPAudioPortDeleter> m_udpPort;
};
} // namespace
} // namespace
#endif // guard