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:
Klaus Basan
2019-09-20 15:10:00 +02:00
committed by Mat Sutcliffe
parent 55f70a794e
commit d944d0f6ee
8 changed files with 46 additions and 16 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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; }

View File

@@ -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;

View File

@@ -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);
} }

View File

@@ -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;

View File

@@ -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

View File

@@ -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);