Files
pilotclient/src/blackcore/voice.h
Roland Winklmeier 95fa5e84df Removed IContext
Network and voice samples work using them and have to allocate
their own vatlib objects now.

refs #221
2014-04-26 20:46:56 +02:00

272 lines
7.7 KiB
C++

/* Copyright (C) 2013 VATSIM Community / authors
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef BLACKCORE_VOICE_H
#define BLACKCORE_VOICE_H
#include "../blackmisc/avcallsignlist.h"
#include "../blackmisc/avselcal.h"
#include "../blackmisc/nwuserlist.h"
#include "../blackmisc/voiceroomlist.h"
#include "../blackmisc/audiodevicelist.h"
#include <vatlib/vatlib.h>
#include <QObject>
#include <QSet>
#include <QStringList>
#include <QMetaType>
namespace BlackCore
{
/*!
* Interface to a connection to a ATC voice server for use in flight simulation.
*
* \warning If an INetwork signal is connected to a slot, and that slot emits a signal
* which is connected to an INetwork slot, then at least one of those connections
* must be a Qt::QueuedConnection.
* Reason: IVoiceClient implementations are not re-entrant.
*/
class IVoice : public QObject
{
/* TODOS:
* - Find a replacement for comUnit. Maybe map it to the ComUnit in the aircraft as a class
* - Settings: Settings classes to store hardware settings (squelch, background noise, hardware device)
*/
Q_OBJECT
protected:
/*!
* \brief Default constructor with parent
* \param parent
*/
IVoice(QObject *parent = nullptr);
public:
/*!
* \brief IVoice currently supports two different com units
*/
enum ComUnit
{
COM1 = 0, /*!< ComUnit 1 */
COM2 /*!< ComUnit 2 */
};
//! Com status
enum ConnectionStatus
{
Disconnected = 0, //!< Not connected
Disconnecting, //!< In transition to disconnected
DisconnectedError, //!< Disconnected due to socket error
Connecting, //!< Connection initiated but not established
Connected, //!< Connection established
ConnectingFailed, //!< Failed to connect
};
//! Virtual destructor.
virtual ~IVoice() {}
/*!
* \brief Own aircraft's callsign
* \param callsign
*/
virtual void setMyAircraftCallsign(const BlackMisc::Aviation::CCallsign &callsign) = 0;
/*!
* \brief Audio devices
* \return
*/
virtual const BlackMisc::Audio::CAudioDeviceList &audioDevices() const = 0;
/*!
* \brief Default input device
* \return
*/
virtual const BlackMisc::Audio::CAudioDevice defaultAudioInputDevice() const = 0;
/*!
* \brief Default output device
* \return
*/
virtual const BlackMisc::Audio::CAudioDevice defaultAudioOutputDevice() const = 0;
/************************************************
* SETUP TESTS
***********************************************/
/*!
* \brief Runs a 5 seconds test, measuring your background noise.
*/
virtual void runSquelchTest() = 0;
/*!
* \brief Runs a 5 seconds test, measuring the qualitiy of your mic input
*/
virtual void runMicrophoneTest() = 0;
/*!
* \brief Value of the measured squelch
* \return
*/
virtual float inputSquelch() const = 0;
/*!
* \brief Result of the mic test.
* \return
*/
virtual qint32 micTestResult() const = 0;
/*!
* \brief Result of the mic test as human readable string
* \return
*/
virtual QString micTestResultAsString() const = 0;
public slots:
/*!
* \brief Current input device
*/
virtual BlackMisc::Audio::CAudioDevice getCurrentInputDevice() const = 0;
/*!
* \brief Current output device
*/
virtual BlackMisc::Audio::CAudioDevice getCurrentOutputDevice() const = 0;
/*!
* \brief Output device to be used
*/
virtual void setOutputDevice(const BlackMisc::Audio::CAudioDevice &device) = 0;
/*!
* \brief Input device to be used
*/
virtual void setInputDevice(const BlackMisc::Audio::CAudioDevice &device) = 0;
/*!
* Get COM1/2 voice rooms, which then allows to retrieve information
* such as audio status etc.
*/
virtual BlackMisc::Audio::CVoiceRoomList getComVoiceRoomsWithAudioStatus() const = 0;
/*!
* Get COM1/2 voice rooms, const and with no status update
*/
virtual BlackMisc::Audio::CVoiceRoomList getComVoiceRooms() const = 0;
/*!
* \brief Join voice room
* \param comUnit COM1/2
* \param voiceRoom
*/
virtual void joinVoiceRoom(const ComUnit comUnit, const BlackMisc::Audio::CVoiceRoom &voiceRoom) = 0;
/*!
* \brief Leave voice room
* \param comUnit COM1/2
*/
virtual void leaveVoiceRoom(const ComUnit comUnit) = 0;
/*!
* \brief Leave all voice rooms
*/
virtual void leaveAllVoiceRooms() = 0;
/*!
* \brief Set room output volume for COM unit
*/
virtual void setRoomOutputVolume(const ComUnit comUnit, const qint32 volumne) = 0;
/*!
* \brief Start transmitting
*/
virtual void startTransmitting(const ComUnit comUnit) = 0;
/*!
* \brief Stop transmitting
*/
virtual void stopTransmitting(const ComUnit comUnit) = 0;
/*!
* \brief Get voice room callsings
* \return
*/
virtual BlackMisc::Aviation::CCallsignList getVoiceRoomCallsigns(const ComUnit comUnit) const = 0;
/*!
* \brief Is muted?
*/
virtual bool isMuted() const = 0;
/*!
* \brief Switch audio output, enable or disable given COM unit.
* \param comUnit
* \param enable enable or disable output
*/
virtual void switchAudioOutput(const ComUnit comUnit, bool enable) = 0;
signals:
//! The status of a room has changed.
void connectionStatusChanged(ComUnit comUnit, ConnectionStatus oldStatus, ConnectionStatus newStatus);
// Signals about users joining and leaving
/*!
* \brief User with callsign joined room
*/
void userJoinedRoom(const BlackMisc::Aviation::CCallsign &callsign);
/*!
* \brief User with callsign left room
*/
void userLeftRoom(const BlackMisc::Aviation::CCallsign &callsign);
// Audio signals
/*!
* \brief Audio for given unit started
*/
void audioStarted(const ComUnit comUnit);
/*!
* \brief Audio for given unit stopped
*/
void audioStopped(const ComUnit comUnit);
/*!
* \brief Audio started
*/
void globalAudioStarted();
/*!
* \brief Audio stopped
*/
void globalAudioStopped();
// Test signals
/*!
* \brief Squelch test completed
*/
void squelchTestFinished();
/*!
* \brief Microphone test completed
*/
void micTestFinished();
// non protocol related signals
/*!
* \brief Exception
*/
void exception(const QString &message, bool fatal = false); // let remote places know there was an exception
};
} // namespace BlackCore
Q_DECLARE_METATYPE(BlackCore::IVoice::ComUnit)
#endif // guard