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