cellMusic: Implement some error checking

This commit is contained in:
Eladash 2022-09-08 17:53:49 +03:00 committed by Ivan
parent 4ac59875af
commit f076fcd539
3 changed files with 47 additions and 6 deletions

View file

@ -248,6 +248,11 @@ error_code cellMusicGetSelectionContext(vm::ptr<CellMusicSelectionContext> conte
auto& music = g_fxo->get<music_state>(); auto& music = g_fxo->get<music_state>();
std::lock_guard lock(music.mtx); std::lock_guard lock(music.mtx);
if (!music.current_selection_context)
{
return CELL_MUSIC2_ERROR_NO_ACTIVE_CONTENT;
}
*context = music.current_selection_context.get(); *context = music.current_selection_context.get();
cellMusic.success("cellMusicGetSelectionContext: selection context = %s", music.current_selection_context.to_string()); cellMusic.success("cellMusicGetSelectionContext: selection context = %s", music.current_selection_context.to_string());
@ -317,6 +322,12 @@ error_code cellMusicGetContentsId(vm::ptr<CellSearchContentId> contents_id)
// HACKY // HACKY
auto& music = g_fxo->get<music_state>(); auto& music = g_fxo->get<music_state>();
std::lock_guard lock(music.mtx); 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); return music.current_selection_context.find_content_id(contents_id);
} }
@ -363,6 +374,7 @@ error_code cellMusicInitialize2SystemWorkload(s32 mode, vm::ptr<CellMusic2Callba
auto& music = g_fxo->get<music_state>(); auto& music = g_fxo->get<music_state>();
music.func = func; music.func = func;
music.userData = userData; music.userData = userData;
music.current_selection_context = {};
sysutil_register_cb([=, &music](ppu_thread& ppu) -> s32 sysutil_register_cb([=, &music](ppu_thread& ppu) -> s32
{ {
@ -429,6 +441,7 @@ error_code cellMusicInitializeSystemWorkload(s32 mode, u32 container, vm::ptr<Ce
auto& music = g_fxo->get<music_state>(); auto& music = g_fxo->get<music_state>();
music.func = func; music.func = func;
music.userData = userData; music.userData = userData;
music.current_selection_context = {};
sysutil_register_cb([=, &music](ppu_thread& ppu) -> s32 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_state>(); auto& music = g_fxo->get<music_state>();
music.func = func; music.func = func;
music.userData = userData; music.userData = userData;
music.current_selection_context = {};
sysutil_register_cb([=, &music](ppu_thread& ppu) -> s32 sysutil_register_cb([=, &music](ppu_thread& ppu) -> s32
{ {
@ -489,6 +503,11 @@ error_code cellMusicGetSelectionContext2(vm::ptr<CellMusicSelectionContext> cont
auto& music = g_fxo->get<music_state>(); auto& music = g_fxo->get<music_state>();
std::lock_guard lock(music.mtx); std::lock_guard lock(music.mtx);
if (!music.current_selection_context)
{
return CELL_MUSIC2_ERROR_NO_ACTIVE_CONTENT;
}
*context = music.current_selection_context.get(); *context = music.current_selection_context.get();
cellMusic.success("cellMusicGetSelectionContext2: selection context = %s", music.current_selection_context.to_string()); cellMusic.success("cellMusicGetSelectionContext2: selection context = %s", music.current_selection_context.to_string());
@ -533,14 +552,21 @@ error_code cellMusicSetPlaybackCommand2(s32 command, vm::ptr<void> param)
if (!music.func) if (!music.func)
return CELL_MUSIC2_ERROR_GENERIC; 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); music.func(ppu, CELL_MUSIC2_EVENT_SET_PLAYBACK_COMMAND_RESULT, vm::addr_t(+result), music.userData);
return CELL_OK; return CELL_OK;
}); });
return CELL_OK; return result;
} }
error_code cellMusicSetPlaybackCommand(s32 command, vm::ptr<void> param) error_code cellMusicSetPlaybackCommand(s32 command, vm::ptr<void> param)
@ -555,14 +581,21 @@ error_code cellMusicSetPlaybackCommand(s32 command, vm::ptr<void> param)
if (!music.func) if (!music.func)
return CELL_MUSIC_ERROR_GENERIC; 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); music.func(ppu, CELL_MUSIC_EVENT_SET_PLAYBACK_COMMAND_RESULT, vm::addr_t(+result), music.userData);
return CELL_OK; return CELL_OK;
}); });
return CELL_OK; return result;
} }
error_code cellMusicSelectContents2() error_code cellMusicSelectContents2()
@ -591,6 +624,7 @@ error_code cellMusicInitialize2(s32 mode, s32 spuPriority, vm::ptr<CellMusic2Cal
auto& music = g_fxo->get<music_state>(); auto& music = g_fxo->get<music_state>();
music.func = func; music.func = func;
music.userData = userData; music.userData = userData;
music.current_selection_context = {};
sysutil_register_cb([=, &music](ppu_thread& ppu) -> s32 sysutil_register_cb([=, &music](ppu_thread& ppu) -> s32
{ {

View file

@ -141,6 +141,7 @@ struct CellMusicSelectionContext
struct music_selection_context struct music_selection_context
{ {
bool valid = false;
char magic[4] = "SUS"; char magic[4] = "SUS";
std::string hash; std::string hash;
CellSearchContentType content_type = CELL_SEARCH_CONTENTTYPE_MUSIC; CellSearchContentType content_type = CELL_SEARCH_CONTENTTYPE_MUSIC;
@ -167,6 +168,11 @@ struct music_selection_context
bool load_playlist(); bool load_playlist();
u32 step_track(bool next); u32 step_track(bool next);
operator bool() const
{
return atomic_storage<bool>::load(valid);
}
// Helper // Helper
error_code find_content_id(vm::ptr<CellSearchContentId> contents_id); error_code find_content_id(vm::ptr<CellSearchContentId> contents_id);
}; };

View file

@ -242,6 +242,7 @@ bool music_selection_context::load_playlist()
playlist.push_back(track_node[i].Scalar()); playlist.push_back(track_node[i].Scalar());
} }
valid = true;
return true; return true;
} }