refs #242, some fixes in voice vatlib

* voiceroom connection status only changed when really connected, not when trying to
* exception method changed so it sends proper status messages
* empty member callsign list when voice room is left (also in the paranoia section)
This commit is contained in:
Klaus Basan
2014-05-28 13:47:29 +02:00
parent e2b0851e0a
commit a4e5e22adc
2 changed files with 42 additions and 26 deletions

View File

@@ -11,6 +11,8 @@
#include "../blackmisc/nwuserlist.h" #include "../blackmisc/nwuserlist.h"
#include "../blackmisc/voiceroomlist.h" #include "../blackmisc/voiceroomlist.h"
#include "../blackmisc/audiodevicelist.h" #include "../blackmisc/audiodevicelist.h"
#include "../blackmisc/statusmessage.h"
#include <vatlib/vatlib.h> #include <vatlib/vatlib.h>
#include <QObject> #include <QObject>
#include <QSet> #include <QSet>
@@ -267,10 +269,11 @@ namespace BlackCore
void micTestFinished(); void micTestFinished();
// non protocol related signals // non protocol related signals
/*! /*!
* \brief Exception * We sent a message about the status of the network connection, for the attention of the user.
*/ */
void exception(const QString &message, bool fatal = false); // let remote places know there was an exception void statusMessage(const BlackMisc::CStatusMessage &message);
}; };
} // namespace BlackCore } // namespace BlackCore

View File

@@ -7,6 +7,7 @@
#include <QDebug> #include <QDebug>
#include <QTimer> #include <QTimer>
using namespace BlackMisc;
using namespace BlackMisc::Audio; using namespace BlackMisc::Audio;
using namespace BlackMisc::Aviation; using namespace BlackMisc::Aviation;
@@ -369,7 +370,6 @@ namespace BlackCore
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!");
Q_ASSERT_X(m_voice->IsRoomValid(static_cast<qint32>(comUnit)), "CVoiceVatlib", "Room index out of bounds!"); Q_ASSERT_X(m_voice->IsRoomValid(static_cast<qint32>(comUnit)), "CVoiceVatlib", "Room index out of bounds!");
if (!voiceRoom.isValid()) if (!voiceRoom.isValid())
{ {
qDebug() << "Error: Cannot join invalid voice room."; qDebug() << "Error: Cannot join invalid voice room.";
@@ -381,7 +381,8 @@ namespace BlackCore
CVoiceRoom vr = this->voiceRoomForUnit(comUnit); CVoiceRoom vr = this->voiceRoomForUnit(comUnit);
if (vr.isConnected()) return; // already joined if (vr.isConnected()) return; // already joined
vr = voiceRoom; vr = voiceRoom;
vr.setConnected(true); // do not(!) set as connected right now, this will be done in status changed
// when room really is connected
this->setVoiceRoomForUnit(comUnit, vr); this->setVoiceRoomForUnit(comUnit, vr);
changeConnectionStatus(comUnit, Connecting); changeConnectionStatus(comUnit, Connecting);
QString serverSpec = voiceRoom.getVoiceRoomUrl(); QString serverSpec = voiceRoom.getVoiceRoomUrl();
@@ -401,16 +402,16 @@ namespace BlackCore
{ {
CVoiceRoom vr = this->voiceRoomForUnit(comUnit); CVoiceRoom vr = this->voiceRoomForUnit(comUnit);
if (!vr.isConnected()) return; 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!");
Q_ASSERT_X(m_voice->IsRoomValid(static_cast<qint32>(comUnit)), "CVoiceVatlib", "Room index out of bounds!"); Q_ASSERT_X(m_voice->IsRoomValid(static_cast<qint32>(comUnit)), "CVoiceVatlib", "Room index out of bounds!");
try try
{ {
this->setVoiceRoomForUnit(comUnit, CVoiceRoom()); // an empty voice room is easier to detect
m_voice->LeaveRoom(static_cast<qint32>(comUnit)); m_voice->LeaveRoom(static_cast<qint32>(comUnit));
vr.setConnected(false); this->m_voiceRoomCallsigns[comUnit] = CCallsignList(); // empty list for this room
this->setVoiceRoomForUnit(comUnit, vr);
changeConnectionStatus(comUnit, Disconnecting); changeConnectionStatus(comUnit, Disconnecting);
} }
catch (...) catch (...)
@@ -490,21 +491,20 @@ namespace BlackCore
void CVoiceVatlib::changeRoomStatus(ComUnit comUnit, Cvatlib_Voice_Simple::roomStatusUpdate roomStatus) void CVoiceVatlib::changeRoomStatus(ComUnit comUnit, Cvatlib_Voice_Simple::roomStatusUpdate roomStatus)
{ {
CVoiceRoom vr = this->voiceRoomForUnit(comUnit); CVoiceRoom vr = this->voiceRoomForUnit(comUnit);
switch (roomStatus) switch (roomStatus)
{ {
case Cvatlib_Voice_Simple::roomStatusUpdate_JoinSuccess: case Cvatlib_Voice_Simple::roomStatusUpdate_JoinSuccess:
{ {
m_lockOutputEnabled.lockForRead(); m_lockOutputEnabled.lockForRead();
bool isOutputEnabled = this->m_outputEnabled[comUnit]; bool isOutputEnabled = this->m_outputEnabled[comUnit];
m_lockOutputEnabled.unlock(); m_lockOutputEnabled.unlock();
switchAudioOutput(comUnit, isOutputEnabled); switchAudioOutput(comUnit, isOutputEnabled);
vr.setConnected(true); vr.setConnected(true);
this->setVoiceRoomForUnit(comUnit, vr); this->setVoiceRoomForUnit(comUnit, vr);
changeConnectionStatus(comUnit, Connected); changeConnectionStatus(comUnit, Connected);
emit userJoinedLeft(comUnit); emit userJoinedLeft(comUnit);
break; break;
} }
case Cvatlib_Voice_Simple::roomStatusUpdate_JoinFail: case Cvatlib_Voice_Simple::roomStatusUpdate_JoinFail:
vr.setConnected(false); vr.setConnected(false);
this->setVoiceRoomForUnit(comUnit, vr); this->setVoiceRoomForUnit(comUnit, vr);
@@ -607,8 +607,12 @@ namespace BlackCore
Q_ASSERT_X(m_temporaryUserRoomIndex == CVoiceVatlib::InvalidRoomIndex, "CVoiceClientVatlib::onUserJoinedLeft", "Cannot list users for two rooms in parallel!"); Q_ASSERT_X(m_temporaryUserRoomIndex == CVoiceVatlib::InvalidRoomIndex, "CVoiceClientVatlib::onUserJoinedLeft", "Cannot list users for two rooms in parallel!");
try try
{ {
// Paranoia... // Paranoia... clear list completely
if (!m_voice->IsRoomConnected(static_cast<qint32>(comUnit))) return; if (!m_voice->IsRoomConnected(static_cast<qint32>(comUnit))) {
this->m_voiceRoomCallsigns[comUnit] = CCallsignList();
this->m_temporaryVoiceRoomCallsigns.clear();
return;
}
// Store the room index for the slot (called in static callback) // Store the room index for the slot (called in static callback)
m_temporaryUserRoomIndex = static_cast<qint32>(comUnit); m_temporaryUserRoomIndex = static_cast<qint32>(comUnit);
@@ -641,7 +645,6 @@ namespace BlackCore
// Finally we update it with our new list // Finally we update it with our new list
this->m_voiceRoomCallsigns[comUnit] = this->m_temporaryVoiceRoomCallsigns; this->m_voiceRoomCallsigns[comUnit] = this->m_temporaryVoiceRoomCallsigns;
this->m_temporaryVoiceRoomCallsigns.clear(); this->m_temporaryVoiceRoomCallsigns.clear();
} }
catch (...) catch (...)
{ {
@@ -765,25 +768,25 @@ namespace BlackCore
{ {
// this could be caused by a race condition during normal operation, so not an error // this could be caused by a race condition during normal operation, so not an error
msg.append("NetworkNotConnectedException").append(" ").append(e.what()); msg.append("NetworkNotConnectedException").append(" ").append(e.what());
emit this->exception(msg); emit this->statusMessage(CStatusMessage::getErrorMessage(msg, CStatusMessage::TypeAudio));
qDebug() << "NetworkNotConnectedException caught in " << caller << "\n" << e.what(); qDebug() << "NetworkNotConnectedException caught in " << caller << "\n" << e.what();
} }
catch (const VatlibException &e) catch (const VatlibException &e)
{ {
msg.append("VatlibException").append(" ").append(e.what()); msg.append("VatlibException").append(" ").append(e.what());
emit this->exception(msg, true); emit this->statusMessage(CStatusMessage::getErrorMessage(msg, CStatusMessage::TypeAudio));
qFatal("VatlibException caught in %s\n%s", caller, e.what()); qFatal("VatlibException caught in %s\n%s", caller, e.what());
} }
catch (const std::exception &e) catch (const std::exception &e)
{ {
msg.append("std::exception").append(" ").append(e.what()); msg.append("std::exception").append(" ").append(e.what());
emit this->exception(msg, true); emit this->statusMessage(CStatusMessage::getErrorMessage(msg, CStatusMessage::TypeAudio));
qFatal("std::exception caught in %s\n%s", caller, e.what()); qFatal("std::exception caught in %s\n%s", caller, e.what());
} }
catch (...) catch (...)
{ {
msg.append("unknown exception"); msg.append("unknown exception");
emit this->exception(msg, true); emit this->statusMessage(CStatusMessage::getErrorMessage(msg, CStatusMessage::TypeAudio));
qFatal("Unknown exception caught in %s", caller); qFatal("Unknown exception caught in %s", caller);
} }
} }
@@ -795,6 +798,16 @@ namespace BlackCore
ConnectionStatus currentStatus = m_connectionStatus.value(comUnit); ConnectionStatus currentStatus = m_connectionStatus.value(comUnit);
if (newStatus != currentStatus) if (newStatus != currentStatus)
{ {
if (newStatus == Connected)
{
CVoiceRoom vr = this->voiceRoomForUnit(comUnit);
vr.setConnected(true);
this->setVoiceRoomForUnit(comUnit, vr);
}
// for disconnecting the voice room will already be
// set in leave voice room
m_connectionStatus.insert(comUnit, newStatus); m_connectionStatus.insert(comUnit, newStatus);
emit connectionStatusChanged(comUnit, currentStatus, newStatus); emit connectionStatusChanged(comUnit, currentStatus, newStatus);
} }