Move Notification sounds into CNotificationPlayer

This commit is contained in:
Roland Rossgotterer
2019-03-05 15:18:16 +01:00
committed by Mat Sutcliffe
parent 77a8c46790
commit d5b3a336dd
8 changed files with 128 additions and 74 deletions

View File

@@ -0,0 +1,77 @@
/* Copyright (C) 2016
* swift project Community / Contributors
*
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
* directory of this distribution. No part of swift project, including this file, may be copied, modified, propagated,
* or distributed except according to the terms contained in the LICENSE file.
*/
#include "notificationplayer.h"
#include "blackmisc/directoryutils.h"
#include <QUrl>
using namespace BlackMisc;
using namespace BlackMisc::Audio;
namespace BlackSound
{
CNotificationPlayer::CNotificationPlayer(QObject *parent) :
QObject(parent)
{
QSoundEffect *effect = new QSoundEffect(this);
effect->setSource(QUrl::fromLocalFile(CDirectoryUtils::soundFilesDirectory() + "/error.wav"));
m_effects[CNotificationSounds::NotificationError] = effect;
effect = new QSoundEffect(this);
effect->setSource(QUrl::fromLocalFile(CDirectoryUtils::soundFilesDirectory() + "/login.wav"));
m_effects[CNotificationSounds::NotificationLogin] = effect;
effect = new QSoundEffect(this);
effect->setSource(QUrl::fromLocalFile(CDirectoryUtils::soundFilesDirectory() + "/logoff.wav"));
m_effects[CNotificationSounds::NotificationLogoff] = effect;
effect = new QSoundEffect(this);
effect->setSource(QUrl::fromLocalFile(CDirectoryUtils::soundFilesDirectory() + "/privatemessage.wav"));
m_effects[CNotificationSounds::NotificationTextMessagePrivate] = effect;
effect = new QSoundEffect(this);
effect->setSource(QUrl::fromLocalFile(CDirectoryUtils::soundFilesDirectory() + "/supervisormessage.wav"));
m_effects[CNotificationSounds::NotificationTextMessageSupervisor] = effect;
effect = new QSoundEffect(this);
effect->setSource(QUrl::fromLocalFile(CDirectoryUtils::soundFilesDirectory() + "/callsignmentioned.wav"));
m_effects[CNotificationSounds::NotificationTextCallsignMentioned] = effect;
effect = new QSoundEffect(this);
effect->setSource(QUrl::fromLocalFile(CDirectoryUtils::soundFilesDirectory() + "/voiceroomjoined.wav"));
m_effects[CNotificationSounds::NotificationVoiceRoomJoined] = effect;
effect = new QSoundEffect(this);
effect->setSource(QUrl::fromLocalFile(CDirectoryUtils::soundFilesDirectory() + "/voiceroomleft.wav"));
m_effects[CNotificationSounds::NotificationVoiceRoomLeft] = effect;
effect = new QSoundEffect(this);
effect->setSource(QUrl::fromLocalFile(CDirectoryUtils::soundFilesDirectory() + "/noaudiotransmission.wav"));
m_effects[CNotificationSounds::NotificationNoAudioTransmission] = effect;
effect = new QSoundEffect(this);
effect->setSource(QUrl::fromLocalFile(CDirectoryUtils::soundFilesDirectory() + "/pttclick.wav"));
m_effects[CNotificationSounds::PTTClickKeyDown] = effect;
effect = new QSoundEffect(this);
effect->setSource(QUrl::fromLocalFile(CDirectoryUtils::soundFilesDirectory() + "/pttclick.wav"));
m_effects[CNotificationSounds::PTTClickKeyUp] = effect;
}
void CNotificationPlayer::play(Audio::CNotificationSounds::NotificationFlag notification, int volume) const
{
QSoundEffect *effect = m_effects.value(notification, nullptr);
if (effect)
{
effect->setVolume(volume / 100.0);
effect->play();
}
}
}

View File

@@ -0,0 +1,45 @@
/* Copyright (C) 2019
* swift project Community / Contributors
*
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
* directory of this distribution. No part of swift project, including this file, may be copied, modified, propagated,
* or distributed except according to the terms contained in the LICENSE file.
*/
//! \file
#ifndef BLACKSOUND_NOTIFICATIONPLAYER_H
#define BLACKSOUND_NOTIFICATIONPLAYER_H
#include "blacksoundexport.h"
#include "blackmisc/audio/notificationsounds.h"
#include <QObject>
#include <QHash>
#include <QSoundEffect>
class QTimer;
namespace BlackSound
{
//! Player for notification sounds
class BLACKSOUND_EXPORT CNotificationPlayer : public QObject
{
Q_OBJECT
public:
//! Constructor
CNotificationPlayer(QObject *parent = nullptr);
//! Destructor
virtual ~CNotificationPlayer() override {}
//! Play notification sound
void play(BlackMisc::Audio::CNotificationSounds::NotificationFlag notification, int volume = 100) const;
private:
QHash<BlackMisc::Audio::CNotificationSounds::NotificationFlag, QSoundEffect *> m_effects;
};
}
#endif // guard

View File

@@ -16,12 +16,9 @@
#include <qendian.h>
#include <QMultimedia>
#include <QAudioOutput>
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QTimer>
#include <QUrl>
#include <QFile>
#include <QDir>
#include <QSound>
using namespace BlackMisc;
using namespace BlackMisc::Aviation;
@@ -445,7 +442,6 @@ namespace BlackSound
tones << t1 << t2 << t3;
}
CSoundGenerator::playSignalInBackground(volume, tones, device);
// CSoundGenerator::playSignalRecorded(volume, tones, device);
}
void CSoundGenerator::playSelcal(int volume, const CSelcal &selcal, const CAudioDeviceInfo &audioDevice)
@@ -455,50 +451,11 @@ namespace BlackSound
CSoundGenerator::playSelcal(volume, selcal, CSoundGenerator::findClosestOutputDevice(audioDevice));
}
void CSoundGenerator::playNotificationSound(int volume, CNotificationSounds::NotificationFlag notification)
{
QMediaPlayer *mediaPlayer = CSoundGenerator::mediaPlayer();
if (mediaPlayer->state() == QMediaPlayer::PlayingState) return;
QMediaPlaylist *playlist = mediaPlayer->playlist();
if (!playlist || playlist->isEmpty())
{
// order here is crucial, needs to be the same as in CSoundGenerator::Notification
if (!playlist) playlist = new QMediaPlaylist(mediaPlayer);
bool success = true;
success = playlist->addMedia(QUrl::fromLocalFile(CDirectoryUtils::soundFilesDirectory() + "/error.wav")) && success;
success = playlist->addMedia(QUrl::fromLocalFile(CDirectoryUtils::soundFilesDirectory() + "/login.wav")) && success;
success = playlist->addMedia(QUrl::fromLocalFile(CDirectoryUtils::soundFilesDirectory() + "/logoff.wav")) && success;
success = playlist->addMedia(QUrl::fromLocalFile(CDirectoryUtils::soundFilesDirectory() + "/privatemessage.wav")) && success;
success = playlist->addMedia(QUrl::fromLocalFile(CDirectoryUtils::soundFilesDirectory() + "/supervisormessage.wav")) && success;
success = playlist->addMedia(QUrl::fromLocalFile(CDirectoryUtils::soundFilesDirectory() + "/callsignmentioned.wav")) && success;
success = playlist->addMedia(QUrl::fromLocalFile(CDirectoryUtils::soundFilesDirectory() + "/voiceroomjoined.wav")) && success;
success = playlist->addMedia(QUrl::fromLocalFile(CDirectoryUtils::soundFilesDirectory() + "/voiceroomleft.wav")) && success;
success = playlist->addMedia(QUrl::fromLocalFile(CDirectoryUtils::soundFilesDirectory() + "/noaudiotransmission.wav")) && success;
success = playlist->addMedia(QUrl::fromLocalFile(CDirectoryUtils::soundFilesDirectory() + "/pttclick.wav")) && success;
success = playlist->addMedia(QUrl::fromLocalFile(CDirectoryUtils::soundFilesDirectory() + "/pttclick.wav")) && success;
Q_ASSERT(success);
playlist->setPlaybackMode(QMediaPlaylist::CurrentItemOnce);
mediaPlayer->setPlaylist(playlist);
}
if (notification == CNotificationSounds::LoadSounds) { return; }
if (notification == CNotificationSounds::NoNotifications) { return; }
const int index = qRound(std::log2(static_cast<double>(notification)));
playlist->setCurrentIndex(index);
mediaPlayer->setVolume(volume); // 0-100
mediaPlayer->play();
}
void CSoundGenerator::playFile(int volume, const QString &file, bool removeFileAfterPlaying)
{
if (!QFile::exists(file)) { return; }
QMediaPlayer *mediaPlayer = CSoundGenerator::mediaPlayer();
QUrl url(file);
QMediaContent media(url);
mediaPlayer->setMedia(media);
mediaPlayer->setVolume(volume); // 0-100
mediaPlayer->play();
Q_UNUSED(volume);
QSound::play(file);
// I cannot delete the file here, only after it has been played
if (removeFileAfterPlaying) { new CTimedFileDeleter(file, 1000 * 60, QCoreApplication::instance()); }
}

View File

@@ -158,11 +158,6 @@ namespace BlackSound
//! \param removeFileAfterPlaying delete the file, after it has been played
static void playFile(int volume, const QString &file, bool removeFileAfterPlaying);
//! Play notification
//! \param volume 0-100
//! \param notification
static void playNotificationSound(int volume, BlackMisc::Audio::CNotificationSounds::NotificationFlag notification);
//! For debugging purposes
static void printAllQtSoundDevices(QTextStream &qtout);
@@ -243,13 +238,6 @@ namespace BlackSound
DataHeader data;
};
//! "My" media player
static QMediaPlayer *mediaPlayer()
{
static QMediaPlayer *mediaPlayer = new QMediaPlayer();
return mediaPlayer;
}
//! Duration of these tones
static qint64 calculateDurationMs(const QList<Tone> &tones);