diff --git a/rpcs3/Emu/Cell/Modules/cellMusicDecode.cpp b/rpcs3/Emu/Cell/Modules/cellMusicDecode.cpp index ff391b97e2..fb26df73b0 100644 --- a/rpcs3/Emu/Cell/Modules/cellMusicDecode.cpp +++ b/rpcs3/Emu/Cell/Modules/cellMusicDecode.cpp @@ -90,6 +90,8 @@ enum CELL_MUSIC_DECODE_POSITION_END = 3, CELL_MUSIC_DECODE_POSITION_END_LIST_END = 4, + CELL_MUSIC_DECODE2_MODE_NORMAL = 0, + CELL_MUSIC_DECODE2_SPEED_MAX = 0, CELL_MUSIC_DECODE2_SPEED_2 = 2, @@ -214,7 +216,7 @@ error_code cell_music_decode_select_contents() template error_code cell_music_decode_read(vm::ptr buf, vm::ptr startTime, u64 reqSize, vm::ptr readSize, vm::ptr position) { - if (!buf || !startTime || !position || !readSize) + if (!buf || !startTime || !position || !reqSize || !readSize) return CELL_MUSIC_DECODE_ERROR_PARAM; auto& dec = g_fxo->get(); @@ -237,6 +239,7 @@ error_code cell_music_decode_read(vm::ptr buf, vm::ptr startTime, u64 } else if ((dec.readPos + reqSize) >= dec.decoder.m_size) { + // TODO: CELL_MUSIC_DECODE_POSITION_END *position = CELL_MUSIC_DECODE_POSITION_END_LIST_END; } else @@ -271,7 +274,12 @@ error_code cell_music_decode_read(vm::ptr buf, vm::ptr startTime, u64 error_code cellMusicDecodeInitialize(s32 mode, u32 container, s32 spuPriority, vm::ptr func, vm::ptr userData) { - cellMusicDecode.todo("cellMusicDecodeInitialize(mode=0x%x, container=0x%x, spuPriority=0x%x, func=*0x%x, userData=*0x%x)", mode, container, spuPriority, func, userData); + cellMusicDecode.warning("cellMusicDecodeInitialize(mode=0x%x, container=0x%x, spuPriority=0x%x, func=*0x%x, userData=*0x%x)", mode, container, spuPriority, func, userData); + + if (mode != CELL_MUSIC_DECODE2_MODE_NORMAL || (spuPriority - 0x10U > 0xef) || !func) + { + return CELL_MUSIC_DECODE_ERROR_PARAM; + } auto& dec = g_fxo->get(); std::lock_guard lock(dec.mutex); @@ -289,7 +297,12 @@ error_code cellMusicDecodeInitialize(s32 mode, u32 container, s32 spuPriority, v error_code cellMusicDecodeInitializeSystemWorkload(s32 mode, u32 container, vm::ptr func, vm::ptr userData, s32 spuUsageRate, vm::ptr spurs, vm::cptr priority, vm::cptr attr) { - cellMusicDecode.todo("cellMusicDecodeInitializeSystemWorkload(mode=0x%x, container=0x%x, func=*0x%x, userData=*0x%x, spuUsageRate=0x%x, spurs=*0x%x, priority=*0x%x, attr=*0x%x)", mode, container, func, userData, spuUsageRate, spurs, priority, attr); + cellMusicDecode.warning("cellMusicDecodeInitializeSystemWorkload(mode=0x%x, container=0x%x, func=*0x%x, userData=*0x%x, spuUsageRate=0x%x, spurs=*0x%x, priority=*0x%x, attr=*0x%x)", mode, container, func, userData, spuUsageRate, spurs, priority, attr); + + if (mode != CELL_MUSIC_DECODE2_MODE_NORMAL || !func || (spuUsageRate - 1U > 99) || !spurs || !priority) + { + return CELL_MUSIC_DECODE_ERROR_PARAM; + } auto& dec = g_fxo->get(); std::lock_guard lock(dec.mutex); @@ -334,7 +347,12 @@ error_code cellMusicDecodeSelectContents() error_code cellMusicDecodeSetDecodeCommand(s32 command) { - cellMusicDecode.todo("cellMusicDecodeSetDecodeCommand(command=0x%x)", command); + cellMusicDecode.warning("cellMusicDecodeSetDecodeCommand(command=0x%x)", command); + + if (command < CELL_MUSIC_DECODE_CMD_STOP || command > CELL_MUSIC_DECODE_CMD_PREV) + { + return CELL_MUSIC_DECODE_ERROR_PARAM; + } auto& dec = g_fxo->get(); std::lock_guard lock(dec.mutex); @@ -364,12 +382,13 @@ error_code cellMusicDecodeGetDecodeStatus(vm::ptr status) std::lock_guard lock(dec.mutex); *status = dec.decode_status; + cellMusicDecode.notice("cellMusicDecodeGetDecodeStatus: status=%d", *status); return CELL_OK; } error_code cellMusicDecodeRead(vm::ptr buf, vm::ptr startTime, u64 reqSize, vm::ptr readSize, vm::ptr position) { - cellMusicDecode.notice("cellMusicDecodeRead(buf=*0x%x, startTime=*0x%x, reqSize=0x%llx, readSize=*0x%x, position=*0x%x)", buf, startTime, reqSize, readSize, position); + cellMusicDecode.trace("cellMusicDecodeRead(buf=*0x%x, startTime=*0x%x, reqSize=0x%llx, readSize=*0x%x, position=*0x%x)", buf, startTime, reqSize, readSize, position); return cell_music_decode_read(buf, startTime, reqSize, readSize, position); } @@ -421,7 +440,7 @@ error_code cellMusicDecodeGetContentsId(vm::ptr contents_id cellMusicDecode.todo("cellMusicDecodeGetContentsId(contents_id=*0x%x)", contents_id); if (!contents_id) - return CELL_MUSIC_ERROR_PARAM; + return CELL_MUSIC_DECODE_ERROR_PARAM; // HACKY auto& dec = g_fxo->get(); @@ -431,10 +450,14 @@ error_code cellMusicDecodeGetContentsId(vm::ptr contents_id error_code cellMusicDecodeInitialize2(s32 mode, u32 container, s32 spuPriority, vm::ptr func, vm::ptr userData, s32 speed, s32 bufSize) { - cellMusicDecode.todo("cellMusicDecodeInitialize2(mode=0x%x, container=0x%x, spuPriority=0x%x, func=*0x%x, userData=*0x%x, speed=0x%x, bufSize=0x%x)", mode, container, spuPriority, func, userData, speed, bufSize); + cellMusicDecode.warning("cellMusicDecodeInitialize2(mode=0x%x, container=0x%x, spuPriority=0x%x, func=*0x%x, userData=*0x%x, speed=0x%x, bufSize=0x%x)", mode, container, spuPriority, func, userData, speed, bufSize); - if (bufSize < CELL_MUSIC_DECODE2_MIN_BUFFER_SIZE) + if (mode != CELL_MUSIC_DECODE2_MODE_NORMAL || (spuPriority - 0x10U > 0xef) || + bufSize < CELL_MUSIC_DECODE2_MIN_BUFFER_SIZE || !func || + (speed != CELL_MUSIC_DECODE2_SPEED_MAX && speed != CELL_MUSIC_DECODE2_SPEED_2)) + { return CELL_MUSIC_DECODE_ERROR_PARAM; + } auto& dec = g_fxo->get(); std::lock_guard lock(dec.mutex); @@ -453,10 +476,13 @@ error_code cellMusicDecodeInitialize2(s32 mode, u32 container, s32 spuPriority, error_code cellMusicDecodeInitialize2SystemWorkload(s32 mode, u32 container, vm::ptr func, vm::ptr userData, s32 spuUsageRate, s32 bufSize, vm::ptr spurs, vm::cptr priority, vm::cptr attr) { - cellMusicDecode.todo("cellMusicDecodeInitialize2SystemWorkload(mode=0x%x, container=0x%x, func=*0x%x, userData=*0x%x, spuUsageRate=0x%x, bufSize=0x%x, spurs=*0x%x, priority=*0x%x, attr=*0x%x)", mode, container, func, userData, spuUsageRate, bufSize, spurs, priority, attr); + cellMusicDecode.warning("cellMusicDecodeInitialize2SystemWorkload(mode=0x%x, container=0x%x, func=*0x%x, userData=*0x%x, spuUsageRate=0x%x, bufSize=0x%x, spurs=*0x%x, priority=*0x%x, attr=*0x%x)", mode, container, func, userData, spuUsageRate, bufSize, spurs, priority, attr); - if (bufSize < CELL_MUSIC_DECODE2_MIN_BUFFER_SIZE) + if (mode != CELL_MUSIC_DECODE2_MODE_NORMAL || !func || (spuUsageRate - 1U > 99) || + bufSize < CELL_MUSIC_DECODE2_MIN_BUFFER_SIZE || !spurs || !priority) + { return CELL_MUSIC_DECODE_ERROR_PARAM; + } auto& dec = g_fxo->get(); std::lock_guard lock(dec.mutex); @@ -501,7 +527,12 @@ error_code cellMusicDecodeSelectContents2() error_code cellMusicDecodeSetDecodeCommand2(s32 command) { - cellMusicDecode.todo("cellMusicDecodeSetDecodeCommand2(command=0x%x)", command); + cellMusicDecode.warning("cellMusicDecodeSetDecodeCommand2(command=0x%x)", command); + + if (command < CELL_MUSIC_DECODE_CMD_STOP || command > CELL_MUSIC_DECODE_CMD_PREV) + { + return CELL_MUSIC_DECODE_ERROR_PARAM; + } auto& dec = g_fxo->get(); std::lock_guard lock(dec.mutex); @@ -531,12 +562,13 @@ error_code cellMusicDecodeGetDecodeStatus2(vm::ptr status) std::lock_guard lock(dec.mutex); *status = dec.decode_status; + cellMusicDecode.notice("cellMusicDecodeGetDecodeStatus2: status=%d", *status); return CELL_OK; } error_code cellMusicDecodeRead2(vm::ptr buf, vm::ptr startTime, u64 reqSize, vm::ptr readSize, vm::ptr position) { - cellMusicDecode.notice("cellMusicDecodeRead2(buf=*0x%x, startTime=*0x%x, reqSize=0x%llx, readSize=*0x%x, position=*0x%x)", buf, startTime, reqSize, readSize, position); + cellMusicDecode.trace("cellMusicDecodeRead2(buf=*0x%x, startTime=*0x%x, reqSize=0x%llx, readSize=*0x%x, position=*0x%x)", buf, startTime, reqSize, readSize, position); return cell_music_decode_read(buf, startTime, reqSize, readSize, position); } @@ -560,6 +592,9 @@ error_code cellMusicDecodeSetSelectionContext2(vm::ptrget(); std::lock_guard lock(dec.mutex); @@ -585,7 +620,7 @@ error_code cellMusicDecodeGetContentsId2(vm::ptr contents_i cellMusicDecode.todo("cellMusicDecodeGetContentsId2(contents_id=*0x%x)", contents_id); if (!contents_id) - return CELL_MUSIC2_ERROR_PARAM; + return CELL_MUSIC_DECODE_ERROR_PARAM; // HACKY auto& dec = g_fxo->get();