From 3ad3c98daf6ce86a39ea899b3bb8adbde9336b23 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Mon, 27 Nov 2023 05:53:41 -0600 Subject: [PATCH] Add play audio functionality to media manager --- .../source/scwx/qt/manager/media_manager.cpp | 62 ++++++++++++++++++- .../source/scwx/qt/manager/media_manager.hpp | 4 ++ 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/scwx-qt/source/scwx/qt/manager/media_manager.cpp b/scwx-qt/source/scwx/qt/manager/media_manager.cpp index 23896e63..d5ad895b 100644 --- a/scwx-qt/source/scwx/qt/manager/media_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/media_manager.cpp @@ -1,6 +1,11 @@ #include #include +#include +#include +#include +#include + namespace scwx { namespace qt @@ -14,14 +19,67 @@ static const auto logger_ = scwx::util::Logger::Create(logPrefix_); class MediaManager::Impl { public: - explicit Impl() {} + explicit Impl(MediaManager* self) : + self_ {self}, + mediaPlayer_ {new QMediaPlayer(self)}, + audioOutput_ {new QAudioOutput(self)} + { + audioOutput_->setVolume(1.0f); + mediaPlayer_->setAudioOutput(audioOutput_); + + logger_->debug("Audio device: {}", + audioOutput_->device().description().toStdString()); + + ConnectSignals(); + } ~Impl() {} + + void ConnectSignals(); + + MediaManager* self_; + + QMediaPlayer* mediaPlayer_; + QAudioOutput* audioOutput_; }; -MediaManager::MediaManager() : p(std::make_unique()) {} +MediaManager::MediaManager() : p(std::make_unique(this)) {} MediaManager::~MediaManager() = default; +void MediaManager::Impl::ConnectSignals() +{ + QObject::connect(audioOutput_, + &QAudioOutput::deviceChanged, + self_, + [this]() + { + logger_->debug( + "Audio device changed: {}", + audioOutput_->device().description().toStdString()); + }); + + QObject::connect(mediaPlayer_, + &QMediaPlayer::errorOccurred, + self_, + [](QMediaPlayer::Error error, const QString& errorString) + { + logger_->error("Error {}: {}", + static_cast(error), + errorString.toStdString()); + }); +} + +void MediaManager::Play(types::AudioFile media) +{ + const std::string path = types::GetMediaPath(media); + + logger_->debug("Playing audio: {}", path); + + p->mediaPlayer_->setSource(QUrl(QString::fromStdString(path))); + + QMetaObject::invokeMethod(p->mediaPlayer_, &QMediaPlayer::play); +} + std::shared_ptr MediaManager::Instance() { static std::weak_ptr mediaManagerReference_ {}; diff --git a/scwx-qt/source/scwx/qt/manager/media_manager.hpp b/scwx-qt/source/scwx/qt/manager/media_manager.hpp index 958bfc82..1b6f7ce9 100644 --- a/scwx-qt/source/scwx/qt/manager/media_manager.hpp +++ b/scwx-qt/source/scwx/qt/manager/media_manager.hpp @@ -1,5 +1,7 @@ #pragma once +#include + #include #include @@ -20,6 +22,8 @@ public: explicit MediaManager(); ~MediaManager(); + void Play(types::AudioFile media); + static std::shared_ptr Instance(); private: