34 #define CD_SERVER_INIT 0x80000592
35 #define CD_SERVER_SEARCHFILE 0x80000597
36 #define CD_SERVER_DISKREADY 0x8000059A
38 #define CD_SERVER_POFF 0x80000596
44 void _CdSemaExit(
void);
51 int m_cdvdfsv_version;
52 int m_cdvdman_version;
53 int m_cdvdfsv_isverbose;
64 #ifdef F__libcdvd_internals
67 int bindDiskReady = -1;
68 int bindSearchFile = -1;
70 int initVersionCdvdfsv;
71 int initVersionCdvdman;
85 int callbackSemaId = -1;
87 volatile int cbSema = 0;
90 volatile int CdCallbackNum;
96 int callbackThreadId = 0;
114 extern int bindDiskReady;
115 extern int bindSearchFile;
116 extern int initVersionCdvdfsv;
117 extern int initVersionCdvdman;
122 extern int callbackSemaId;
123 extern volatile int cbSema;
124 extern volatile int CdCallbackNum;
126 extern int CdThreadId;
128 extern int callbackThreadId;
130 extern s32 diskReadyMode;
131 extern s32 trayReqData;
135 extern u32 searchFileRecvBuff;
145 CdThreadId = GetThreadId();
153 if (sceSifBindRpc(&clientInit, CD_SERVER_INIT, 0) < 0) {
155 printf(
"Libcdvd bind err CD_Init\n");
156 }
else if (clientInit.server != 0)
164 if (sceSifCallRpc(&clientInit, 0, 0, &initMode,
sizeof(initMode), &cdInitRecvBuff,
sizeof(cdInitRecvBuff), 0, 0) < 0)
166 initVersionCdvdfsv = cdInitRecvBuff.m_cdvdfsv_version;
167 initVersionCdvdman = cdInitRecvBuff.m_cdvdman_version;
170 printf(
"Libcdvd Exit\n");
183 #ifdef F_sceCdIntToPos
186 p->minute = (((((i + 150) / 75) / 60) / 10) * 16) + ((((i + 150) / 75) / 60) % 10);
187 p->second = (((((i + 150) / 75) % 60) / 10) * 16) + ((((i + 150) / 75) % 60) % 10);
188 p->sector = ((((i + 150) % 75) / 10) * 16) + (((i + 150) % 75) % 10);
193 #ifdef F_sceCdPosToInt
196 return ((((p->minute / 16) * 10) + (p->minute & 0xF)) * 60 + ((p->second / 16) * 10) + (p->second & 0xF)) * 75 + (p->sector / 16) * 10 + (p->sector & 0xF) - 150;
200 #ifdef F_sceCdSearchFile
204 if (PollSema(nCmdSemaId) != nCmdSemaId)
206 nCmdNum = CD_SERVER_SEARCHFILE;
207 ReferThreadStatus(CdThreadId, &CdThreadParam);
209 SignalSema(nCmdSemaId);
213 if (bindSearchFile < 0) {
215 if (sceSifBindRpc(&clientSearchFile, CD_SERVER_SEARCHFILE, 0) < 0) {
217 printf(
"libsceCdvd bind err sceCdSearchFile\n");
219 if (clientSearchFile.server != 0)
227 strncpy(searchFileSendBuff.name, name, 255);
228 searchFileSendBuff.name[255] =
'\0';
229 searchFileSendBuff.dest = &searchFileSendBuff;
232 printf(
"ee call cmd search %s\n", searchFileSendBuff.name);
233 if (sceSifCallRpc(&clientSearchFile, 0, 0, &searchFileSendBuff,
sizeof(
SearchFilePkt), nCmdRecvBuff, 4, NULL, NULL) < 0) {
234 SignalSema(nCmdSemaId);
238 memcpy(file, UNCACHED_SEG(&searchFileSendBuff), 32);
241 printf(
"search name %s\n", file->
name);
242 printf(
"search size %d\n", file->
size);
243 printf(
"search loc lnn %d\n", file->
lsn);
244 printf(
"search loc date %02X %02X %02X %02X %02X %02X %02X %02X\n",
247 printf(
"search loc date %02d %02d %02d %02d %02d %02d %02d %02d\n",
252 SignalSema(nCmdSemaId);
253 return *(s32 *)UNCACHED_SEG(nCmdRecvBuff);
257 #ifdef F_sceCdDiskReady
261 printf(
"DiskReady 0\n");
264 if (PollSema(sCmdSemaId) != sCmdSemaId)
267 SignalSema(sCmdSemaId);
272 if (bindDiskReady < 0) {
274 if (sceSifBindRpc(&clientDiskReady, CD_SERVER_DISKREADY, 0) < 0) {
276 printf(
"Libcdvd bind err CdDiskReady\n");
278 if (clientDiskReady.server != 0)
285 diskReadyMode = mode;
287 if (sceSifCallRpc(&clientDiskReady, 0, 0, &diskReadyMode, 4, sCmdRecvBuff, 4, NULL, NULL) < 0) {
288 SignalSema(sCmdSemaId);
292 printf(
"DiskReady ended\n");
294 SignalSema(sCmdSemaId);
295 return *(s32 *)UNCACHED_SEG(sCmdRecvBuff);
300 void _CdSemaInit(
void)
305 if (nCmdSemaId != -1 && sCmdSemaId != -1)
308 semaParam.init_count = 1;
309 semaParam.max_count = 1;
310 semaParam.option = 0;
311 nCmdSemaId = CreateSema(&semaParam);
312 sCmdSemaId = CreateSema(&semaParam);
314 semaParam.init_count = 0;
315 callbackSemaId = CreateSema(&semaParam);
322 void _CdSemaExit(
void)
324 if (callbackThreadId) {
326 SignalSema(callbackSemaId);
328 DeleteSema(nCmdSemaId);
329 DeleteSema(sCmdSemaId);
330 DeleteSema(callbackSemaId);
334 #ifdef F_sceCdInitEeCB
335 static void _CdCallbackLoop(
void);
336 s32
sceCdInitEeCB(s32 priority,
void *stackAddr, s32 stackSize)
339 if (callbackThreadId != 0) {
340 ChangeThreadPriority(callbackThreadId, priority);
344 CdThreadId = GetThreadId();
345 ReferThreadStatus(CdThreadId, &CdThreadParam);
346 callbackThreadParam.stack_size = stackSize;
347 callbackThreadParam.gp_reg = &
_gp;
348 callbackThreadParam.func = &_CdCallbackLoop;
349 callbackThreadParam.stack = stackAddr;
350 callbackThreadParam.initial_priority = priority;
351 callbackThreadId = CreateThread(&callbackThreadParam);
352 StartThread(callbackThreadId, NULL);
358 #ifdef F_sceCdCallback
366 sceCdCallbackFunc = newFunc;
379 #ifdef F_sceCdInitEeCB
380 static void _CdCallbackLoop(
void)
383 WaitSema(callbackSemaId);
386 if (CdCallbackNum == -1)
390 printf(
"sceCdCallbackFunc = %08X CdCallbackNum = %d\n", (u32)sceCdCallbackFunc, CdCallbackNum);
393 if (sceCdCallbackFunc && CdCallbackNum)
394 sceCdCallbackFunc(CdCallbackNum);
402 #ifdef F__CdGenericCallbackFunction
403 void _CdGenericCallbackFunction(
void *funcNum)
406 CdCallbackNum = *(s32 *)funcNum;
407 iSignalSema(nCmdSemaId);
410 if (callbackThreadId) {
411 if (sceCdCallbackFunc) {
412 iSignalSema(callbackSemaId);