diff --git a/rpcs3/Emu/Cell/Modules/cellMusic.cpp b/rpcs3/Emu/Cell/Modules/cellMusic.cpp index 607e6ee02d..4fb4652fae 100644 --- a/rpcs3/Emu/Cell/Modules/cellMusic.cpp +++ b/rpcs3/Emu/Cell/Modules/cellMusic.cpp @@ -248,6 +248,11 @@ error_code cellMusicGetSelectionContext(vm::ptr conte auto& music = g_fxo->get(); std::lock_guard lock(music.mtx); + if (!music.current_selection_context) + { + return CELL_MUSIC2_ERROR_NO_ACTIVE_CONTENT; + } + *context = music.current_selection_context.get(); cellMusic.success("cellMusicGetSelectionContext: selection context = %s", music.current_selection_context.to_string()); @@ -317,6 +322,12 @@ error_code cellMusicGetContentsId(vm::ptr contents_id) // HACKY auto& music = g_fxo->get(); std::lock_guard lock(music.mtx); + + if (!music.current_selection_context) + { + return CELL_MUSIC2_ERROR_NO_ACTIVE_CONTENT; + } + return music.current_selection_context.find_content_id(contents_id); } @@ -363,6 +374,7 @@ error_code cellMusicInitialize2SystemWorkload(s32 mode, vm::ptrget(); music.func = func; music.userData = userData; + music.current_selection_context = {}; sysutil_register_cb([=, &music](ppu_thread& ppu) -> s32 { @@ -429,6 +441,7 @@ error_code cellMusicInitializeSystemWorkload(s32 mode, u32 container, vm::ptrget(); music.func = func; music.userData = userData; + music.current_selection_context = {}; sysutil_register_cb([=, &music](ppu_thread& ppu) -> s32 { @@ -451,6 +464,7 @@ error_code cellMusicInitialize(s32 mode, u32 container, s32 spuPriority, vm::ptr auto& music = g_fxo->get(); music.func = func; music.userData = userData; + music.current_selection_context = {}; sysutil_register_cb([=, &music](ppu_thread& ppu) -> s32 { @@ -489,6 +503,11 @@ error_code cellMusicGetSelectionContext2(vm::ptr cont auto& music = g_fxo->get(); std::lock_guard lock(music.mtx); + if (!music.current_selection_context) + { + return CELL_MUSIC2_ERROR_NO_ACTIVE_CONTENT; + } + *context = music.current_selection_context.get(); cellMusic.success("cellMusicGetSelectionContext2: selection context = %s", music.current_selection_context.to_string()); @@ -533,14 +552,21 @@ error_code cellMusicSetPlaybackCommand2(s32 command, vm::ptr param) if (!music.func) return CELL_MUSIC2_ERROR_GENERIC; - sysutil_register_cb([=, &music](ppu_thread& ppu) -> s32 + error_code result = CELL_OK; + + if (!music.current_selection_context) { - const error_code result = music.set_playback_command(command); + result = CELL_MUSIC_ERROR_GENERIC; + } + + sysutil_register_cb([=, &music, prev_res = result](ppu_thread& ppu) -> s32 + { + const error_code result = prev_res ? prev_res : music.set_playback_command(command); music.func(ppu, CELL_MUSIC2_EVENT_SET_PLAYBACK_COMMAND_RESULT, vm::addr_t(+result), music.userData); return CELL_OK; }); - return CELL_OK; + return result; } error_code cellMusicSetPlaybackCommand(s32 command, vm::ptr param) @@ -555,14 +581,21 @@ error_code cellMusicSetPlaybackCommand(s32 command, vm::ptr param) if (!music.func) return CELL_MUSIC_ERROR_GENERIC; - sysutil_register_cb([=, &music](ppu_thread& ppu) -> s32 + error_code result = CELL_OK; + + if (!music.current_selection_context) { - const error_code result = music.set_playback_command(command); + result = CELL_MUSIC2_ERROR_GENERIC; + } + + sysutil_register_cb([=, &music, prev_res = result](ppu_thread& ppu) -> s32 + { + const error_code result = prev_res ? prev_res : music.set_playback_command(command); music.func(ppu, CELL_MUSIC_EVENT_SET_PLAYBACK_COMMAND_RESULT, vm::addr_t(+result), music.userData); return CELL_OK; }); - return CELL_OK; + return result; } error_code cellMusicSelectContents2() @@ -591,6 +624,7 @@ error_code cellMusicInitialize2(s32 mode, s32 spuPriority, vm::ptrget(); music.func = func; music.userData = userData; + music.current_selection_context = {}; sysutil_register_cb([=, &music](ppu_thread& ppu) -> s32 { diff --git a/rpcs3/Emu/Cell/Modules/cellMusic.h b/rpcs3/Emu/Cell/Modules/cellMusic.h index 625b4768c3..d1cc13a08f 100644 --- a/rpcs3/Emu/Cell/Modules/cellMusic.h +++ b/rpcs3/Emu/Cell/Modules/cellMusic.h @@ -141,6 +141,7 @@ struct CellMusicSelectionContext struct music_selection_context { + bool valid = false; char magic[4] = "SUS"; std::string hash; CellSearchContentType content_type = CELL_SEARCH_CONTENTTYPE_MUSIC; @@ -167,6 +168,11 @@ struct music_selection_context bool load_playlist(); u32 step_track(bool next); + operator bool() const + { + return atomic_storage::load(valid); + } + // Helper error_code find_content_id(vm::ptr contents_id); }; diff --git a/rpcs3/Emu/Cell/Modules/cellMusicSelectionContext.cpp b/rpcs3/Emu/Cell/Modules/cellMusicSelectionContext.cpp index 3b83641434..7fdd80b9c1 100644 --- a/rpcs3/Emu/Cell/Modules/cellMusicSelectionContext.cpp +++ b/rpcs3/Emu/Cell/Modules/cellMusicSelectionContext.cpp @@ -242,6 +242,7 @@ bool music_selection_context::load_playlist() playlist.push_back(track_node[i].Scalar()); } + valid = true; return true; }