From 2b2f1af4e6aedae95180db6989ad2a72bd1a6d7d Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Thu, 5 Jun 2014 13:24:13 +0200 Subject: [PATCH] refs #220, refs #251 fixes in voice vatlib * fixed Disconnected status * room connected checking low-level, not on objects (fail safe) * Remark: Still containing debug information for refs #255 , will be removed --- src/blackcore/voice_vatlib.cpp | 70 ++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 32 deletions(-) diff --git a/src/blackcore/voice_vatlib.cpp b/src/blackcore/voice_vatlib.cpp index e9cf9123c..4609724f6 100644 --- a/src/blackcore/voice_vatlib.cpp +++ b/src/blackcore/voice_vatlib.cpp @@ -186,27 +186,20 @@ namespace BlackCore { QReadLocker lockForReading(&m_lockVoiceRooms); Q_ASSERT_X(m_voiceRooms.size() == 2, "CVoiceVatlib", "Wrong numer of COM voice rooms"); - CVoiceRoomList voiceRooms; + + if (!m_voice->IsValid() || !m_voice->IsSetup()) return CVoiceRoomList::twoEmptyRooms(); QMutexLocker lockerVatlib(&m_mutexVatlib); - if (m_voice->IsValid() && m_voice->IsSetup()) - { - // valid state, update - CVoiceRoom com1 = this->m_voiceRooms[0]; - CVoiceRoom com2 = this->m_voiceRooms[1]; - com1.setConnected(m_voice->IsRoomConnected(static_cast(COM1))); - com2.setConnected(m_voice->IsRoomConnected(static_cast(COM2))); - com1.setAudioPlaying(com1.isConnected() ? m_voice->IsAudioPlaying(static_cast(COM1)) : false); - com2.setAudioPlaying(com2.isConnected() ? m_voice->IsAudioPlaying(static_cast(COM2)) : false); - voiceRooms.push_back(com1); - voiceRooms.push_back(com2); - } - else - { - CVoiceRoom def; - voiceRooms.push_back(def); - voiceRooms.push_back(def); - } + // valid state, update + CVoiceRoom com1 = this->m_voiceRooms[0]; + CVoiceRoom com2 = this->m_voiceRooms[1]; + com1.setConnected(m_voice->IsRoomConnected(static_cast(COM1))); + com2.setConnected(m_voice->IsRoomConnected(static_cast(COM2))); + com1.setAudioPlaying(com1.isConnected() ? m_voice->IsAudioPlaying(static_cast(COM1)) : false); + com2.setAudioPlaying(com2.isConnected() ? m_voice->IsAudioPlaying(static_cast(COM2)) : false); + CVoiceRoomList voiceRooms; + voiceRooms.push_back(com1); + voiceRooms.push_back(com2); return voiceRooms; } @@ -378,16 +371,22 @@ namespace BlackCore try { - CVoiceRoom vr = this->voiceRoomForUnit(comUnit); - if (vr.isConnected()) return; // already joined - vr = voiceRoom; - // do not(!) set as connected right now, this will be done in status changed - // when room really is connected - this->setVoiceRoomForUnit(comUnit, vr); + // only connect, if not yet connected + if (this->m_voice->IsRoomConnected(static_cast(comUnit))) return; changeConnectionStatus(comUnit, Connecting); QString serverSpec = voiceRoom.getVoiceRoomUrl(); QReadLocker lockForReading(&m_lockMyCallsign); - m_voice->JoinRoom(static_cast(comUnit), m_aircraftCallsign.toQString().toLatin1().constData(), serverSpec.toLatin1().constData()); + bool jr = m_voice->JoinRoom(static_cast(comUnit), m_aircraftCallsign.toQString().toLatin1().constData(), serverSpec.toLatin1().constData()); + if (jr) + { + // do not(!) set as connected right now, this will be done in "status changed" + // when room really is connected + this->setVoiceRoomForUnit(comUnit, voiceRoom); + } + else + { + qWarning("Could not join voice room"); + } } catch (...) { @@ -400,8 +399,6 @@ namespace BlackCore */ void CVoiceVatlib::leaveVoiceRoom(const ComUnit comUnit) { - CVoiceRoom vr = this->voiceRoomForUnit(comUnit); - if (!vr.isConnected()) return; QMutexLocker lockerVatlib(&m_mutexVatlib); Q_ASSERT_X(m_voice->IsValid() && m_voice->IsSetup(), "CVoiceVatlib", "Cvatlib_Voice_Simple invalid or not setup!"); @@ -409,10 +406,16 @@ namespace BlackCore try { + // update "meta" object for room this->setVoiceRoomForUnit(comUnit, CVoiceRoom()); // an empty voice room is easier to detect - m_voice->LeaveRoom(static_cast(comUnit)); - this->m_voiceRoomCallsigns[comUnit] = CCallsignList(); // empty list for this room - changeConnectionStatus(comUnit, Disconnecting); + + // only leave is room is physically connected + if (this->m_voice->IsRoomConnected(static_cast(comUnit))) + { + m_voice->LeaveRoom(static_cast(comUnit)); + this->m_voiceRoomCallsigns[comUnit] = CCallsignList(); // empty list for this room + changeConnectionStatus(comUnit, Disconnecting); + } } catch (...) { @@ -490,6 +493,7 @@ namespace BlackCore */ void CVoiceVatlib::changeRoomStatus(ComUnit comUnit, Cvatlib_Voice_Simple::roomStatusUpdate roomStatus) { + qDebug() << comUnit << roomStatus; // KB_REMOVE CVoiceRoom vr = this->voiceRoomForUnit(comUnit); switch (roomStatus) { @@ -519,6 +523,7 @@ namespace BlackCore m_lockCallsigns.lockForWrite(); m_voiceRoomCallsigns.clear(); m_lockCallsigns.unlock(); + changeConnectionStatus(comUnit, Disconnected); break; case Cvatlib_Voice_Simple::roomStatusUpdate_UserJoinsLeaves: // FIXME: We cannot call GetRoomUserList because vatlib is not reentrent safe. @@ -608,7 +613,8 @@ namespace BlackCore try { // Paranoia... clear list completely - if (!m_voice->IsRoomConnected(static_cast(comUnit))) { + if (!m_voice->IsRoomConnected(static_cast(comUnit))) + { this->m_voiceRoomCallsigns[comUnit] = CCallsignList(); this->m_temporaryVoiceRoomCallsigns.clear(); return;