s32 Disc_Wait(void) { u32 cover = 0; s32 ret; /* Wait for disc */ while (!(cover & 0x2)) { /* Get cover status */ ret = WDVD_GetCoverStatus(&cover); if (ret < 0) return ret; } return 0; }
s32 Disc_Wait(void) { u32 cover = 0; int icounter = 0; /* Wait for disc */ while (!(cover & 0x2)) { /* Get cover status */ s32 ret = WDVD_GetCoverStatus(&cover); if (ret < 0) return ret; // 10 tries to make sure it doesn´t "freeze" in Install dialog // if no Game Disc is insert icounter++; sleep(1); if(icounter > 10) return -1; } return 0; }
int old_main() { geckoinit = InitGecko(); use_dvdx = 1; InitDVD(); SYS_SetArena1Hi((void *)0x81200000); // See loader/apploader.c CVideo vid; gprintf("WodeFlow started, running with ios %d\n", IOS_GetVersion()); bool dipOK = false; int ret = 0; bool hbc; bool wodeOK = false; // MEM2 usage : // 36 MB for general purpose allocations // 12 MB for covers (and temporary buffers) // adds 15 MB from MEM1 to obtain 27 MB for covers (about 150 HQ covers on screen) MEM2_init(36, 12); // Max ~48 // Launched through the HBC? hbc = *((u32 *) 0x80001804) == 0x53545542 && *((u32 *) 0x80001808) == 0x48415858; // Init video vid.init(); // Init STexture texWait; texWait.fromPNG(wait_png, GX_TF_RGB565, ALLOC_MALLOC); vid.waitMessage(texWait); Sys_Init(); Sys_ExitToWiiMenu(true); Fat_Mount(); WPAD_Init(); WPAD_SetDataFormat(0, WPAD_FMT_BTNS_ACC_IR); dipOK = Disc_Init() >= 0; if (dipOK) { u32 status = 0; if (WDVD_GetCoverStatus(&status) != 0 || (status & 2) == 0) { // WDVD_WaitForDisc(); STexture texWaitForDisc; texWaitForDisc.fromPNG(wait_disc_png, GX_TF_RGB565, ALLOC_MALLOC); vid.waitMessage(texWaitForDisc); texWaitForDisc.data.release(); do { WPAD_ScanPads(); s32 padsState = WPAD_ButtonsDown(0); if ((padsState & WPAD_BUTTON_B) != 0) break; usleep(100 * 1000); } while (WDVD_GetCoverStatus(&status) != 0 || (status & 2) == 0); if ((status & 2) == 0) return -2; InitDVD(); } } wodeOK = WBFS_Init() >= 0; vid.waitMessage(texWait); texWait.data.release(); MEM2_takeBigOnes(true); do { CMenu menu(vid); menu.init(hbc); if (!dipOK) menu.error(L"Could not initialize DIP module!"); else if (!wodeOK) menu.error(L"Wode not found."); else { ret = menu.main(); } vid.cleanup(); } while (ret == 1); LaunchISO(0, 0); CloseWode(); Fat_Unmount(); return ret; };
void *DiHandler::ThreadMain( void *arg ) { enum State { St_Init, St_Reset, St_WaitForDisc, St_CheckDiscType, St_OpenPartition, St_WaitForDiscEject, // some error happened, dont do anything until the current disc is ejected St_Idle }; State state = St_Init; u32 coverState = 0; while( !threadExit ) { usleep( 1000 ); if( threadSleep ) LWP_SuspendThread( thread ); if( state == St_Init ) { if( WDVD_Init() ) { instance->ErrorHappened( E_Init, true ); threadExit = true; } state = St_Reset; continue; } else if( state == St_Reset ) { if( WDVD_Reset() ) { instance->ErrorHappened( E_Init, false ); continue; } state = St_WaitForDisc; } // check for disc u32 cover = 0; if( WDVD_GetCoverStatus( &cover ) ) { gprintf( "WDVD_GetCoverStatus() failed\n" ); WDVD_Close(); state = St_Init; continue; } // check if disc status is changed if( cover != coverState ) { //gprintf( "cover status: %08x %08x\n", cover, coverState ); if( cover & 2 )// disc is present and wasnt before { //gprintf( "disc inserted\n" ); instance->StartingToReadDisc(); WDVD_Reset(); state = St_CheckDiscType; } else if( coverState & 2 )// disc was present before isnt is gone now { instance->DiscEjected(); //gprintf( "disc ejected\n" ); state = St_WaitForDisc; } coverState = cover; } if( !( cover & 2 ) )// if theres no disc inserted, then loop { continue; } if( state == St_WaitForDiscEject ) { continue; } else if( state == St_CheckDiscType ) { s32 ret = WDVD_ReadDiskId( (void*)0x80000000 ); if( ret < 0 ) { gprintf("WDVD_ReadDiskId(): %d\n", ret ); instance->ErrorHappened( E_DVD_ReadError, false ); //state = St_WaitForDiscEject; WDVD_Close(); state = St_Init; //coverState = 0; continue; } // check disc type if( *(u32*)( 0x80000018 ) == 0x5d1c9ea3 ) { //gprintf( "disc is wii\n" ); state = St_OpenPartition; //instance->DiscInserted( T_Wii ); } else if( *(u32*)( 0x8000001c ) == 0xc2339f3d ) { //gprintf( "disc is gamecube\n" ); instance->DiscInserted( T_GC ); state = St_Idle; } else { //gprintf( "disc is unknown\n" ); instance->DiscInserted( T_Unknown ); state = St_WaitForDiscEject; //hexdump( (void*)0x80000000, 0x20 ); } } else if( state == St_OpenPartition ) { if( WDVD_OpenDataPartition() < 0 ) { instance->ErrorHappened( E_OpenPartition, false ); state = St_WaitForDiscEject; continue; } //gprintf( "partition is open\n" ); // search for the opening.bnr s32 ret; FST_INFO fst_info __attribute(( aligned( 32 ) )); //find FST inside partition ret = WDVD_Read( (u8*)&fst_info, sizeof( FST_INFO ), 0x420LL ); if( ret < 0 ) { gprintf("WDVD_Read( fst_info ): %d\n", ret ); instance->ErrorHappened( E_DVD_ReadError, false ); state = St_WaitForDiscEject; WDVD_ClosePartition(); continue; } fst_info.fst_offset <<= 2; fst_info.fst_size <<= 2; //gprintf( "%s %i\n", __FILE__, __LINE__ ); fst_buffer = (u8*)memalign( 32, RU( fst_info.fst_size, 0x40 ) ); if( !fst_buffer ) { instance->ErrorHappened( E_NoMem, true ); threadExit = true; WDVD_ClosePartition(); continue; } //gprintf( "%s %i\n", __FILE__, __LINE__ ); //gprintf( " %p %08x %08x\n", fst_buffer, fst_info.fst_size, fst_info.fst_offset ); //read fst into memory ret = WDVD_Read( fst_buffer, fst_info.fst_size, fst_info.fst_offset ); if( ret < 0 ) { gprintf("WDVD_Read( fst_buffer ): %d\n", ret ); instance->ErrorHappened( E_DVD_ReadError, false ); state = St_WaitForDiscEject; WDVD_ClosePartition(); continue; } //gprintf( "%s %i\n", __FILE__, __LINE__ ); //set the pointers fst = (FST_ENTRY *)fst_buffer; u32 name_table_offset = fst->filelen * 0xC; name_table = (char *)( fst_buffer + name_table_offset ); //gprintf( "%s %i\n", __FILE__, __LINE__ ); // find the opening.bnr int fd = EntryFromPath( "/opening.bnr", 0 ); if( fd < 2 ) { instance->ErrorHappened( E_NoOpeningBnr, false ); instance->DiscInserted( T_Wii ); FREE( fst ); name_table = NULL; state = St_Idle; WDVD_ClosePartition(); continue; } //gprintf( "%s %i\n", __FILE__, __LINE__ ); u32 len = fst[ fd ].filelen; u8 *buf = (u8*)memalign( 32, RU( len, 0x40 ) ); if( !buf ) { instance->ErrorHappened( E_NoMem, true ); threadExit = true; FREE( fst ); name_table = NULL; WDVD_ClosePartition(); continue; } //gprintf( "%s %i\n", __FILE__, __LINE__ ); ret = WDVD_Read( buf, len, (u64)( fst[ fd ].fileoffset ) << 2 ); if( ret < 0 ) { gprintf("WDVD_Read( opening.bnr ): %d\n", ret ); instance->ErrorHappened( E_DVD_ReadError, false ); state = St_WaitForDiscEject; FREE( fst ); name_table = NULL; free( buf ); WDVD_ClosePartition(); continue; } //gprintf( "%s %i\n", __FILE__, __LINE__ ); // done with these FREE( fst ); name_table = NULL; WDVD_ClosePartition(); //gprintf( "%s %i\n", __FILE__, __LINE__ ); bool rec = false; // got the opening.bnr. send it to whoever cares instance->OpeningBnrReady( buf, len, rec ); if( !rec ) { gprintf( "nobody got the banner. freeing it\n" ); free( buf ); } instance->DiscInserted( T_Wii ); //gprintf( "%s %i\n", __FILE__, __LINE__ ); state = St_Idle; } } return NULL; }