diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index ad2ef88ed4..637ca2c13a 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -348,7 +348,7 @@ true - + true @@ -612,7 +612,7 @@ true - + true @@ -752,7 +752,6 @@ - @@ -1398,8 +1397,7 @@ - - + $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing %(Identity)... .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index 01cb7c7c6c..0db0fce5d5 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -849,13 +849,10 @@ Io\music - - Io\music - - + Generated Files\Debug - + Generated Files\Release @@ -1202,9 +1199,6 @@ Gui\utils - - Io\music - Gui\utils @@ -1486,7 +1480,7 @@ Gui\settings - + Io\music @@ -1639,4 +1633,4 @@ Scripts - \ No newline at end of file + diff --git a/rpcs3/rpcs3qt/CMakeLists.txt b/rpcs3/rpcs3qt/CMakeLists.txt index 0a27e49eec..9bb2e8fd8a 100644 --- a/rpcs3/rpcs3qt/CMakeLists.txt +++ b/rpcs3/rpcs3qt/CMakeLists.txt @@ -65,7 +65,6 @@ add_library(rpcs3_ui STATIC progress_indicator.cpp qt_camera_handler.cpp qt_camera_video_sink.cpp - qt_music_error_handler.cpp qt_music_handler.cpp qt_utils.cpp register_editor_dialog.cpp diff --git a/rpcs3/rpcs3qt/qt_music_error_handler.cpp b/rpcs3/rpcs3qt/qt_music_error_handler.cpp deleted file mode 100644 index 347e52934a..0000000000 --- a/rpcs3/rpcs3qt/qt_music_error_handler.cpp +++ /dev/null @@ -1,95 +0,0 @@ -#include "qt_music_error_handler.h" -#include "util/logs.hpp" - -LOG_CHANNEL(music_log, "Music"); - -template <> -void fmt_class_string::format(std::string& out, u64 arg) -{ - format_enum(out, arg, [](QMediaPlayer::Error value) - { - switch (value) - { - case QMediaPlayer::Error::NoError: return "NoError"; - case QMediaPlayer::Error::ResourceError: return "ResourceError"; - case QMediaPlayer::Error::FormatError: return "FormatError"; - case QMediaPlayer::Error::NetworkError: return "NetworkError"; - case QMediaPlayer::Error::AccessDeniedError: return "AccessDeniedError"; - } - - return unknown; - }); -} - -template <> -void fmt_class_string::format(std::string& out, u64 arg) -{ - format_enum(out, arg, [](QMediaPlayer::MediaStatus value) - { - switch (value) - { - case QMediaPlayer::MediaStatus::NoMedia: return "NoMedia"; - case QMediaPlayer::MediaStatus::LoadingMedia: return "LoadingMedia"; - case QMediaPlayer::MediaStatus::LoadedMedia: return "LoadedMedia"; - case QMediaPlayer::MediaStatus::StalledMedia: return "StalledMedia"; - case QMediaPlayer::MediaStatus::BufferingMedia: return "BufferingMedia"; - case QMediaPlayer::MediaStatus::BufferedMedia: return "BufferedMedia"; - case QMediaPlayer::MediaStatus::EndOfMedia: return "EndOfMedia"; - case QMediaPlayer::MediaStatus::InvalidMedia: return "InvalidMedia"; - } - - return unknown; - }); -} - -template <> -void fmt_class_string::format(std::string& out, u64 arg) -{ - format_enum(out, arg, [](QMediaPlayer::PlaybackState value) - { - switch (value) - { - case QMediaPlayer::PlaybackState::StoppedState: return "StoppedState"; - case QMediaPlayer::PlaybackState::PlayingState: return "PlayingState"; - case QMediaPlayer::PlaybackState::PausedState: return "PausedState"; - } - - return unknown; - }); -} - -qt_music_error_handler::qt_music_error_handler(std::shared_ptr media_player, std::function status_callback) - : m_media_player(std::move(media_player)) - , m_status_callback(std::move(status_callback)) -{ - if (m_media_player) - { - connect(m_media_player.get(), &QMediaPlayer::mediaStatusChanged, this, &qt_music_error_handler::handle_media_status); - connect(m_media_player.get(), &QMediaPlayer::playbackStateChanged, this, &qt_music_error_handler::handle_music_state); - connect(m_media_player.get(), &QMediaPlayer::errorOccurred, this, &qt_music_error_handler::handle_music_error); - } -} - -qt_music_error_handler::~qt_music_error_handler() -{ -} - -void qt_music_error_handler::handle_media_status(QMediaPlayer::MediaStatus status) -{ - music_log.notice("New media status: %s (status=%d)", status, static_cast(status)); - - if (m_status_callback) - { - m_status_callback(status); - } -} - -void qt_music_error_handler::handle_music_state(QMediaPlayer::PlaybackState state) -{ - music_log.notice("New playback state: %s (state=%d)", state, static_cast(state)); -} - -void qt_music_error_handler::handle_music_error(QMediaPlayer::Error error, const QString& errorString) -{ - music_log.error("Error event: \"%s\" (error=%s)", errorString, error); -} diff --git a/rpcs3/rpcs3qt/qt_music_error_handler.h b/rpcs3/rpcs3qt/qt_music_error_handler.h deleted file mode 100644 index 7d19c22d5c..0000000000 --- a/rpcs3/rpcs3qt/qt_music_error_handler.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include -#include - -class qt_music_error_handler : public QObject -{ - Q_OBJECT - -public: - qt_music_error_handler(std::shared_ptr media_player, std::function status_callback); - virtual ~qt_music_error_handler(); - -private Q_SLOTS: - void handle_media_status(QMediaPlayer::MediaStatus status); - void handle_music_state(QMediaPlayer::PlaybackState state); - void handle_music_error(QMediaPlayer::Error error, const QString& errorString); - -private: - std::shared_ptr m_media_player; - std::function m_status_callback = nullptr; -}; diff --git a/rpcs3/rpcs3qt/qt_music_handler.cpp b/rpcs3/rpcs3qt/qt_music_handler.cpp index d92d379cd9..7eda064f6c 100644 --- a/rpcs3/rpcs3qt/qt_music_handler.cpp +++ b/rpcs3/rpcs3qt/qt_music_handler.cpp @@ -1,7 +1,6 @@ #include "qt_music_handler.h" #include "Emu/Cell/Modules/cellMusic.h" #include "Emu/System.h" -#include "Utilities/Thread.h" #include "util/logs.hpp" #include @@ -9,6 +8,61 @@ LOG_CHANNEL(music_log, "Music"); +template <> +void fmt_class_string::format(std::string& out, u64 arg) +{ + format_enum(out, arg, [](QMediaPlayer::Error value) + { + switch (value) + { + case QMediaPlayer::Error::NoError: return "NoError"; + case QMediaPlayer::Error::ResourceError: return "ResourceError"; + case QMediaPlayer::Error::FormatError: return "FormatError"; + case QMediaPlayer::Error::NetworkError: return "NetworkError"; + case QMediaPlayer::Error::AccessDeniedError: return "AccessDeniedError"; + } + + return unknown; + }); +} + +template <> +void fmt_class_string::format(std::string& out, u64 arg) +{ + format_enum(out, arg, [](QMediaPlayer::MediaStatus value) + { + switch (value) + { + case QMediaPlayer::MediaStatus::NoMedia: return "NoMedia"; + case QMediaPlayer::MediaStatus::LoadingMedia: return "LoadingMedia"; + case QMediaPlayer::MediaStatus::LoadedMedia: return "LoadedMedia"; + case QMediaPlayer::MediaStatus::StalledMedia: return "StalledMedia"; + case QMediaPlayer::MediaStatus::BufferingMedia: return "BufferingMedia"; + case QMediaPlayer::MediaStatus::BufferedMedia: return "BufferedMedia"; + case QMediaPlayer::MediaStatus::EndOfMedia: return "EndOfMedia"; + case QMediaPlayer::MediaStatus::InvalidMedia: return "InvalidMedia"; + } + + return unknown; + }); +} + +template <> +void fmt_class_string::format(std::string& out, u64 arg) +{ + format_enum(out, arg, [](QMediaPlayer::PlaybackState value) + { + switch (value) + { + case QMediaPlayer::PlaybackState::StoppedState: return "StoppedState"; + case QMediaPlayer::PlaybackState::PlayingState: return "PlayingState"; + case QMediaPlayer::PlaybackState::PausedState: return "PausedState"; + } + + return unknown; + }); +} + qt_music_handler::qt_music_handler() { music_log.notice("Constructing Qt music handler..."); @@ -16,32 +70,9 @@ qt_music_handler::qt_music_handler() m_media_player = std::make_shared(); m_media_player->setAudioOutput(new QAudioOutput()); - m_error_handler = std::make_unique(m_media_player, - [this](QMediaPlayer::MediaStatus status) - { - if (!m_status_callback) - { - return; - } - - switch (status) - { - case QMediaPlayer::MediaStatus::NoMedia: - case QMediaPlayer::MediaStatus::LoadingMedia: - case QMediaPlayer::MediaStatus::LoadedMedia: - case QMediaPlayer::MediaStatus::StalledMedia: - case QMediaPlayer::MediaStatus::BufferingMedia: - case QMediaPlayer::MediaStatus::BufferedMedia: - case QMediaPlayer::MediaStatus::InvalidMedia: - break; - case QMediaPlayer::MediaStatus::EndOfMedia: - m_status_callback(player_status::end_of_media); - break; - default: - music_log.error("Ignoring unknown status %d", static_cast(status)); - break; - } - }); + connect(m_media_player.get(), &QMediaPlayer::mediaStatusChanged, this, &qt_music_handler::handle_media_status); + connect(m_media_player.get(), &QMediaPlayer::playbackStateChanged, this, &qt_music_handler::handle_music_state); + connect(m_media_player.get(), &QMediaPlayer::errorOccurred, this, &qt_music_handler::handle_music_error); } qt_music_handler::~qt_music_handler() @@ -51,7 +82,6 @@ qt_music_handler::~qt_music_handler() music_log.notice("Destroying Qt music handler..."); m_media_player->stop(); m_media_player.reset(); - m_error_handler.reset(); }); } @@ -166,3 +196,41 @@ f32 qt_music_handler::get_volume() const return volume; } + +void qt_music_handler::handle_media_status(QMediaPlayer::MediaStatus status) +{ + music_log.notice("New media status: %s (status=%d)", status, static_cast(status)); + + if (!m_status_callback) + { + return; + } + + switch (status) + { + case QMediaPlayer::MediaStatus::NoMedia: + case QMediaPlayer::MediaStatus::LoadingMedia: + case QMediaPlayer::MediaStatus::LoadedMedia: + case QMediaPlayer::MediaStatus::StalledMedia: + case QMediaPlayer::MediaStatus::BufferingMedia: + case QMediaPlayer::MediaStatus::BufferedMedia: + case QMediaPlayer::MediaStatus::InvalidMedia: + break; + case QMediaPlayer::MediaStatus::EndOfMedia: + m_status_callback(player_status::end_of_media); + break; + default: + music_log.error("Ignoring unknown status %d", static_cast(status)); + break; + } +} + +void qt_music_handler::handle_music_state(QMediaPlayer::PlaybackState state) +{ + music_log.notice("New playback state: %s (state=%d)", state, static_cast(state)); +} + +void qt_music_handler::handle_music_error(QMediaPlayer::Error error, const QString& errorString) +{ + music_log.error("Error event: \"%s\" (error=%s)", errorString, error); +} diff --git a/rpcs3/rpcs3qt/qt_music_handler.h b/rpcs3/rpcs3qt/qt_music_handler.h index fbfe3d5e19..1e672fd8ec 100644 --- a/rpcs3/rpcs3qt/qt_music_handler.h +++ b/rpcs3/rpcs3qt/qt_music_handler.h @@ -1,13 +1,15 @@ #pragma once #include "Emu/Io/music_handler_base.h" -#include "qt_music_error_handler.h" #include +#include #include -class qt_music_handler final : public music_handler_base +class qt_music_handler final : public QObject, public music_handler_base { + Q_OBJECT + public: qt_music_handler(); virtual ~qt_music_handler(); @@ -20,9 +22,13 @@ public: void set_volume(f32 volume) override; f32 get_volume() const override; +private Q_SLOTS: + void handle_media_status(QMediaPlayer::MediaStatus status); + void handle_music_state(QMediaPlayer::PlaybackState state); + void handle_music_error(QMediaPlayer::Error error, const QString& errorString); + private: mutable std::mutex m_mutex; - std::unique_ptr m_error_handler; std::shared_ptr m_media_player; std::string m_path; };