[XMP] Added dedicated AudioMediaPlayer class

This commit is contained in:
Gliniak
2024-10-27 16:40:51 +01:00
committed by Radosław Gliński
parent 996b874d74
commit b471423c1a
9 changed files with 867 additions and 447 deletions

View File

@@ -20,8 +20,6 @@
#include "xenia/kernel/kernel_state.h"
#include "xenia/kernel/xam/app_manager.h"
#include "xenia/apu/audio_driver.h"
namespace xe {
namespace kernel {
namespace xam {
@@ -30,6 +28,36 @@ namespace apps {
// Only source of docs for a lot of these functions:
// https://github.com/oukiar/freestyledash/blob/master/Freestyle/Scenes/Media/Music/ScnMusic.cpp
struct XMP_SONGDESCRIPTOR {
xe::be<uint32_t> file_path_ptr;
xe::be<uint32_t> title_ptr;
xe::be<uint32_t> artist_ptr;
xe::be<uint32_t> album_ptr;
xe::be<uint32_t> album_artist_ptr;
xe::be<uint32_t> genre_ptr;
xe::be<uint32_t> track_number;
xe::be<uint32_t> duration;
xe::be<uint32_t> song_format;
};
static_assert_size(XMP_SONGDESCRIPTOR, 36);
constexpr uint32_t kMaxXmpMetadataStringLength = 40;
struct XMP_SONGINFO {
X_HANDLE handle;
uint8_t unknown[0x23C];
xe::be<char16_t> title[kMaxXmpMetadataStringLength];
xe::be<char16_t> artist[kMaxXmpMetadataStringLength];
xe::be<char16_t> album[kMaxXmpMetadataStringLength];
xe::be<char16_t> album_artist[kMaxXmpMetadataStringLength];
xe::be<char16_t> genre[kMaxXmpMetadataStringLength];
xe::be<uint32_t> track_number;
xe::be<uint32_t> duration;
xe::be<uint32_t> song_format;
};
static_assert_size(XMP_SONGINFO, 988);
class XmpApp : public App {
public:
enum class State : uint32_t {
@@ -42,12 +70,16 @@ class XmpApp : public App {
kTitle = 1,
};
enum class PlaybackMode : uint32_t {
// kInOrder = ?,
kUnknown = 0,
kInOrder = 0,
kShuffle = 1,
};
enum class RepeatMode : uint32_t {
// kNoRepeat = ?,
kUnknown = 0,
kPlaylist = 0,
kNoRepeat = 1,
};
enum class PlaybackFlags : uint32_t {
kDefault = 0,
kAutoPause = 1,
};
struct Song {
enum class Format : uint32_t {
@@ -95,31 +127,11 @@ class XmpApp : public App {
uint32_t buffer_length) override;
private:
void OnStateChanged();
void WorkerThreadMain();
bool PlayFile(std::string_view filename);
State state_;
PlaybackClient playback_client_;
PlaybackMode playback_mode_;
RepeatMode repeat_mode_;
uint32_t unknown_flags_;
float volume_;
Playlist* active_playlist_;
int active_song_index_;
xe::global_critical_region global_critical_region_;
std::unordered_map<uint32_t, Playlist*> playlists_;
uint32_t next_playlist_handle_;
uint32_t next_song_handle_;
std::atomic<bool> worker_running_ = {false};
std::unique_ptr<xe::threading::Thread> worker_thread_;
bool paused_ = true;
xe::threading::Fence resume_fence_; // Signaled when resume requested.
std::mutex driver_mutex_ = {};
xe::apu::AudioDriver* driver_ = nullptr;
// TODO: Remove it and replace with guest handles!
uint32_t next_playlist_handle_ = 0;
uint32_t next_song_handle_ = 0;
};
} // namespace apps