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
This commit is contained in:
Klaus Basan
2014-06-05 13:24:13 +02:00
parent 6344923725
commit 2b2f1af4e6

View File

@@ -186,11 +186,10 @@ namespace BlackCore
{ {
QReadLocker lockForReading(&m_lockVoiceRooms); QReadLocker lockForReading(&m_lockVoiceRooms);
Q_ASSERT_X(m_voiceRooms.size() == 2, "CVoiceVatlib", "Wrong numer of COM voice rooms"); 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); QMutexLocker lockerVatlib(&m_mutexVatlib);
if (m_voice->IsValid() && m_voice->IsSetup())
{
// valid state, update // valid state, update
CVoiceRoom com1 = this->m_voiceRooms[0]; CVoiceRoom com1 = this->m_voiceRooms[0];
CVoiceRoom com2 = this->m_voiceRooms[1]; CVoiceRoom com2 = this->m_voiceRooms[1];
@@ -198,15 +197,9 @@ namespace BlackCore
com2.setConnected(m_voice->IsRoomConnected(static_cast<qint32>(COM2))); com2.setConnected(m_voice->IsRoomConnected(static_cast<qint32>(COM2)));
com1.setAudioPlaying(com1.isConnected() ? m_voice->IsAudioPlaying(static_cast<qint32>(COM1)) : false); com1.setAudioPlaying(com1.isConnected() ? m_voice->IsAudioPlaying(static_cast<qint32>(COM1)) : false);
com2.setAudioPlaying(com2.isConnected() ? m_voice->IsAudioPlaying(static_cast<qint32>(COM2)) : false); com2.setAudioPlaying(com2.isConnected() ? m_voice->IsAudioPlaying(static_cast<qint32>(COM2)) : false);
CVoiceRoomList voiceRooms;
voiceRooms.push_back(com1); voiceRooms.push_back(com1);
voiceRooms.push_back(com2); voiceRooms.push_back(com2);
}
else
{
CVoiceRoom def;
voiceRooms.push_back(def);
voiceRooms.push_back(def);
}
return voiceRooms; return voiceRooms;
} }
@@ -378,16 +371,22 @@ namespace BlackCore
try try
{ {
CVoiceRoom vr = this->voiceRoomForUnit(comUnit); // only connect, if not yet connected
if (vr.isConnected()) return; // already joined if (this->m_voice->IsRoomConnected(static_cast<qint32>(comUnit))) return;
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);
changeConnectionStatus(comUnit, Connecting); changeConnectionStatus(comUnit, Connecting);
QString serverSpec = voiceRoom.getVoiceRoomUrl(); QString serverSpec = voiceRoom.getVoiceRoomUrl();
QReadLocker lockForReading(&m_lockMyCallsign); QReadLocker lockForReading(&m_lockMyCallsign);
m_voice->JoinRoom(static_cast<qint32>(comUnit), m_aircraftCallsign.toQString().toLatin1().constData(), serverSpec.toLatin1().constData()); bool jr = m_voice->JoinRoom(static_cast<qint32>(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 (...) catch (...)
{ {
@@ -400,8 +399,6 @@ namespace BlackCore
*/ */
void CVoiceVatlib::leaveVoiceRoom(const ComUnit comUnit) void CVoiceVatlib::leaveVoiceRoom(const ComUnit comUnit)
{ {
CVoiceRoom vr = this->voiceRoomForUnit(comUnit);
if (!vr.isConnected()) return;
QMutexLocker lockerVatlib(&m_mutexVatlib); QMutexLocker lockerVatlib(&m_mutexVatlib);
Q_ASSERT_X(m_voice->IsValid() && m_voice->IsSetup(), "CVoiceVatlib", "Cvatlib_Voice_Simple invalid or not setup!"); Q_ASSERT_X(m_voice->IsValid() && m_voice->IsSetup(), "CVoiceVatlib", "Cvatlib_Voice_Simple invalid or not setup!");
@@ -409,11 +406,17 @@ namespace BlackCore
try try
{ {
// update "meta" object for room
this->setVoiceRoomForUnit(comUnit, CVoiceRoom()); // an empty voice room is easier to detect this->setVoiceRoomForUnit(comUnit, CVoiceRoom()); // an empty voice room is easier to detect
// only leave is room is physically connected
if (this->m_voice->IsRoomConnected(static_cast<qint32>(comUnit)))
{
m_voice->LeaveRoom(static_cast<qint32>(comUnit)); m_voice->LeaveRoom(static_cast<qint32>(comUnit));
this->m_voiceRoomCallsigns[comUnit] = CCallsignList(); // empty list for this room this->m_voiceRoomCallsigns[comUnit] = CCallsignList(); // empty list for this room
changeConnectionStatus(comUnit, Disconnecting); changeConnectionStatus(comUnit, Disconnecting);
} }
}
catch (...) catch (...)
{ {
this->exceptionDispatcher(Q_FUNC_INFO); this->exceptionDispatcher(Q_FUNC_INFO);
@@ -490,6 +493,7 @@ namespace BlackCore
*/ */
void CVoiceVatlib::changeRoomStatus(ComUnit comUnit, Cvatlib_Voice_Simple::roomStatusUpdate roomStatus) void CVoiceVatlib::changeRoomStatus(ComUnit comUnit, Cvatlib_Voice_Simple::roomStatusUpdate roomStatus)
{ {
qDebug() << comUnit << roomStatus; // KB_REMOVE
CVoiceRoom vr = this->voiceRoomForUnit(comUnit); CVoiceRoom vr = this->voiceRoomForUnit(comUnit);
switch (roomStatus) switch (roomStatus)
{ {
@@ -519,6 +523,7 @@ namespace BlackCore
m_lockCallsigns.lockForWrite(); m_lockCallsigns.lockForWrite();
m_voiceRoomCallsigns.clear(); m_voiceRoomCallsigns.clear();
m_lockCallsigns.unlock(); m_lockCallsigns.unlock();
changeConnectionStatus(comUnit, Disconnected);
break; break;
case Cvatlib_Voice_Simple::roomStatusUpdate_UserJoinsLeaves: case Cvatlib_Voice_Simple::roomStatusUpdate_UserJoinsLeaves:
// FIXME: We cannot call GetRoomUserList because vatlib is not reentrent safe. // FIXME: We cannot call GetRoomUserList because vatlib is not reentrent safe.
@@ -608,7 +613,8 @@ namespace BlackCore
try try
{ {
// Paranoia... clear list completely // Paranoia... clear list completely
if (!m_voice->IsRoomConnected(static_cast<qint32>(comUnit))) { if (!m_voice->IsRoomConnected(static_cast<qint32>(comUnit)))
{
this->m_voiceRoomCallsigns[comUnit] = CCallsignList(); this->m_voiceRoomCallsigns[comUnit] = CCallsignList();
this->m_temporaryVoiceRoomCallsigns.clear(); this->m_temporaryVoiceRoomCallsigns.clear();
return; return;