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>();
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<CellSearchContentId> contents_id)
// HACKY
auto& music = g_fxo->get<music_state>();
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::ptr<CellMusic2Callba
auto& music = g_fxo->get<music_state>();
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::ptr<Ce
auto& music = g_fxo->get<music_state>();
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_state>();
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<CellMusicSelectionContext> cont
auto& music = g_fxo->get<music_state>();
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<void> 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<void> param)
@ -555,14 +581,21 @@ error_code cellMusicSetPlaybackCommand(s32 command, vm::ptr<void> 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::ptr<CellMusic2Cal
auto& music = g_fxo->get<music_state>();
music.func = func;
music.userData = userData;
music.current_selection_context = {};
sysutil_register_cb([=, &music](ppu_thread& ppu) -> s32
{

View File

@ -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<bool>::load(valid);
}
// Helper
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());
}
valid = true;
return true;
}