diff --git a/ajm_error.inc b/ajm_error.inc new file mode 100644 index 00000000..046c263b --- /dev/null +++ b/ajm_error.inc @@ -0,0 +1,41 @@ + +const + SCE_AJM_ERROR_UNKNOWN =-2137849855; // 0x80930001 + SCE_AJM_ERROR_INVALID_CONTEXT =-2137849854; // 0x80930002 + SCE_AJM_ERROR_INVALID_INSTANCE =-2137849853; // 0x80930003 + SCE_AJM_ERROR_INVALID_BATCH =-2137849852; // 0x80930004 + SCE_AJM_ERROR_INVALID_PARAMETER =-2137849851; // 0x80930005 + SCE_AJM_ERROR_OUT_OF_MEMORY =-2137849850; // 0x80930006 + SCE_AJM_ERROR_OUT_OF_RESOURCES =-2137849849; // 0x80930007 + SCE_AJM_ERROR_CODEC_NOT_SUPPORTED =-2137849848; // 0x80930008 + SCE_AJM_ERROR_CODEC_ALREADY_REGISTERED =-2137849847; // 0x80930009 + SCE_AJM_ERROR_CODEC_NOT_REGISTERED =-2137849846; // 0x8093000A + SCE_AJM_ERROR_WRONG_REVISION_FLAG =-2137849845; // 0x8093000B + SCE_AJM_ERROR_FLAG_NOT_SUPPORTED =-2137849844; // 0x8093000C + SCE_AJM_ERROR_BUSY =-2137849843; // 0x8093000D + SCE_AJM_ERROR_BAD_PRIORITY =-2137849842; // 0x8093000E + SCE_AJM_ERROR_IN_PROGRESS =-2137849841; // 0x8093000F + SCE_AJM_ERROR_RETRY =-2137849840; // 0x80930010 + SCE_AJM_ERROR_MALFORMED_BATCH =-2137849839; // 0x80930011 + SCE_AJM_ERROR_JOB_CREATION =-2137849838; // 0x80930012 + SCE_AJM_ERROR_INVALID_OPCODE =-2137849837; // 0x80930013 + SCE_AJM_ERROR_PRIORITY_VIOLATION =-2137849836; // 0x80930014 + SCE_AJM_ERROR_BUFFER_TOO_BIG =-2137849835; // 0x80930015 + SCE_AJM_ERROR_INVALID_ADDRESS =-2137849834; // 0x80930016 + SCE_AJM_ERROR_CANCELLED =-2137849833; // 0x80930017 + + + SCE_AJM_RESULT_NOT_INITIALIZED =$00000001; + SCE_AJM_RESULT_INVALID_DATA =$00000002; + SCE_AJM_RESULT_INVALID_PARAMETER =$00000004; + SCE_AJM_RESULT_PARTIAL_INPUT =$00000008; + SCE_AJM_RESULT_NOT_ENOUGH_ROOM =$00000010; + SCE_AJM_RESULT_STREAM_CHANGE =$00000020; + SCE_AJM_RESULT_TOO_MANY_CHANNELS =$00000040; + SCE_AJM_RESULT_UNSUPPORTED_FLAG =$00000080; + SCE_AJM_RESULT_SIDEBAND_TRUNCATED =$00000100; + SCE_AJM_RESULT_PRIORITY_PASSED =$00000200; + SCE_AJM_RESULT_FATAL =$80000000; + SCE_AJM_RESULT_CODEC_ERROR =$40000000; + + diff --git a/fpPS4.lpr b/fpPS4.lpr index f5c96448..614fe8a3 100644 --- a/fpPS4.lpr +++ b/fpPS4.lpr @@ -12,6 +12,7 @@ uses sys_types, sys_pthread, ps4libdoc, + ps4_libSceAjm, ps4_libSceIme, ps4_libScePlayGo, ps4_libSceDiscMap, diff --git a/ps4_libsceajm.pas b/ps4_libsceajm.pas new file mode 100644 index 00000000..d28e58b0 --- /dev/null +++ b/ps4_libsceajm.pas @@ -0,0 +1,274 @@ +unit ps4_libSceAjm; + +{$mode objfpc}{$H+} + +interface + +uses + ps4_program, + ps4_handles, + Classes, + SysUtils; + +implementation + +{$I ajm_error.inc} + +const + SCE_AJM_CODEC_MP3_DEC =0; + SCE_AJM_CODEC_AT9_DEC =1; + SCE_AJM_CODEC_M4AAC_DEC=2; + SCE_AJM_CODEC_CELP8_DEC=3; + SCE_AJM_CODEC_CELP8_ENC=4; + SCE_AJM_CODEC_CELP_DEC =12; + SCE_AJM_CODEC_CELP_ENC =13; + +var + FAjmMap:TIntegerHandles; + +type + PSceAjmContextId=^SceAjmContextId; + SceAjmContextId=Integer; + SceAjmCodecType=Integer; + + TAjmContext=class(TClassHandle) + AJM_CODEC_MP3_DEC :Pointer; + AJM_CODEC_AT9_DEC :Pointer; + AJM_CODEC_M4AAC_DEC:Pointer; + AJM_CODEC_CELP8_DEC:Pointer; + AJM_CODEC_CELP8_ENC:Pointer; + AJM_CODEC_CELP_DEC :Pointer; + AJM_CODEC_CELP_ENC :Pointer; + end; + + +function ps4_sceAjmInitialize(iReserved:QWORD;pContext:PSceAjmContextId):Integer; SysV_ABI_CDecl; +Var + H:TAjmContext; +begin + if (pContext=nil) then Exit(SCE_AJM_ERROR_INVALID_PARAMETER); + H:=TAjmContext.Create; + pContext^:=-1; + FAjmMap.New(H,pContext^); + H.Release; + Result:=0; +end; + +function ps4_sceAjmModuleRegister(uiContext:SceAjmContextId;uiCodec:SceAjmCodecType;iReserved:QWORD):Integer; SysV_ABI_CDecl; +Var + H:TAjmContext; +begin + Result:=0; + + H:=TAjmContext(FAjmMap.Acqure(uiContext)); + if (H=nil) then Exit(SCE_AJM_ERROR_INVALID_CONTEXT); + + Case uiCodec of + SCE_AJM_CODEC_MP3_DEC : + begin + if (H.AJM_CODEC_MP3_DEC<>nil) then + begin + Result:=SCE_AJM_ERROR_CODEC_ALREADY_REGISTERED; + H.Release; + Exit; + end; + H.AJM_CODEC_MP3_DEC:=Pointer(1); + end; + SCE_AJM_CODEC_AT9_DEC : + begin + if (H.AJM_CODEC_AT9_DEC<>nil) then + begin + Result:=SCE_AJM_ERROR_CODEC_ALREADY_REGISTERED; + H.Release; + Exit; + end; + H.AJM_CODEC_AT9_DEC:=Pointer(1); + end; + SCE_AJM_CODEC_M4AAC_DEC: + begin + if (H.AJM_CODEC_M4AAC_DEC<>nil) then + begin + Result:=SCE_AJM_ERROR_CODEC_ALREADY_REGISTERED; + H.Release; + Exit; + end; + H.AJM_CODEC_M4AAC_DEC:=Pointer(1); + end; + SCE_AJM_CODEC_CELP8_DEC: + begin + if (H.AJM_CODEC_CELP8_DEC<>nil) then + begin + Result:=SCE_AJM_ERROR_CODEC_ALREADY_REGISTERED; + H.Release; + Exit; + end; + H.AJM_CODEC_CELP8_DEC:=Pointer(1); + end; + SCE_AJM_CODEC_CELP8_ENC: + begin + if (H.AJM_CODEC_CELP8_ENC<>nil) then + begin + Result:=SCE_AJM_ERROR_CODEC_ALREADY_REGISTERED; + H.Release; + Exit; + end; + H.AJM_CODEC_CELP8_ENC:=Pointer(1); + end; + SCE_AJM_CODEC_CELP_DEC : + begin + if (H.AJM_CODEC_CELP_DEC<>nil) then + begin + Result:=SCE_AJM_ERROR_CODEC_ALREADY_REGISTERED; + H.Release; + Exit; + end; + H.AJM_CODEC_CELP_DEC:=Pointer(1); + end; + SCE_AJM_CODEC_CELP_ENC : + begin + if (H.AJM_CODEC_CELP_ENC<>nil) then + begin + Result:=SCE_AJM_ERROR_CODEC_ALREADY_REGISTERED; + H.Release; + Exit; + end; + H.AJM_CODEC_CELP_ENC:=Pointer(1); + end; + else + begin + Result:=SCE_AJM_ERROR_INVALID_PARAMETER; + H.Release; + Exit; + end; + end; + + Case uiCodec of + SCE_AJM_CODEC_MP3_DEC :Writeln('SCE_AJM_CODEC_MP3_DEC '); + SCE_AJM_CODEC_AT9_DEC :Writeln('SCE_AJM_CODEC_AT9_DEC '); + SCE_AJM_CODEC_M4AAC_DEC:Writeln('SCE_AJM_CODEC_M4AAC_DEC'); + SCE_AJM_CODEC_CELP8_DEC:Writeln('SCE_AJM_CODEC_CELP8_DEC'); + SCE_AJM_CODEC_CELP8_ENC:Writeln('SCE_AJM_CODEC_CELP8_ENC'); + SCE_AJM_CODEC_CELP_DEC :Writeln('SCE_AJM_CODEC_CELP_DEC '); + SCE_AJM_CODEC_CELP_ENC :Writeln('SCE_AJM_CODEC_CELP_ENC '); + end; + + H.Release; +end; + +function ps4_sceAjmModuleUnregister(uiContext:SceAjmContextId;uiCodec:SceAjmCodecType):Integer; SysV_ABI_CDecl; +Var + H:TAjmContext; +begin + Result:=0; + + H:=TAjmContext(FAjmMap.Acqure(uiContext)); + if (H=nil) then Exit(SCE_AJM_ERROR_INVALID_CONTEXT); + + Case uiCodec of + SCE_AJM_CODEC_MP3_DEC : + begin + if (H.AJM_CODEC_MP3_DEC=nil) then + begin + Result:=SCE_AJM_ERROR_CODEC_NOT_REGISTERED; + H.Release; + Exit; + end; + H.AJM_CODEC_MP3_DEC:=nil; + end; + SCE_AJM_CODEC_AT9_DEC : + begin + if (H.AJM_CODEC_AT9_DEC=nil) then + begin + Result:=SCE_AJM_ERROR_CODEC_NOT_REGISTERED; + H.Release; + Exit; + end; + H.AJM_CODEC_AT9_DEC:=nil; + end; + SCE_AJM_CODEC_M4AAC_DEC: + begin + if (H.AJM_CODEC_M4AAC_DEC=nil) then + begin + Result:=SCE_AJM_ERROR_CODEC_NOT_REGISTERED; + H.Release; + Exit; + end; + H.AJM_CODEC_M4AAC_DEC:=nil; + end; + SCE_AJM_CODEC_CELP8_DEC: + begin + if (H.AJM_CODEC_CELP8_DEC=nil) then + begin + Result:=SCE_AJM_ERROR_CODEC_NOT_REGISTERED; + H.Release; + Exit; + end; + H.AJM_CODEC_CELP8_DEC:=nil; + end; + SCE_AJM_CODEC_CELP8_ENC: + begin + if (H.AJM_CODEC_CELP8_ENC=nil) then + begin + Result:=SCE_AJM_ERROR_CODEC_NOT_REGISTERED; + H.Release; + Exit; + end; + H.AJM_CODEC_CELP8_ENC:=nil; + end; + SCE_AJM_CODEC_CELP_DEC : + begin + if (H.AJM_CODEC_CELP_DEC=nil) then + begin + Result:=SCE_AJM_ERROR_CODEC_NOT_REGISTERED; + H.Release; + Exit; + end; + H.AJM_CODEC_CELP_DEC:=nil; + end; + SCE_AJM_CODEC_CELP_ENC : + begin + if (H.AJM_CODEC_CELP_ENC=nil) then + begin + Result:=SCE_AJM_ERROR_CODEC_NOT_REGISTERED; + H.Release; + Exit; + end; + H.AJM_CODEC_CELP_ENC:=nil; + end; + else + begin + Result:=SCE_AJM_ERROR_INVALID_PARAMETER; + H.Release; + Exit; + end; + end; + + H.Release; +end; + +function ps4_sceAjmFinalize(uiContext:SceAjmContextId):Integer; SysV_ABI_CDecl; +begin + Result:=0; + if not FAjmMap.Delete(uiContext) then Result:=SCE_AJM_ERROR_INVALID_CONTEXT; +end; + +function Load_libSceAjm(Const name:RawByteString):TElf_node; +var + lib:PLIBRARY; +begin + Result:=TElf_node.Create; + Result.pFileName:=name; + + lib:=Result._add_lib('libSceAjm'); + lib^.set_proc($765FB87874B352EE,@ps4_sceAjmInitialize); + lib^.set_proc($43777216EC069FAE,@ps4_sceAjmModuleRegister); + lib^.set_proc($5A2EC3B652D5F8A2,@ps4_sceAjmModuleUnregister); + lib^.set_proc($307BABEAA0AC52EB,@ps4_sceAjmFinalize); +end; + +initialization + FAjmMap:=TIntegerHandles.Create; + ps4_app.RegistredPreLoad('libSceAjm.prx',@Load_libSceAjm); + +end. +