diff --git a/rpcs3/Emu/Cell/Modules/cellMusic.cpp b/rpcs3/Emu/Cell/Modules/cellMusic.cpp index 3da1d60dc0..e6d38221b8 100644 --- a/rpcs3/Emu/Cell/Modules/cellMusic.cpp +++ b/rpcs3/Emu/Cell/Modules/cellMusic.cpp @@ -2,131 +2,287 @@ #include "Emu/System.h" #include "Emu/IdManager.h" #include "Emu/Cell/PPUModule.h" - -#include "cellMusic.h" +#include "Emu/Cell/lv2/sys_lwmutex.h" +#include "Emu/Cell/lv2/sys_lwcond.h" +#include "Emu/Cell/lv2/sys_spu.h" +#include "cellSearch.h" +#include "cellSpurs.h" #include "cellSysutil.h" - +#include "cellMusic.h" logs::channel cellMusic("cellMusic"); -struct music2_t +struct music_t { - vm::ptr func; + vm::ptr param, vm::ptr userData)> func; vm::ptr userData; }; -s32 cellMusicGetSelectionContext() +s32 cellMusicGetSelectionContext(vm::ptr context) { - UNIMPLEMENTED_FUNC(cellMusic); + cellMusic.todo("cellMusicGetSelectionContext(context=*0x%x)", context); return CELL_OK; } -s32 cellMusicSetSelectionContext2() +s32 cellMusicSetSelectionContext2(vm::ptr context) { - UNIMPLEMENTED_FUNC(cellMusic); + cellMusic.todo("cellMusicSetSelectionContext2(context=*0x%x)", context); + + const auto music = fxm::get_always(); + + if (!music->func) + return CELL_MUSIC2_ERROR_GENERIC; + + sysutil_register_cb([=](ppu_thread& ppu) -> s32 + { + music->func(ppu, CELL_MUSIC2_EVENT_SET_SELECTION_CONTEXT_RESULT, vm::addr_t(CELL_OK), music->userData); + return CELL_OK; + }); + return CELL_OK; } -s32 cellMusicSetVolume2() +s32 cellMusicSetVolume2(f32 level) { - UNIMPLEMENTED_FUNC(cellMusic); + cellMusic.todo("cellMusicSetVolume2(level=0x%x)", level); + + const auto music = fxm::get_always(); + + if (!music->func) + return CELL_MUSIC2_ERROR_GENERIC; + + sysutil_register_cb([=](ppu_thread& ppu) -> s32 + { + music->func(ppu, CELL_MUSIC2_EVENT_SET_VOLUME_RESULT, vm::addr_t(CELL_OK), music->userData); + return CELL_OK; + }); + return CELL_OK; } -s32 cellMusicGetContentsId() +s32 cellMusicGetContentsId(vm::ptr contents_id) { - UNIMPLEMENTED_FUNC(cellMusic); + cellMusic.todo("cellMusicGetContentsId(contents_id=*0x%x)", contents_id); return CELL_OK; } -s32 cellMusicSetSelectionContext() +s32 cellMusicSetSelectionContext(vm::ptr context) { - UNIMPLEMENTED_FUNC(cellMusic); + cellMusic.todo("cellMusicSetSelectionContext(context=*0x%x)", context); + + const auto music = fxm::get_always(); + + if (!music->func) + return CELL_MUSIC_ERROR_GENERIC; + + sysutil_register_cb([=](ppu_thread& ppu) -> s32 + { + music->func(ppu, CELL_MUSIC_EVENT_SET_SELECTION_CONTEXT_RESULT, vm::addr_t(CELL_OK), music->userData); + return CELL_OK; + }); + return CELL_OK; } -s32 cellMusicInitialize2SystemWorkload() +s32 cellMusicInitialize2SystemWorkload(s32 mode, vm::ptr func, vm::ptr userData, vm::ptr spurs, vm::cptr priority, vm::cptr attr) { - UNIMPLEMENTED_FUNC(cellMusic); + cellMusic.todo("cellMusicInitialize2SystemWorkload(mode=0x%x, func=*0x%x, userData=*0x%x, spurs=*0x%x, priority=*0x%x, attr=*0x%x)", mode, func, userData, spurs, priority, attr); + + const auto music = fxm::make_always(); + music->func = func; + music->userData = userData; + + sysutil_register_cb([=](ppu_thread& ppu) -> s32 + { + music->func(ppu, CELL_MUSIC2_EVENT_INITIALIZE_RESULT, vm::addr_t(CELL_OK), userData); + return CELL_OK; + }); + return CELL_OK; } -s32 cellMusicGetPlaybackStatus2() +s32 cellMusicGetPlaybackStatus2(vm::ptr status) { - UNIMPLEMENTED_FUNC(cellMusic); + cellMusic.todo("cellMusicGetPlaybackStatus2(status=*0x%x)", status); return CELL_OK; } -s32 cellMusicGetContentsId2() +s32 cellMusicGetContentsId2(vm::ptr contents_id) { - UNIMPLEMENTED_FUNC(cellMusic); + cellMusic.todo("cellMusicGetContentsId2(contents_id=*0x%x)", contents_id); return CELL_OK; } s32 cellMusicFinalize() { - UNIMPLEMENTED_FUNC(cellMusic); + cellMusic.todo("cellMusicFinalize()"); + + const auto music = fxm::get_always(); + + if (music->func) + { + sysutil_register_cb([=](ppu_thread& ppu) -> s32 + { + music->func(ppu, CELL_MUSIC_EVENT_FINALIZE_RESULT, vm::addr_t(CELL_OK), music->userData); + return CELL_OK; + }); + } + return CELL_OK; } -s32 cellMusicInitializeSystemWorkload() +s32 cellMusicInitializeSystemWorkload(s32 mode, u32 container, vm::ptr func, vm::ptr userData, vm::ptr spurs, vm::cptr priority, vm::cptr attr) { - UNIMPLEMENTED_FUNC(cellMusic); + cellMusic.todo("cellMusicInitializeSystemWorkload(mode=0x%x, container=0x%x, func=*0x%x, userData=*0x%x, spurs=*0x%x, priority=*0x%x, attr=*0x%x)", mode, container, func, userData, spurs, priority, attr); + + if (mode != CELL_MUSIC2_PLAYER_MODE_NORMAL) + { + cellMusic.todo("Unknown player mode: 0x%x", mode); + return CELL_MUSIC_ERROR_PARAM; + } + + const auto music = fxm::make_always(); + music->func = func; + music->userData = userData; + + sysutil_register_cb([=](ppu_thread& ppu) -> s32 + { + music->func(ppu, CELL_MUSIC_EVENT_INITIALIZE_RESULT, vm::addr_t(CELL_OK), userData); + return CELL_OK; + }); + return CELL_OK; } -s32 cellMusicInitialize() +s32 cellMusicInitialize(s32 mode, u32 container, s32 spuPriority, vm::ptr func, vm::ptr userData) { - UNIMPLEMENTED_FUNC(cellMusic); + cellMusic.todo("cellMusicInitialize(mode=0x%x, container=0x%x, spuPriority=0x%x, func=*0x%x, userData=*0x%x)", mode, container, spuPriority, func, userData); + + if (mode != CELL_MUSIC2_PLAYER_MODE_NORMAL) + { + cellMusic.todo("Unknown player mode: 0x%x", mode); + return CELL_MUSIC_ERROR_PARAM; + } + + const auto music = fxm::make_always(); + music->func = func; + music->userData = userData; + + sysutil_register_cb([=](ppu_thread& ppu) -> s32 + { + music->func(ppu, CELL_MUSIC_EVENT_INITIALIZE_RESULT, vm::addr_t(CELL_OK), userData); + return CELL_OK; + }); + return CELL_OK; } s32 cellMusicFinalize2() { - UNIMPLEMENTED_FUNC(cellMusic); + cellMusic.todo("cellMusicFinalize2()"); + + const auto music = fxm::get_always(); + + if (music->func) + { + sysutil_register_cb([=](ppu_thread& ppu) -> s32 + { + music->func(ppu, CELL_MUSIC2_EVENT_FINALIZE_RESULT, vm::addr_t(CELL_OK), music->userData); + return CELL_OK; + }); + } + return CELL_OK; } -s32 cellMusicGetSelectionContext2() +s32 cellMusicGetSelectionContext2(vm::ptr context) { - UNIMPLEMENTED_FUNC(cellMusic); + cellMusic.todo("cellMusicGetSelectionContext2(context=*0x%x)", context); return CELL_OK; } -s32 cellMusicGetVolume() +s32 cellMusicGetVolume(vm::ptr level) { - UNIMPLEMENTED_FUNC(cellMusic); + cellMusic.todo("cellMusicGetVolume(level=*0x%x)", level); return CELL_OK; } -s32 cellMusicGetPlaybackStatus() +s32 cellMusicGetPlaybackStatus(vm::ptr status) { - UNIMPLEMENTED_FUNC(cellMusic); + cellMusic.todo("cellMusicGetPlaybackStatus(status=*0x%x)", status); return CELL_OK; } -s32 cellMusicSetPlaybackCommand2() +s32 cellMusicSetPlaybackCommand2(s32 command, vm::ptr param) { - UNIMPLEMENTED_FUNC(cellMusic); + cellMusic.todo("cellMusicSetPlaybackCommand2(command=0x%x, param=*0x%x)", command, param); + + const auto music = fxm::get_always(); + + if (!music->func) + return CELL_MUSIC2_ERROR_GENERIC; + + sysutil_register_cb([=](ppu_thread& ppu) -> s32 + { + music->func(ppu, CELL_MUSIC2_EVENT_SET_PLAYBACK_COMMAND_RESULT, vm::addr_t(CELL_OK), music->userData); + return CELL_OK; + }); + return CELL_OK; } -s32 cellMusicSetPlaybackCommand() +s32 cellMusicSetPlaybackCommand(s32 command, vm::ptr param) { - UNIMPLEMENTED_FUNC(cellMusic); + cellMusic.todo("cellMusicSetPlaybackCommand(command=0x%x, param=*0x%x)", command, param); + + const auto music = fxm::get_always(); + + if (!music->func) + return CELL_MUSIC_ERROR_GENERIC; + + sysutil_register_cb([=](ppu_thread& ppu) -> s32 + { + music->func(ppu, CELL_MUSIC_EVENT_SET_PLAYBACK_COMMAND_RESULT, vm::addr_t(CELL_OK), music->userData); + return CELL_OK; + }); + return CELL_OK; } s32 cellMusicSelectContents2() { - UNIMPLEMENTED_FUNC(cellMusic); + cellMusic.todo("cellMusicSelectContents2()"); + + const auto music = fxm::get_always(); + + if (!music->func) + return CELL_MUSIC2_ERROR_GENERIC; + + sysutil_register_cb([=](ppu_thread& ppu) -> s32 + { + music->func(ppu, CELL_MUSIC2_EVENT_SELECT_CONTENTS_RESULT, vm::addr_t(CELL_OK), music->userData); + return CELL_OK; + }); + return CELL_OK; } -s32 cellMusicSelectContents() +s32 cellMusicSelectContents(u32 container) { - UNIMPLEMENTED_FUNC(cellMusic); + cellMusic.todo("cellMusicSelectContents(container=0x%x)", container); + + const auto music = fxm::get_always(); + + if (!music->func) + return CELL_MUSIC_ERROR_GENERIC; + + sysutil_register_cb([=](ppu_thread& ppu) -> s32 + { + music->func(ppu, CELL_MUSIC_EVENT_SELECT_CONTENTS_RESULT, vm::addr_t(CELL_OK), music->userData); + return CELL_OK; + }); + return CELL_OK; } @@ -140,28 +296,40 @@ s32 cellMusicInitialize2(s32 mode, s32 spuPriority, vm::ptr return CELL_MUSIC2_ERROR_PARAM; } - const auto music = fxm::make_always(); + const auto music = fxm::make_always(); music->func = func; music->userData = userData; sysutil_register_cb([=](ppu_thread& ppu) -> s32 { - func(ppu, CELL_MUSIC2_EVENT_INITIALIZE_RESULT, vm::make_var(CELL_OK), userData); + music->func(ppu, CELL_MUSIC2_EVENT_INITIALIZE_RESULT, vm::addr_t(CELL_OK), userData); return CELL_OK; }); return CELL_OK; } -s32 cellMusicSetVolume() +s32 cellMusicSetVolume(f32 level) { - UNIMPLEMENTED_FUNC(cellMusic); + cellMusic.todo("cellMusicSetVolume(level=0x%x)", level); + + const auto music = fxm::get_always(); + + if (!music->func) + return CELL_MUSIC_ERROR_GENERIC; + + sysutil_register_cb([=](ppu_thread& ppu) -> s32 + { + music->func(ppu, CELL_MUSIC_EVENT_SET_VOLUME_RESULT, vm::addr_t(CELL_OK), music->userData); + return CELL_OK; + }); + return CELL_OK; } -s32 cellMusicGetVolume2() +s32 cellMusicGetVolume2(vm::ptr level) { - UNIMPLEMENTED_FUNC(cellMusic); + cellMusic.todo("cellMusicGetVolume2(level=*0x%x)", level); return CELL_OK; } diff --git a/rpcs3/Emu/Cell/Modules/cellMusic.h b/rpcs3/Emu/Cell/Modules/cellMusic.h index 8ed707268c..19a7aab999 100644 --- a/rpcs3/Emu/Cell/Modules/cellMusic.h +++ b/rpcs3/Emu/Cell/Modules/cellMusic.h @@ -12,8 +12,8 @@ enum CELL_MUSIC_ERROR_PLAYBACK_FAILURE = 0x8002c107, CELL_MUSIC_ERROR_NO_MORE_CONTENT = 0x8002c108, CELL_MUSIC_DIALOG_OPEN = 0x8002c109, - CELL_MUSIC_DIALOG_CLOSE = 0x8002c10A, - CELL_MUSIC_ERROR_GENERIC = 0x8002c1FF, + CELL_MUSIC_DIALOG_CLOSE = 0x8002c10a, + CELL_MUSIC_ERROR_GENERIC = 0x8002c1ff, CELL_MUSIC2_PLAYBACK_FINISHED = CELL_MUSIC_PLAYBACK_FINISHED, CELL_MUSIC2_ERROR_PARAM = CELL_MUSIC_ERROR_PARAM, diff --git a/rpcs3/Emu/Cell/Modules/cellSearch.cpp b/rpcs3/Emu/Cell/Modules/cellSearch.cpp index 6ae255fb64..f27b7e3abe 100644 --- a/rpcs3/Emu/Cell/Modules/cellSearch.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSearch.cpp @@ -2,9 +2,10 @@ #include "Emu/System.h" #include "Emu/IdManager.h" #include "Emu/Cell/PPUModule.h" +#include "cellMusic.h" +#include "cellSysutil.h" #include "cellSearch.h" -#include "cellSysutil.h" logs::channel cellSearch("cellSearch"); diff --git a/rpcs3/Emu/Cell/Modules/cellSearch.h b/rpcs3/Emu/Cell/Modules/cellSearch.h index c7c04594a0..188c7f9dac 100644 --- a/rpcs3/Emu/Cell/Modules/cellSearch.h +++ b/rpcs3/Emu/Cell/Modules/cellSearch.h @@ -32,7 +32,6 @@ enum CELL_SEARCH_TITLE_LEN_MAX = 384, CELL_SEARCH_TAG_NUM_MAX = 6, CELL_SEARCH_TAG_LEN_MAX = 63, - CELL_MUSIC_SELECTION_CONTEXT_SIZE = 2048, CELL_SEARCH_PATH_LEN_MAX = 63, CELL_SEARCH_MTOPTION_LEN_MAX = 63, CELL_SEARCH_DEVELOPERDATA_LEN_MAX = 64, @@ -339,11 +338,6 @@ struct CellSearchVideoSceneInfo char tags[CELL_SEARCH_TAG_NUM_MAX][CELL_SEARCH_TAG_LEN_MAX]; }; -struct CellMusicSelectionContext -{ - char data[CELL_MUSIC_SELECTION_CONTEXT_SIZE]; -}; - struct CellSearchContentInfoPath { char contentPath[CELL_SEARCH_PATH_LEN_MAX + 1];