35 #define CD_SERVER_INIT 0x80000592
36 #define CD_SERVER_SEARCHFILE 0x80000597
37 #define CD_SERVER_DISKREADY 0x8000059A
39 #define CD_SERVER_POFF 0x80000596
45 void _CdSemaExit(
void);
52 int m_cdvdfsv_version;
53 int m_cdvdman_version;
54 int m_cdvdfsv_isverbose;
65 #ifdef F__libcdvd_internals
67 int initVersionCdvdfsv;
68 int initVersionCdvdman;
84 volatile int cbSema = 0;
87 volatile int CdCallbackNum;
93 int callbackThreadId = 0;
110 extern int initVersionCdvdfsv;
111 extern int initVersionCdvdman;
116 extern int callbackSemaId;
117 extern volatile int cbSema;
118 extern volatile int CdCallbackNum;
120 extern int CdThreadId;
122 extern int callbackThreadId;
124 extern s32 diskReadyMode;
125 extern s32 trayReqData;
129 extern u32 searchFileRecvBuff;
139 CdThreadId = GetThreadId();
140 memset(&clientInit, 0,
sizeof(clientInit));
143 if (sceSifBindRpc(&clientInit, CD_SERVER_INIT, 0) < 0) {
145 printf(
"Libcdvd bind err CD_Init\n");
146 }
else if (clientInit.server != 0)
153 if (sceSifCallRpc(&clientInit, 0, 0, &initMode,
sizeof(initMode), &cdInitRecvBuff,
sizeof(cdInitRecvBuff), 0, 0) < 0)
155 initVersionCdvdfsv = cdInitRecvBuff.m_cdvdfsv_version;
156 initVersionCdvdman = cdInitRecvBuff.m_cdvdman_version;
159 printf(
"Libcdvd Exit\n");
172 #ifdef F_sceCdIntToPos
175 p->minute = (((((i + 150) / 75) / 60) / 10) * 16) + ((((i + 150) / 75) / 60) % 10);
176 p->second = (((((i + 150) / 75) % 60) / 10) * 16) + ((((i + 150) / 75) % 60) % 10);
177 p->sector = ((((i + 150) % 75) / 10) * 16) + (((i + 150) % 75) % 10);
182 #ifdef F_sceCdPosToInt
185 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;
189 #ifdef F_sceCdSearchFile
193 if (PollSema(nCmdSemaId) != nCmdSemaId)
195 nCmdNum = CD_SERVER_SEARCHFILE;
196 ReferThreadStatus(CdThreadId, &CdThreadParam);
198 SignalSema(nCmdSemaId);
203 memset(&clientSearchFile, 0,
sizeof(clientSearchFile));
204 if (!clientSearchFile.server) {
206 if (sceSifBindRpc(&clientSearchFile, CD_SERVER_SEARCHFILE, 0) < 0) {
208 printf(
"libsceCdvd bind err sceCdSearchFile\n");
210 if (clientSearchFile.server != 0)
217 strncpy(searchFileSendBuff.name, name, 255);
218 searchFileSendBuff.name[255] =
'\0';
219 searchFileSendBuff.dest = &searchFileSendBuff;
222 printf(
"ee call cmd search %s\n", searchFileSendBuff.name);
223 if (sceSifCallRpc(&clientSearchFile, 0, 0, &searchFileSendBuff,
sizeof(
SearchFilePkt), nCmdRecvBuff, 4, NULL, NULL) < 0) {
224 SignalSema(nCmdSemaId);
228 memcpy(file, UNCACHED_SEG(&searchFileSendBuff), 32);
231 printf(
"search name %s\n", file->
name);
232 printf(
"search size %d\n", file->
size);
233 printf(
"search loc lnn %d\n", file->
lsn);
234 printf(
"search loc date %02X %02X %02X %02X %02X %02X %02X %02X\n",
237 printf(
"search loc date %02d %02d %02d %02d %02d %02d %02d %02d\n",
242 SignalSema(nCmdSemaId);
243 return *(s32 *)UNCACHED_SEG(nCmdRecvBuff);
247 #ifdef F_sceCdDiskReady
251 printf(
"DiskReady 0\n");
254 if (PollSema(sCmdSemaId) != sCmdSemaId)
257 SignalSema(sCmdSemaId);
263 memset(&clientDiskReady, 0,
sizeof(clientDiskReady));
264 if (!clientDiskReady.server) {
266 if (sceSifBindRpc(&clientDiskReady, CD_SERVER_DISKREADY, 0) < 0) {
268 printf(
"Libcdvd bind err CdDiskReady\n");
270 if (clientDiskReady.server != 0)
276 diskReadyMode = mode;
278 if (sceSifCallRpc(&clientDiskReady, 0, 0, &diskReadyMode, 4, sCmdRecvBuff, 4, NULL, NULL) < 0) {
279 SignalSema(sCmdSemaId);
283 printf(
"DiskReady ended\n");
285 SignalSema(sCmdSemaId);
286 return *(s32 *)UNCACHED_SEG(sCmdRecvBuff);
291 void _CdSemaInit(
void)
296 if (nCmdSemaId != 0 && sCmdSemaId != 0)
299 semaParam.init_count = 1;
300 semaParam.max_count = 1;
301 semaParam.option = 0;
302 nCmdSemaId = CreateSema(&semaParam);
305 sCmdSemaId = CreateSema(&semaParam);
309 semaParam.init_count = 0;
310 callbackSemaId = CreateSema(&semaParam);
311 if (callbackSemaId < 0)
319 void _CdSemaExit(
void)
321 if (callbackThreadId) {
323 SignalSema(callbackSemaId);
325 DeleteSema(nCmdSemaId);
326 DeleteSema(sCmdSemaId);
327 DeleteSema(callbackSemaId);
331 #ifdef F_sceCdInitEeCB
332 static void _CdCallbackLoop(
void);
333 s32
sceCdInitEeCB(s32 priority,
void *stackAddr, s32 stackSize)
336 if (callbackThreadId != 0) {
337 ChangeThreadPriority(callbackThreadId, priority);
341 CdThreadId = GetThreadId();
342 ReferThreadStatus(CdThreadId, &CdThreadParam);
343 callbackThreadParam.stack_size = stackSize;
344 callbackThreadParam.gp_reg = &
_gp;
345 callbackThreadParam.func = &_CdCallbackLoop;
346 callbackThreadParam.stack = stackAddr;
347 callbackThreadParam.initial_priority = priority;
348 callbackThreadId = CreateThread(&callbackThreadParam);
349 StartThread(callbackThreadId, NULL);
355 #ifdef F_sceCdCallback
363 sceCdCallbackFunc = newFunc;
376 #ifdef F_sceCdInitEeCB
377 static void _CdCallbackLoop(
void)
380 WaitSema(callbackSemaId);
383 if (CdCallbackNum == -1)
387 printf(
"sceCdCallbackFunc = %08X CdCallbackNum = %d\n", (u32)sceCdCallbackFunc, CdCallbackNum);
390 if (sceCdCallbackFunc && CdCallbackNum)
391 sceCdCallbackFunc(CdCallbackNum);
399 #ifdef F__CdGenericCallbackFunction
400 void _CdGenericCallbackFunction(
void *funcNum)
403 CdCallbackNum = *(s32 *)funcNum;
404 iSignalSema(nCmdSemaId);
407 if (callbackThreadId) {
408 if (sceCdCallbackFunc) {
409 iSignalSema(callbackSemaId);