Ref T558, play notification sound after SELCAL tone

* return SELCAL tone duration
* play follow up tone
This commit is contained in:
Klaus Basan
2019-03-05 23:34:39 +01:00
committed by Mat Sutcliffe
parent 94513951e1
commit 0e03e7baf0
3 changed files with 33 additions and 31 deletions

View File

@@ -29,16 +29,19 @@
#include "blackmisc/statusmessage.h" #include "blackmisc/statusmessage.h"
#include "blacksound/soundgenerator.h" #include "blacksound/soundgenerator.h"
#include <stdbool.h>
#include <QTimer> #include <QTimer>
#include <QtGlobal> #include <QtGlobal>
#include <QPointer>
#include <algorithm> #include <algorithm>
#include <stdbool.h>
using namespace BlackMisc; using namespace BlackMisc;
using namespace BlackMisc::Aviation; using namespace BlackMisc::Aviation;
using namespace BlackMisc::Audio; using namespace BlackMisc::Audio;
using namespace BlackMisc::Input; using namespace BlackMisc::Input;
using namespace BlackMisc::Audio; using namespace BlackMisc::Audio;
using namespace BlackMisc::PhysicalQuantities;
using namespace BlackSound; using namespace BlackSound;
using namespace BlackCore::Vatsim; using namespace BlackCore::Vatsim;
@@ -114,15 +117,8 @@ namespace BlackCore
Q_ASSERT(m_voice); Q_ASSERT(m_voice);
if (m_debugEnabled) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << withAudioStatus; } if (m_debugEnabled) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << withAudioStatus; }
auto voiceChannel = m_voiceChannelMapping.value(comUnitValue); const auto voiceChannel = m_voiceChannelMapping.value(comUnitValue);
if (voiceChannel) return voiceChannel ? voiceChannel->getVoiceRoom() : CVoiceRoom();
{
return voiceChannel->getVoiceRoom();
}
else
{
return CVoiceRoom();
}
} }
CVoiceRoomList CContextAudio::getComVoiceRooms() const CVoiceRoomList CContextAudio::getComVoiceRooms() const
@@ -401,15 +397,8 @@ namespace BlackCore
Q_ASSERT(m_voice); Q_ASSERT(m_voice);
if (m_debugEnabled) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } if (m_debugEnabled) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; }
auto voiceChannel = m_voiceChannelMapping.value(comUnitValue); const auto voiceChannel = m_voiceChannelMapping.value(comUnitValue);
if (voiceChannel) return voiceChannel ? voiceChannel->getVoiceRoomCallsigns() : CCallsignSet();
{
return voiceChannel->getVoiceRoomCallsigns();
}
else
{
return CCallsignSet();
}
} }
Network::CUserList CContextAudio::getRoomUsers(BlackMisc::Aviation::CComSystem::ComUnit comUnit) const Network::CUserList CContextAudio::getRoomUsers(BlackMisc::Aviation::CComSystem::ComUnit comUnit) const
@@ -426,7 +415,18 @@ namespace BlackCore
{ {
Q_ASSERT(m_voice); Q_ASSERT(m_voice);
if (m_debugEnabled) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << selcal; } if (m_debugEnabled) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << selcal; }
m_selcalPlayer->play(90, selcal); const CTime t = m_selcalPlayer->play(90, selcal);
const int ms = t.toMs();
if (ms > 10)
{
// As of https://dev.swift-project.org/T558 play additional notification
const QPointer<CContextAudio> myself(const_cast<CContextAudio *>(this)); //! \fixme KB 2019-03 add bit hacky as I need non-const and do not want to change all signatures
QTimer::singleShot(ms, this, [ = ]
{
if (!sApp || sApp->isShuttingDown() || !myself) { return; }
this->playNotification(CNotificationSounds::NotificationTextMessageSupervisor, true);
});
}
} }
void CContextAudio::playNotification(CNotificationSounds::NotificationFlag notification, bool considerSettings) const void CContextAudio::playNotification(CNotificationSounds::NotificationFlag notification, bool considerSettings) const
@@ -545,7 +545,7 @@ namespace BlackCore
case IVoiceChannel::ConnectingFailed: case IVoiceChannel::ConnectingFailed:
case IVoiceChannel::DisconnectedError: case IVoiceChannel::DisconnectedError:
CLogMessage(this).warning(u"Voice channel disconnecting error"); CLogMessage(this).warning(u"Voice channel disconnecting error");
// intentional fall-through Q_FALLTHROUGH();
case IVoiceChannel::Disconnected: case IVoiceChannel::Disconnected:
emit this->changedVoiceRooms(getComVoiceRooms(), false); emit this->changedVoiceRooms(getComVoiceRooms(), false);
break; break;

View File

@@ -27,19 +27,22 @@ namespace BlackSound
m_threadedPlayer.quitAndWait(); m_threadedPlayer.quitAndWait();
} }
void CSelcalPlayer::play(int volume, const BlackMisc::Aviation::CSelcal &selcal) CTime CSelcalPlayer::play(int volume, const CSelcal &selcal)
{ {
CTime duration = CTime::null();
if (selcal.isValid()) if (selcal.isValid())
{ {
QList<CFrequency> frequencies = selcal.getFrequencies(); const QList<CFrequency> frequencies = selcal.getFrequencies();
Q_ASSERT(frequencies.size() == 4); Q_ASSERT(frequencies.size() == 4);
const BlackMisc::PhysicalQuantities::CTime oneSec(1000.0, BlackMisc::PhysicalQuantities::CTimeUnit::ms()); const CTime oneSec(1000.0, CTimeUnit::ms());
CTonePair t1(frequencies.at(0), frequencies.at(1), oneSec); const CTonePair t1(frequencies.at(0), frequencies.at(1), oneSec);
CTonePair t2({}, {}, oneSec / 5.0); const CTonePair t2({}, {}, oneSec / 5.0);
CTonePair t3(frequencies.at(2), frequencies.at(3), oneSec); const CTonePair t3(frequencies.at(2), frequencies.at(3), oneSec);
QList<CTonePair> tonePairs; QList<CTonePair> tonePairs;
tonePairs << t1 << t2 << t3; tonePairs << t1 << t2 << t3;
m_threadedPlayer.play(volume, tonePairs); m_threadedPlayer.play(volume, tonePairs);
duration = oneSec * 2.5;
} }
return duration;
} }
} }

View File

@@ -11,16 +11,14 @@
#ifndef BLACKSOUND_SELCALPLAYER_H #ifndef BLACKSOUND_SELCALPLAYER_H
#define BLACKSOUND_SELCALPLAYER_H #define BLACKSOUND_SELCALPLAYER_H
#include "blacksoundexport.h"
#include "blacksound/threadedtonepairplayer.h" #include "blacksound/threadedtonepairplayer.h"
#include "blacksound/tonepair.h" #include "blacksound/tonepair.h"
#include "blacksoundexport.h"
#include "blackmisc/aviation/selcal.h" #include "blackmisc/aviation/selcal.h"
#include "blackmisc/worker.h" #include "blackmisc/worker.h"
#include <QAudioDeviceInfo> #include <QAudioDeviceInfo>
class QTimer;
namespace BlackSound namespace BlackSound
{ {
//! SELCAL player //! SELCAL player
@@ -36,7 +34,8 @@ namespace BlackSound
~CSelcalPlayer(); ~CSelcalPlayer();
//! Play selcal //! Play selcal
void play(int volume, const BlackMisc::Aviation::CSelcal &selcal); //! \return Time of the played tone
BlackMisc::PhysicalQuantities::CTime play(int volume, const BlackMisc::Aviation::CSelcal &selcal);
private: private:
CThreadedTonePairPlayer m_threadedPlayer; CThreadedTonePairPlayer m_threadedPlayer;