diff --git a/rpcs3/Emu/SysCalls/ModuleManager.cpp b/rpcs3/Emu/SysCalls/ModuleManager.cpp index ce1a2f5925..6dfa86ade5 100644 --- a/rpcs3/Emu/SysCalls/ModuleManager.cpp +++ b/rpcs3/Emu/SysCalls/ModuleManager.cpp @@ -4,6 +4,7 @@ extern Module cellAdec; extern Module cellAtrac; +extern Module cellAtracMulti; extern Module cellAudio; extern Module cellAvconfExt; extern Module cellCamera; @@ -19,7 +20,6 @@ extern Module cellGifDec; extern Module cellJpgDec; extern Module cellL10n; extern Module cellMic; -extern Module cellSysutil; extern Module cellNetCtl; extern Module cellOvis; extern Module cellPamf; @@ -30,7 +30,6 @@ extern Module cellRudp; extern Module cellSail; extern Module cellScreenshot; extern Module cellSearch; -extern Module cellSysutil; extern Module cellSpurs; extern Module cellSpursJq; extern Module cellSubdisplay; @@ -166,7 +165,7 @@ static const g_module_list[] = { 0xf034, "cellSailRec", nullptr }, { 0xf035, "sceNpTrophy", &sceNpTrophy }, { 0xf053, "cellAdecAt3multi", nullptr }, - { 0xf054, "cellLibatrac3multi", nullptr }, + { 0xf054, "cellAtracMulti", &cellAtracMulti }, { -1, "cellSysmodule", &cellSysmodule }, { -1, "libmixer", &libmixer }, diff --git a/rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp b/rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp index f3553f463f..590ba0145b 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp @@ -3,8 +3,6 @@ #include "Emu/System.h" #include "Emu/SysCalls/Modules.h" -extern Module cellAtrac; - #include "cellAtrac.h" s32 cellAtracSetDataAndGetMemSize(vm::ptr pHandle, vm::ptr pucBufferAddr, u32 uiReadByte, u32 uiBufferByte, vm::ptr puiWorkMemByte) diff --git a/rpcs3/Emu/SysCalls/Modules/cellAtrac.h b/rpcs3/Emu/SysCalls/Modules/cellAtrac.h index 639afbc122..3df525aaa5 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAtrac.h +++ b/rpcs3/Emu/SysCalls/Modules/cellAtrac.h @@ -28,32 +28,6 @@ enum CELL_ATRAC_ERROR_ILLEGAL_SPU_THREAD_PRIORITY = 0x80610382, }; -enum -{ - CELL_ATRACMULTI_ERROR_API_FAIL = 0x80610b01, - CELL_ATRACMULTI_ERROR_READSIZE_OVER_BUFFER = 0x80610b11, - CELL_ATRACMULTI_ERROR_UNKNOWN_FORMAT = 0x80610b12, - CELL_ATRACMULTI_ERROR_READSIZE_IS_TOO_SMALL = 0x80610b13, - CELL_ATRACMULTI_ERROR_ILLEGAL_SAMPLING_RATE = 0x80610b14, - CELL_ATRACMULTI_ERROR_ILLEGAL_DATA = 0x80610b15, - CELL_ATRACMULTI_ERROR_NO_DECODER = 0x80610b21, - CELL_ATRACMULTI_ERROR_UNSET_DATA = 0x80610b22, - CELL_ATRACMULTI_ERROR_DECODER_WAS_CREATED = 0x80610b23, - CELL_ATRACMULTI_ERROR_ALLDATA_WAS_DECODED = 0x80610b31, - CELL_ATRACMULTI_ERROR_NODATA_IN_BUFFER = 0x80610b32, - CELL_ATRACMULTI_ERROR_NOT_ALIGNED_OUT_BUFFER = 0x80610b33, - CELL_ATRACMULTI_ERROR_NEED_SECOND_BUFFER = 0x80610b34, - CELL_ATRACMULTI_ERROR_ALLDATA_IS_ONMEMORY = 0x80610b41, - CELL_ATRACMULTI_ERROR_ADD_DATA_IS_TOO_BIG = 0x80610b42, - CELL_ATRACMULTI_ERROR_NONEED_SECOND_BUFFER = 0x80610b51, - CELL_ATRACMULTI_ERROR_UNSET_LOOP_NUM = 0x80610b61, - CELL_ATRACMULTI_ERROR_ILLEGAL_SAMPLE = 0x80610b71, - CELL_ATRACMULTI_ERROR_ILLEGAL_RESET_BYTE = 0x80610b72, - CELL_ATRACMULTI_ERROR_ILLEGAL_PPU_THREAD_PRIORITY = 0x80610b81, - CELL_ATRACMULTI_ERROR_ILLEGAL_SPU_THREAD_PRIORITY = 0x80610b82, - CELL_ATRACMULTI_ERROR_API_PARAMETER = 0x80610b91, -}; - // Remain Frame enum : s32 { @@ -62,7 +36,7 @@ enum : s32 CELL_ATRAC_LOOP_STREAM_DATA_IS_ON_MEMORY = -3, }; -union CellAtracHandle +struct set_alignment(8) CellAtracHandle { vm::ptr pucWorkMem; // ... @@ -83,3 +57,5 @@ struct CellAtracExtRes vm::ptr pSpurs; u8 priority[8]; }; + +extern Module cellAtrac; diff --git a/rpcs3/Emu/SysCalls/Modules/cellAtracMulti.cpp b/rpcs3/Emu/SysCalls/Modules/cellAtracMulti.cpp new file mode 100644 index 0000000000..cc3bc9a2e5 --- /dev/null +++ b/rpcs3/Emu/SysCalls/Modules/cellAtracMulti.cpp @@ -0,0 +1,238 @@ +#include "stdafx.h" +#include "Emu/Memory/Memory.h" +#include "Emu/System.h" +#include "Emu/SysCalls/Modules.h" + +#include "cellAtracMulti.h" + +s32 cellAtracMultiSetDataAndGetMemSize(vm::ptr pHandle, vm::ptr pucBufferAddr, u32 uiReadByte, u32 uiBufferByte, u32 uiOutputChNum, vm::ptr piTrackArray, vm::ptr puiWorkMemByte) +{ + cellAtracMulti.Warning("cellAtracMultiSetDataAndGetMemSize(pHandle=*0x%x, pucBufferAddr=*0x%x, uiReadByte=0x%x, uiBufferByte=0x%x, uiOutputChNum=%d, piTrackArray=*0x%x, puiWorkMemByte=*0x%x)", + pHandle, pucBufferAddr, uiReadByte, uiBufferByte, uiOutputChNum, piTrackArray, puiWorkMemByte); + + *puiWorkMemByte = 0x1000; + return CELL_OK; +} + +s32 cellAtracMultiCreateDecoder(vm::ptr pHandle, vm::ptr pucWorkMem, u32 uiPpuThreadPriority, u32 uiSpuThreadPriority) +{ + cellAtracMulti.Warning("cellAtracMultiCreateDecoder(pHandle=*0x%x, pucWorkMem=*0x%x, uiPpuThreadPriority=%d, uiSpuThreadPriority=%d)", pHandle, pucWorkMem, uiPpuThreadPriority, uiSpuThreadPriority); + + pHandle->pucWorkMem = pucWorkMem; + return CELL_OK; +} + +s32 cellAtracMultiCreateDecoderExt(vm::ptr pHandle, vm::ptr pucWorkMem, u32 uiPpuThreadPriority, vm::ptr pExtRes) +{ + cellAtracMulti.Warning("cellAtracMultiCreateDecoderExt(pHandle=*0x%x, pucWorkMem=*0x%x, uiPpuThreadPriority=%d, pExtRes=*0x%x)", pHandle, pucWorkMem, uiPpuThreadPriority, pExtRes); + + pHandle->pucWorkMem = pucWorkMem; + return CELL_OK; +} + +s32 cellAtracMultiDeleteDecoder(vm::ptr pHandle) +{ + cellAtracMulti.Warning("cellAtracMultiDeleteDecoder(pHandle=*0x%x)", pHandle); + + return CELL_OK; +} + +s32 cellAtracMultiDecode(vm::ptr pHandle, vm::ptr pfOutAddr, vm::ptr puiSamples, vm::ptr puiFinishflag, vm::ptr piRemainFrame) +{ + cellAtracMulti.Warning("cellAtracMultiDecode(pHandle=*0x%x, pfOutAddr=*0x%x, puiSamples=*0x%x, puiFinishFlag=*0x%x, piRemainFrame=*0x%x)", pHandle, pfOutAddr, puiSamples, puiFinishflag, piRemainFrame); + + *puiSamples = 0; + *puiFinishflag = 1; + *piRemainFrame = CELL_ATRACMULTI_ALLDATA_IS_ON_MEMORY; + return CELL_OK; +} + +s32 cellAtracMultiGetStreamDataInfo(vm::ptr pHandle, vm::pptr ppucWritePointer, vm::ptr puiWritableByte, vm::ptr puiReadPosition) +{ + cellAtracMulti.Warning("cellAtracMultiGetStreamDataInfo(pHandle=*0x%x, ppucWritePointer=**0x%x, puiWritableByte=*0x%x, puiReadPosition=*0x%x)", pHandle, ppucWritePointer, puiWritableByte, puiReadPosition); + + *ppucWritePointer = pHandle->pucWorkMem; + *puiWritableByte = 0x1000; + *puiReadPosition = 0; + return CELL_OK; +} + +s32 cellAtracMultiAddStreamData(vm::ptr pHandle, u32 uiAddByte) +{ + cellAtracMulti.Warning("cellAtracMultiAddStreamData(pHandle=*0x%x, uiAddByte=0x%x)", pHandle, uiAddByte); + + return CELL_OK; +} + +s32 cellAtracMultiGetRemainFrame(vm::ptr pHandle, vm::ptr piRemainFrame) +{ + cellAtracMulti.Warning("cellAtracMultiGetRemainFrame(pHandle=*0x%x, piRemainFrame=*0x%x)", pHandle, piRemainFrame); + + *piRemainFrame = CELL_ATRACMULTI_ALLDATA_IS_ON_MEMORY; + return CELL_OK; +} + +s32 cellAtracMultiGetVacantSize(vm::ptr pHandle, vm::ptr puiVacantSize) +{ + cellAtracMulti.Warning("cellAtracMultiGetVacantSize(pHandle=*0x%x, puiVacantSize=*0x%x)", pHandle, puiVacantSize); + + *puiVacantSize = 0x1000; + return CELL_OK; +} + +s32 cellAtracMultiIsSecondBufferNeeded(vm::ptr pHandle) +{ + cellAtracMulti.Warning("cellAtracMultiIsSecondBufferNeeded(pHandle=*0x%x)", pHandle); + + return 0; +} + +s32 cellAtracMultiGetSecondBufferInfo(vm::ptr pHandle, vm::ptr puiReadPosition, vm::ptr puiDataByte) +{ + cellAtracMulti.Warning("cellAtracMultiGetSecondBufferInfo(pHandle=*0x%x, puiReadPosition=*0x%x, puiDataByte=*0x%x)", pHandle, puiReadPosition, puiDataByte); + + *puiReadPosition = 0; + *puiDataByte = 0; // write to null block will occur + return CELL_OK; +} + +s32 cellAtracMultiSetSecondBuffer(vm::ptr pHandle, vm::ptr pucSecondBufferAddr, u32 uiSecondBufferByte) +{ + cellAtracMulti.Warning("cellAtracMultiSetSecondBuffer(pHandle=*0x%x, pucSecondBufferAddr=*0x%x, uiSecondBufferByte=0x%x)", pHandle, pucSecondBufferAddr, uiSecondBufferByte); + + return CELL_OK; +} + +s32 cellAtracMultiGetChannel(vm::ptr pHandle, vm::ptr puiChannel) +{ + cellAtracMulti.Warning("cellAtracMultiGetChannel(pHandle=*0x%x, puiChannel=*0x%x)", pHandle, puiChannel); + + *puiChannel = 2; + return CELL_OK; +} + +s32 cellAtracMultiGetMaxSample(vm::ptr pHandle, vm::ptr puiMaxSample) +{ + cellAtracMulti.Warning("cellAtracMultiGetMaxSample(pHandle=*0x%x, puiMaxSample=*0x%x)", pHandle, puiMaxSample); + + *puiMaxSample = 512; + return CELL_OK; +} + +s32 cellAtracMultiGetNextSample(vm::ptr pHandle, vm::ptr puiNextSample) +{ + cellAtracMulti.Warning("cellAtracMultiGetNextSample(pHandle=*0x%x, puiNextSample=*0x%x)", pHandle, puiNextSample); + + *puiNextSample = 0; + return CELL_OK; +} + +s32 cellAtracMultiGetSoundInfo(vm::ptr pHandle, vm::ptr piEndSample, vm::ptr piLoopStartSample, vm::ptr piLoopEndSample) +{ + cellAtracMulti.Warning("cellAtracMultiGetSoundInfo(pHandle=*0x%x, piEndSample=*0x%x, piLoopStartSample=*0x%x, piLoopEndSample=*0x%x)", pHandle, piEndSample, piLoopStartSample, piLoopEndSample); + + *piEndSample = 0; + *piLoopStartSample = 0; + *piLoopEndSample = 0; + return CELL_OK; +} + +s32 cellAtracMultiGetNextDecodePosition(vm::ptr pHandle, vm::ptr puiSamplePosition) +{ + cellAtracMulti.Warning("cellAtracMultiGetNextDecodePosition(pHandle=*0x%x, puiSamplePosition=*0x%x)", pHandle, puiSamplePosition); + + *puiSamplePosition = 0; + return CELL_ATRACMULTI_ERROR_ALLDATA_WAS_DECODED; +} + +s32 cellAtracMultiGetBitrate(vm::ptr pHandle, vm::ptr puiBitrate) +{ + cellAtracMulti.Warning("cellAtracMultiGetBitrate(pHandle=*0x%x, puiBitrate=*0x%x)", pHandle, puiBitrate); + + *puiBitrate = 128; + return CELL_OK; +} + +s32 cellAtracMultiGetTrackArray(vm::ptr pHandle, vm::ptr piTrackArray) +{ + cellAtracMulti.Error("cellAtracMultiGetTrackArray(pHandle=*0x%x, piTrackArray=*0x%x)", pHandle, piTrackArray); + + return CELL_OK; +} + +s32 cellAtracMultiGetLoopInfo(vm::ptr pHandle, vm::ptr piLoopNum, vm::ptr puiLoopStatus) +{ + cellAtracMulti.Warning("cellAtracMultiGetLoopInfo(pHandle=*0x%x, piLoopNum=*0x%x, puiLoopStatus=*0x%x)", pHandle, piLoopNum, puiLoopStatus); + + *piLoopNum = 0; + *puiLoopStatus = 0; + return CELL_OK; +} + +s32 cellAtracMultiSetLoopNum(vm::ptr pHandle, s32 iLoopNum) +{ + cellAtracMulti.Warning("cellAtracMultiSetLoopNum(pHandle=*0x%x, iLoopNum=%d)", pHandle, iLoopNum); + + return CELL_OK; +} + +s32 cellAtracMultiGetBufferInfoForResetting(vm::ptr pHandle, u32 uiSample, vm::ptr pBufferInfo) +{ + cellAtracMulti.Warning("cellAtracMultiGetBufferInfoForResetting(pHandle=*0x%x, uiSample=0x%x, pBufferInfo=*0x%x)", pHandle, uiSample, pBufferInfo); + + pBufferInfo->pucWriteAddr = pHandle->pucWorkMem; + pBufferInfo->uiWritableByte = 0x1000; + pBufferInfo->uiMinWriteByte = 0; + pBufferInfo->uiReadPosition = 0; + return CELL_OK; +} + +s32 cellAtracMultiResetPlayPosition(vm::ptr pHandle, u32 uiSample, u32 uiWriteByte, vm::ptr piTrackArray) +{ + cellAtracMulti.Warning("cellAtracMultiResetPlayPosition(pHandle=*0x%x, uiSample=0x%x, uiWriteByte=0x%x, piTrackArray=*0x%x)", pHandle, uiSample, uiWriteByte, piTrackArray); + + return CELL_OK; +} + +s32 cellAtracMultiGetInternalErrorInfo(vm::ptr pHandle, vm::ptr piResult) +{ + cellAtracMulti.Warning("cellAtracMultiGetInternalErrorInfo(pHandle=*0x%x, piResult=*0x%x)", pHandle, piResult); + + *piResult = 0; + return CELL_OK; +} + +Module cellAtracMulti("cellAtrac", []() +{ + REG_FUNC(cellAtracMulti, cellAtracMultiSetDataAndGetMemSize); + + REG_FUNC(cellAtracMulti, cellAtracMultiCreateDecoder); + REG_FUNC(cellAtracMulti, cellAtracMultiCreateDecoderExt); + REG_FUNC(cellAtracMulti, cellAtracMultiDeleteDecoder); + + REG_FUNC(cellAtracMulti, cellAtracMultiDecode); + + REG_FUNC(cellAtracMulti, cellAtracMultiGetStreamDataInfo); + REG_FUNC(cellAtracMulti, cellAtracMultiAddStreamData); + REG_FUNC(cellAtracMulti, cellAtracMultiGetRemainFrame); + REG_FUNC(cellAtracMulti, cellAtracMultiGetVacantSize); + REG_FUNC(cellAtracMulti, cellAtracMultiIsSecondBufferNeeded); + REG_FUNC(cellAtracMulti, cellAtracMultiGetSecondBufferInfo); + REG_FUNC(cellAtracMulti, cellAtracMultiSetSecondBuffer); + + REG_FUNC(cellAtracMulti, cellAtracMultiGetChannel); + REG_FUNC(cellAtracMulti, cellAtracMultiGetMaxSample); + REG_FUNC(cellAtracMulti, cellAtracMultiGetNextSample); + REG_FUNC(cellAtracMulti, cellAtracMultiGetSoundInfo); + REG_FUNC(cellAtracMulti, cellAtracMultiGetNextDecodePosition); + REG_FUNC(cellAtracMulti, cellAtracMultiGetBitrate); + REG_FUNC(cellAtracMulti, cellAtracMultiGetTrackArray); + + REG_FUNC(cellAtracMulti, cellAtracMultiGetLoopInfo); + REG_FUNC(cellAtracMulti, cellAtracMultiSetLoopNum); + + REG_FUNC(cellAtracMulti, cellAtracMultiGetBufferInfoForResetting); + REG_FUNC(cellAtracMulti, cellAtracMultiResetPlayPosition); + + REG_FUNC(cellAtracMulti, cellAtracMultiGetInternalErrorInfo); +}); diff --git a/rpcs3/Emu/SysCalls/Modules/cellAtracMulti.h b/rpcs3/Emu/SysCalls/Modules/cellAtracMulti.h new file mode 100644 index 0000000000..1577e98fc6 --- /dev/null +++ b/rpcs3/Emu/SysCalls/Modules/cellAtracMulti.h @@ -0,0 +1,62 @@ +#pragma once + +namespace vm { using namespace ps3; } + +// Return Codes +enum +{ + CELL_ATRACMULTI_ERROR_API_FAIL = 0x80610b01, + CELL_ATRACMULTI_ERROR_READSIZE_OVER_BUFFER = 0x80610b11, + CELL_ATRACMULTI_ERROR_UNKNOWN_FORMAT = 0x80610b12, + CELL_ATRACMULTI_ERROR_READSIZE_IS_TOO_SMALL = 0x80610b13, + CELL_ATRACMULTI_ERROR_ILLEGAL_SAMPLING_RATE = 0x80610b14, + CELL_ATRACMULTI_ERROR_ILLEGAL_DATA = 0x80610b15, + CELL_ATRACMULTI_ERROR_NO_DECODER = 0x80610b21, + CELL_ATRACMULTI_ERROR_UNSET_DATA = 0x80610b22, + CELL_ATRACMULTI_ERROR_DECODER_WAS_CREATED = 0x80610b23, + CELL_ATRACMULTI_ERROR_ALLDATA_WAS_DECODED = 0x80610b31, + CELL_ATRACMULTI_ERROR_NODATA_IN_BUFFER = 0x80610b32, + CELL_ATRACMULTI_ERROR_NOT_ALIGNED_OUT_BUFFER = 0x80610b33, + CELL_ATRACMULTI_ERROR_NEED_SECOND_BUFFER = 0x80610b34, + CELL_ATRACMULTI_ERROR_ALLDATA_IS_ONMEMORY = 0x80610b41, + CELL_ATRACMULTI_ERROR_ADD_DATA_IS_TOO_BIG = 0x80610b42, + CELL_ATRACMULTI_ERROR_NONEED_SECOND_BUFFER = 0x80610b51, + CELL_ATRACMULTI_ERROR_UNSET_LOOP_NUM = 0x80610b61, + CELL_ATRACMULTI_ERROR_ILLEGAL_SAMPLE = 0x80610b71, + CELL_ATRACMULTI_ERROR_ILLEGAL_RESET_BYTE = 0x80610b72, + CELL_ATRACMULTI_ERROR_ILLEGAL_PPU_THREAD_PRIORITY = 0x80610b81, + CELL_ATRACMULTI_ERROR_ILLEGAL_SPU_THREAD_PRIORITY = 0x80610b82, + CELL_ATRACMULTI_ERROR_API_PARAMETER = 0x80610b91, +}; + +// Remain Frame +enum : s32 +{ + CELL_ATRACMULTI_ALLDATA_IS_ON_MEMORY = -1, + CELL_ATRACMULTI_NONLOOP_STREAM_DATA_IS_ON_MEMORY = -2, + CELL_ATRACMULTI_LOOP_STREAM_DATA_IS_ON_MEMORY = -3, +}; + +struct set_alignment(8) CellAtracMultiHandle +{ + vm::ptr pucWorkMem; + // ... +}; + +CHECK_MAX_SIZE(CellAtracMultiHandle, 512); + +struct CellAtracMultiBufferInfo +{ + vm::ptr pucWriteAddr; + be_t uiWritableByte; + be_t uiMinWriteByte; + be_t uiReadPosition; +}; + +struct CellAtracMultiExtRes +{ + vm::ptr pSpurs; + u8 priority[8]; +}; + +extern Module cellAtracMulti; diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index 2542c6a4e7..968333c7e9 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -44,6 +44,7 @@ + @@ -524,6 +525,7 @@ + diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index f00fc35ec6..4002a65304 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -884,6 +884,9 @@ Utilities + + Emu\SysCalls\Modules + @@ -1738,5 +1741,8 @@ Utilities + + Emu\SysCalls\Modules + \ No newline at end of file