mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-20 12:35:43 +08:00
Do not play QSoundEffect while it is still playing
* added m_playEffect as flag * hooked up signals to reset the flags
This commit is contained in:
committed by
Mat Sutcliffe
parent
55f70a794e
commit
d944d0f6ee
@@ -142,13 +142,13 @@ namespace BlackCore
|
|||||||
virtual bool isMuted() const = 0;
|
virtual bool isMuted() const = 0;
|
||||||
|
|
||||||
//! Play SELCAL tone
|
//! Play SELCAL tone
|
||||||
virtual void playSelcalTone(const BlackMisc::Aviation::CSelcal &selcal) const = 0;
|
virtual void playSelcalTone(const BlackMisc::Aviation::CSelcal &selcal) = 0;
|
||||||
|
|
||||||
//! Play notification sound
|
//! Play notification sound
|
||||||
//! \param notification CSoundGenerator::Notification
|
//! \param notification CSoundGenerator::Notification
|
||||||
//! \param considerSettings consider settings (notification on/off), false means settings ignored
|
//! \param considerSettings consider settings (notification on/off), false means settings ignored
|
||||||
//! \param volume 0..100
|
//! \param volume 0..100
|
||||||
virtual void playNotification(BlackMisc::Audio::CNotificationSounds::NotificationFlag notification, bool considerSettings, int volume = -1) const = 0;
|
virtual void playNotification(BlackMisc::Audio::CNotificationSounds::NotificationFlag notification, bool considerSettings, int volume = -1) = 0;
|
||||||
|
|
||||||
//! Enable audio loopback
|
//! Enable audio loopback
|
||||||
virtual void enableAudioLoopback(bool enable = true) = 0;
|
virtual void enableAudioLoopback(bool enable = true) = 0;
|
||||||
|
|||||||
@@ -111,14 +111,14 @@ namespace BlackCore
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! \copydoc IContextAudio::playSelcalTone()
|
//! \copydoc IContextAudio::playSelcalTone()
|
||||||
virtual void playSelcalTone(const BlackMisc::Aviation::CSelcal &selcal) const override
|
virtual void playSelcalTone(const BlackMisc::Aviation::CSelcal &selcal) override
|
||||||
{
|
{
|
||||||
Q_UNUSED(selcal);
|
Q_UNUSED(selcal);
|
||||||
logEmptyContextWarning(Q_FUNC_INFO);
|
logEmptyContextWarning(Q_FUNC_INFO);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! \copydoc IContextAudio::playNotification()
|
//! \copydoc IContextAudio::playNotification()
|
||||||
virtual void playNotification(BlackMisc::Audio::CNotificationSounds::NotificationFlag notification, bool considerSettings, int volume = -1) const override
|
virtual void playNotification(BlackMisc::Audio::CNotificationSounds::NotificationFlag notification, bool considerSettings, int volume = -1) override
|
||||||
{
|
{
|
||||||
Q_UNUSED(volume);
|
Q_UNUSED(volume);
|
||||||
Q_UNUSED(notification);
|
Q_UNUSED(notification);
|
||||||
|
|||||||
@@ -478,7 +478,7 @@ namespace BlackCore
|
|||||||
return this->getIContextNetwork()->getUsersForCallsigns(this->getRoomCallsigns(comUnit));
|
return this->getIContextNetwork()->getUsersForCallsigns(this->getRoomCallsigns(comUnit));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CContextAudio::playSelcalTone(const CSelcal &selcal) const
|
void CContextAudio::playSelcalTone(const CSelcal &selcal)
|
||||||
{
|
{
|
||||||
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; }
|
||||||
@@ -496,7 +496,7 @@ namespace BlackCore
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CContextAudio::playNotification(CNotificationSounds::NotificationFlag notification, bool considerSettings, int volume) const
|
void CContextAudio::playNotification(CNotificationSounds::NotificationFlag notification, bool considerSettings, int volume)
|
||||||
{
|
{
|
||||||
Q_ASSERT(m_voice);
|
Q_ASSERT(m_voice);
|
||||||
if (m_debugEnabled) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << notification; }
|
if (m_debugEnabled) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << notification; }
|
||||||
|
|||||||
@@ -94,8 +94,8 @@ namespace BlackCore
|
|||||||
virtual int getVoiceOutputVolume() const override;
|
virtual int getVoiceOutputVolume() const override;
|
||||||
virtual void setMute(bool muted) override;
|
virtual void setMute(bool muted) override;
|
||||||
virtual bool isMuted() const override;
|
virtual bool isMuted() const override;
|
||||||
virtual void playSelcalTone(const BlackMisc::Aviation::CSelcal &selcal) const override;
|
virtual void playSelcalTone(const BlackMisc::Aviation::CSelcal &selcal) override;
|
||||||
virtual void playNotification(BlackMisc::Audio::CNotificationSounds::NotificationFlag notification, bool considerSettings, int volume = -1) const override;
|
virtual void playNotification(BlackMisc::Audio::CNotificationSounds::NotificationFlag notification, bool considerSettings, int volume = -1) override;
|
||||||
virtual void enableAudioLoopback(bool enable = true) override;
|
virtual void enableAudioLoopback(bool enable = true) override;
|
||||||
virtual bool isAudioLoopbackEnabled() const override;
|
virtual bool isAudioLoopbackEnabled() const override;
|
||||||
virtual BlackMisc::Audio::CVoiceSetup getVoiceSetup() const override;
|
virtual BlackMisc::Audio::CVoiceSetup getVoiceSetup() const override;
|
||||||
|
|||||||
@@ -100,12 +100,12 @@ namespace BlackCore
|
|||||||
this->m_dBusInterface->callDBus(QLatin1String("setComVoiceRooms"), voiceRooms);
|
this->m_dBusInterface->callDBus(QLatin1String("setComVoiceRooms"), voiceRooms);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CContextAudioProxy::playSelcalTone(const CSelcal &selcal) const
|
void CContextAudioProxy::playSelcalTone(const CSelcal &selcal)
|
||||||
{
|
{
|
||||||
this->m_dBusInterface->callDBus(QLatin1String("playSelcalTone"), selcal);
|
this->m_dBusInterface->callDBus(QLatin1String("playSelcalTone"), selcal);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CContextAudioProxy::playNotification(CNotificationSounds::NotificationFlag notification, bool considerSettings, int volume) const
|
void CContextAudioProxy::playNotification(CNotificationSounds::NotificationFlag notification, bool considerSettings, int volume)
|
||||||
{
|
{
|
||||||
this->m_dBusInterface->callDBus(QLatin1String("playNotification"), notification, considerSettings, volume);
|
this->m_dBusInterface->callDBus(QLatin1String("playNotification"), notification, considerSettings, volume);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,8 +74,8 @@ namespace BlackCore
|
|||||||
virtual int getVoiceOutputVolume() const override;
|
virtual int getVoiceOutputVolume() const override;
|
||||||
virtual void setMute(bool muted) override;
|
virtual void setMute(bool muted) override;
|
||||||
virtual bool isMuted() const override;
|
virtual bool isMuted() const override;
|
||||||
virtual void playSelcalTone(const BlackMisc::Aviation::CSelcal &selcal) const override;
|
virtual void playSelcalTone(const BlackMisc::Aviation::CSelcal &selcal) override;
|
||||||
virtual void playNotification(BlackMisc::Audio::CNotificationSounds::NotificationFlag notification, bool considerSettings, int volume = -1) const override;
|
virtual void playNotification(BlackMisc::Audio::CNotificationSounds::NotificationFlag notification, bool considerSettings, int volume = -1) override;
|
||||||
virtual void enableAudioLoopback(bool enable = true) override;
|
virtual void enableAudioLoopback(bool enable = true) override;
|
||||||
virtual bool isAudioLoopbackEnabled() const override;
|
virtual bool isAudioLoopbackEnabled() const override;
|
||||||
virtual bool parseCommandLine(const QString &commandLine, const BlackMisc::CIdentifier &originator) override;
|
virtual bool parseCommandLine(const QString &commandLine, const BlackMisc::CIdentifier &originator) override;
|
||||||
|
|||||||
@@ -21,13 +21,27 @@ namespace BlackSound
|
|||||||
// lazy init at play
|
// lazy init at play
|
||||||
}
|
}
|
||||||
|
|
||||||
void CNotificationPlayer::play(CNotificationSounds::NotificationFlag notification, int volume) const
|
void CNotificationPlayer::play(CNotificationSounds::NotificationFlag notification, int volume)
|
||||||
{
|
{
|
||||||
QSoundEffect *effect = m_effects.value(notification, nullptr);
|
QSoundEffect *effect = m_effects.value(notification, nullptr);
|
||||||
if (effect)
|
if (effect)
|
||||||
{
|
{
|
||||||
effect->setVolume(volume / 100.0);
|
if (!m_playingEffect && effect->isLoaded() && !effect->isPlaying())
|
||||||
effect->play();
|
{
|
||||||
|
const qreal v = volume / 100.0f;
|
||||||
|
m_playingEffect = effect;
|
||||||
|
effect->setVolume(v);
|
||||||
|
effect->play();
|
||||||
|
|
||||||
|
/** could be used for too long or hanging sounds
|
||||||
|
QPointer<CNotificationPlayer> myself(this);
|
||||||
|
QTimer::singleShot(2000, effect, [ = ]
|
||||||
|
{
|
||||||
|
if (!myself || !m_playingEffect) { return; }
|
||||||
|
m_playingEffect->stop();
|
||||||
|
});
|
||||||
|
**/
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,6 +50,8 @@ namespace BlackSound
|
|||||||
if (directory == m_directory && !m_effects.isEmpty()) { return; }
|
if (directory == m_directory && !m_effects.isEmpty()) { return; }
|
||||||
m_directory = directory;
|
m_directory = directory;
|
||||||
|
|
||||||
|
QStringList types = QSoundEffect::supportedMimeTypes();
|
||||||
|
|
||||||
this->updateEffect(CNotificationSounds::NotificationError, directory, "error.wav");
|
this->updateEffect(CNotificationSounds::NotificationError, directory, "error.wav");
|
||||||
this->updateEffect(CNotificationSounds::NotificationLogin, directory, "login.wav");
|
this->updateEffect(CNotificationSounds::NotificationLogin, directory, "login.wav");
|
||||||
this->updateEffect(CNotificationSounds::NotificationLogoff, directory, "logoff.wav");
|
this->updateEffect(CNotificationSounds::NotificationLogoff, directory, "logoff.wav");
|
||||||
@@ -49,6 +65,13 @@ namespace BlackSound
|
|||||||
this->updateEffect(CNotificationSounds::PTTClickKeyUp, directory, "pttclick.wav");
|
this->updateEffect(CNotificationSounds::PTTClickKeyUp, directory, "pttclick.wav");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CNotificationPlayer::onPlayingChanged()
|
||||||
|
{
|
||||||
|
if (!m_playingEffect) { return; }
|
||||||
|
if (m_playingEffect->isPlaying()) { return; }
|
||||||
|
m_playingEffect.clear();
|
||||||
|
}
|
||||||
|
|
||||||
void CNotificationPlayer::updateEffect(CNotificationSounds::NotificationFlag f, const QString &directory, const QString &name)
|
void CNotificationPlayer::updateEffect(CNotificationSounds::NotificationFlag f, const QString &directory, const QString &name)
|
||||||
{
|
{
|
||||||
QSoundEffect *e = nullptr;
|
QSoundEffect *e = nullptr;
|
||||||
@@ -56,6 +79,8 @@ namespace BlackSound
|
|||||||
effect->setSource(CFileUtils::soundFileQUrl(directory, name));
|
effect->setSource(CFileUtils::soundFileQUrl(directory, name));
|
||||||
if (m_effects.contains(f)) { e = m_effects[f]; }
|
if (m_effects.contains(f)) { e = m_effects[f]; }
|
||||||
m_effects[f] = effect;
|
m_effects[f] = effect;
|
||||||
|
effect->setLoopCount(0);
|
||||||
|
connect(effect, &QSoundEffect::playingChanged, this, &CNotificationPlayer::onPlayingChanged, Qt::QueuedConnection);
|
||||||
if (e) { e->deleteLater(); }
|
if (e) { e->deleteLater(); }
|
||||||
}
|
}
|
||||||
} // ns
|
} // ns
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
#include <QSoundEffect>
|
#include <QSoundEffect>
|
||||||
|
#include <QPointer>
|
||||||
|
|
||||||
namespace BlackSound
|
namespace BlackSound
|
||||||
{
|
{
|
||||||
@@ -33,7 +34,7 @@ namespace BlackSound
|
|||||||
virtual ~CNotificationPlayer() override {}
|
virtual ~CNotificationPlayer() override {}
|
||||||
|
|
||||||
//! Play notification sound
|
//! Play notification sound
|
||||||
void play(BlackMisc::Audio::CNotificationSounds::NotificationFlag notification, int volume = 100) const;
|
void play(BlackMisc::Audio::CNotificationSounds::NotificationFlag notification, int volume = 100);
|
||||||
|
|
||||||
//! Update the directory
|
//! Update the directory
|
||||||
void updateDirectory(const QString &directory);
|
void updateDirectory(const QString &directory);
|
||||||
@@ -41,6 +42,10 @@ namespace BlackSound
|
|||||||
private:
|
private:
|
||||||
QHash<BlackMisc::Audio::CNotificationSounds::NotificationFlag, QSoundEffect *> m_effects;
|
QHash<BlackMisc::Audio::CNotificationSounds::NotificationFlag, QSoundEffect *> m_effects;
|
||||||
QString m_directory;
|
QString m_directory;
|
||||||
|
QPointer<QSoundEffect> m_playingEffect;
|
||||||
|
|
||||||
|
//! Playing of effect has been changed
|
||||||
|
void onPlayingChanged();
|
||||||
|
|
||||||
//! Update an effect
|
//! Update an effect
|
||||||
void updateEffect(BlackMisc::Audio::CNotificationSounds::NotificationFlag f, const QString &directory, const QString &name);
|
void updateEffect(BlackMisc::Audio::CNotificationSounds::NotificationFlag f, const QString &directory, const QString &name);
|
||||||
|
|||||||
Reference in New Issue
Block a user