From 55b946d32f021c4b81976ab5de467a66c9184647 Mon Sep 17 00:00:00 2001 From: Roland Winklmeier Date: Mon, 10 Feb 2014 19:59:03 +0100 Subject: [PATCH 1/2] Add connection status enum to IVoice refs #105 --- src/blackcore/voice.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/blackcore/voice.h b/src/blackcore/voice.h index ebd0a5020..b262ec082 100644 --- a/src/blackcore/voice.h +++ b/src/blackcore/voice.h @@ -57,6 +57,17 @@ namespace BlackCore 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() {} From 372a66813485bf75dbe7eb6c483c6a4d75096627 Mon Sep 17 00:00:00 2001 From: Roland Winklmeier Date: Mon, 10 Feb 2014 20:00:29 +0100 Subject: [PATCH 2/2] Replaced set of voice connection signals with one general The different IVoice signals representing a single event from the voice connection have been replaced by a general signal emitted when something per com unit has changed. It passes old and new status. refs #105 --- samples/voiceclient/client.cpp | 35 ++++++++++++++++++++++++---------- samples/voiceclient/client.h | 5 +++-- src/blackcore/voice.h | 11 +++-------- src/blackcore/voice_vatlib.cpp | 22 ++++++++++++++++----- src/blackcore/voice_vatlib.h | 2 ++ 5 files changed, 50 insertions(+), 25 deletions(-) diff --git a/samples/voiceclient/client.cpp b/samples/voiceclient/client.cpp index 6ab7e629c..1bfdab9cc 100644 --- a/samples/voiceclient/client.cpp +++ b/samples/voiceclient/client.cpp @@ -21,8 +21,7 @@ Client::Client(QObject *parent) : using namespace BlackCore; connect(m_voiceClient, &IVoice::squelchTestFinished, this, &Client::onSquelchTestFinished); connect(m_voiceClient, &IVoice::micTestFinished, this, &Client::onMicTestFinished); - connect(m_voiceClient, &IVoice::connected, this, &Client::connectionStatusConnected); - connect(m_voiceClient, &IVoice::disconnected, this, &Client::connectionStatusDisconnected); + connect(m_voiceClient, &IVoice::connectionStatusChanged, this, &Client::connectionStatusChanged); connect(m_voiceClient, &IVoice::audioStarted, this, &Client::audioStartedStream); connect(m_voiceClient, &IVoice::audioStopped, this, &Client::audioStoppedStream); connect(m_voiceClient, &IVoice::userJoinedRoom, this, &Client::userJoinedRoom); @@ -179,15 +178,31 @@ void Client::onMicTestFinished() printLinePrefix(); } -void Client::connectionStatusConnected(const BlackCore::IVoice::ComUnit /** comUnit **/) +void Client::connectionStatusChanged(BlackCore::IVoice::ComUnit /** comUnit **/, + BlackCore::IVoice::ConnectionStatus /** oldStatus **/, + BlackCore::IVoice::ConnectionStatus newStatus) { - std::cout << "CONN_STATUS_CONNECTED" << std::endl; - printLinePrefix(); -} - -void Client::connectionStatusDisconnected() -{ - std::cout << "CONN_STATUS_DISCONNECTED" << std::endl; + switch (newStatus) + { + case BlackCore::IVoice::Disconnected: + std::cout << "CONN_STATUS_DISCONNECTED" << std::endl; + break; + case BlackCore::IVoice::Disconnecting: + std::cout << "CONN_STATUS_DISCONNECTING" << std::endl; + break; + case BlackCore::IVoice::DisconnectedError: + std::cout << "CONN_STATUS_DISCONNECTED_ERROR" << std::endl; + break; + case BlackCore::IVoice::Connecting: + std::cout << "CONN_STATUS_CONNECTING" << std::endl; + break; + case BlackCore::IVoice::Connected: + std::cout << "CONN_STATUS_CONNECTED" << std::endl; + break; + case BlackCore::IVoice::ConnectingFailed: + std::cout << "CONN_STATUS_CONNECTING_FAILED" << std::endl; + break; + } printLinePrefix(); } diff --git a/samples/voiceclient/client.h b/samples/voiceclient/client.h index a1e34dcdc..b43180ed0 100644 --- a/samples/voiceclient/client.h +++ b/samples/voiceclient/client.h @@ -45,8 +45,9 @@ public slots: void onMicTestFinished(); private slots: - void connectionStatusConnected(const BlackCore::IVoice::ComUnit comUnit); - void connectionStatusDisconnected(); + void connectionStatusChanged(BlackCore::IVoice::ComUnit comUnit, + BlackCore::IVoice::ConnectionStatus oldStatus, + BlackCore::IVoice::ConnectionStatus newStatus); void audioStartedStream(const BlackCore::IVoice::ComUnit comUnit); void audioStoppedStream(const BlackCore::IVoice::ComUnit comUnit); void userJoinedRoom(const BlackMisc::Aviation::CCallsign &callsign); diff --git a/src/blackcore/voice.h b/src/blackcore/voice.h index b262ec082..1828b24f2 100644 --- a/src/blackcore/voice.h +++ b/src/blackcore/voice.h @@ -212,14 +212,9 @@ namespace BlackCore virtual void switchAudioOutput(const ComUnit comUnit, bool enable) = 0; signals: - // Signals regarding the voice server connection - void notConnected(const ComUnit comUnit); - void connecting(const ComUnit comUnit); - void connected(const ComUnit comUnit); - void connectionFailed(const ComUnit comUnit); - void kicked(const ComUnit comUnit); - void disconnecting(const ComUnit comUnit); - void disconnected(const ComUnit comUnit); + + //! The status of a room has changed. + void connectionStatusChanged(ComUnit comUnit, ConnectionStatus oldStatus, ConnectionStatus newStatus); // Signals about users joining and leaving /*! diff --git a/src/blackcore/voice_vatlib.cpp b/src/blackcore/voice_vatlib.cpp index caed6edb4..ec0788875 100644 --- a/src/blackcore/voice_vatlib.cpp +++ b/src/blackcore/voice_vatlib.cpp @@ -38,7 +38,6 @@ namespace BlackCore // setOutputDevice(defaultAudioOutputDevice()); connect(this, &CVoiceVatlib::userJoinedLeft, this, &CVoiceVatlib::onUserJoinedLeft, Qt::QueuedConnection); - connect(this, &CVoiceVatlib::connected, this, &CVoiceVatlib::onUserJoinedLeft, Qt::QueuedConnection); this->m_voiceRooms.push_back(CVoiceRoom()); // COM1 this->m_voiceRooms.push_back(CVoiceRoom()); // COM2 @@ -336,6 +335,7 @@ namespace BlackCore vr = voiceRoom; vr.setConnected(true); this->setVoiceRoomForUnit(comUnit, vr); + changeConnectionStatus(comUnit, Connecting); QString serverSpec = voiceRoom.getVoiceRoomUrl(); m_voice->JoinRoom(static_cast(comUnit), m_aircraftCallsign.toQString().toLatin1().constData(), serverSpec.toLatin1().constData()); } @@ -361,6 +361,7 @@ namespace BlackCore m_voice->LeaveRoom(static_cast(comUnit)); vr.setConnected(false); this->setVoiceRoomForUnit(comUnit, vr); + changeConnectionStatus(comUnit, Disconnecting); } catch (...) { @@ -443,21 +444,21 @@ namespace BlackCore switchAudioOutput(comUnit, this->m_outputEnabled[comUnit]); vr.setConnected(true); this->setVoiceRoomForUnit(comUnit, vr); - emit connected(comUnit); + changeConnectionStatus(comUnit, Connected); + emit userJoinedLeft(comUnit); break; case Cvatlib_Voice_Simple::roomStatusUpdate_JoinFail: vr.setConnected(false); this->setVoiceRoomForUnit(comUnit, vr); - emit connectionFailed(comUnit); + changeConnectionStatus(comUnit, ConnectingFailed); break; case Cvatlib_Voice_Simple::roomStatusUpdate_UnexpectedDisconnectOrKicked: vr.setConnected(false); this->setVoiceRoomForUnit(comUnit, vr); - emit kicked(comUnit); + changeConnectionStatus(comUnit, DisconnectedError); break; case Cvatlib_Voice_Simple::roomStatusUpdate_LeaveComplete: m_voiceRoomCallsigns.clear(); - emit disconnected(comUnit); break; case Cvatlib_Voice_Simple::roomStatusUpdate_UserJoinsLeaves: // FIXME: We cannot call GetRoomUserList because vatlib is not reentrent safe. @@ -717,4 +718,15 @@ namespace BlackCore } } + // Change voice room status and emit signal + void CVoiceVatlib::changeConnectionStatus(ComUnit comUnit, ConnectionStatus newStatus) + { + ConnectionStatus currentStatus = m_connectionStatus.value(comUnit); + if (newStatus != currentStatus) + { + m_connectionStatus.insert(comUnit, newStatus); + emit connectionStatusChanged(comUnit, currentStatus, newStatus); + } + } + } // namespace diff --git a/src/blackcore/voice_vatlib.h b/src/blackcore/voice_vatlib.h index 4efd972f9..1383321a3 100644 --- a/src/blackcore/voice_vatlib.h +++ b/src/blackcore/voice_vatlib.h @@ -196,6 +196,7 @@ namespace BlackCore void exceptionDispatcher(const char *caller); void enableAudio(const ComUnit comUnit); void handlePushToTalk(); + void changeConnectionStatus(ComUnit comUnit, ConnectionStatus newStatus); /*! * \brief Deleter @@ -289,6 +290,7 @@ namespace BlackCore QMap m_voiceRoomCallsigns; /*!< voice room callsigns */ BlackMisc::Aviation::CCallsignList m_temporaryVoiceRoomCallsigns; /*!< temp. storage of voice rooms during update */ QMap m_outputEnabled; /*!< output enabled, basically a mute flag */ + QMap m_connectionStatus; /*!< holds connection status for each com unit */ // Need to keep the roomIndex? // KB: I would remove this approach, it is potentially unsafe