mirror of
https://github.com/fail0verflow/hbc.git
synced 2024-11-22 09:39:18 +01:00
80 lines
1.4 KiB
C
80 lines
1.4 KiB
C
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <ogcsys.h>
|
|
#include <gccore.h>
|
|
|
|
#include "../config.h"
|
|
|
|
static u32 inbuf[8] __attribute__((aligned(0x20)));
|
|
static u32 outbuf[8] __attribute__((aligned(0x20)));
|
|
|
|
static s32 _dvd_fd = -1;
|
|
|
|
static const char _dvd_path[] __attribute__((aligned(0x20))) = "/dev/di";
|
|
|
|
typedef enum {
|
|
WDVD_OPEN = 0,
|
|
WDVD_STOP,
|
|
WDVD_CLOSE,
|
|
WDVD_DONE
|
|
} wiidvd_state;
|
|
|
|
static wiidvd_state _state;
|
|
|
|
static s32 __WiiDVD_Callback(s32 result, void *userdata)
|
|
{
|
|
s32 res = -1;
|
|
|
|
switch (_state) {
|
|
case WDVD_OPEN:
|
|
_dvd_fd = result;
|
|
if (_dvd_fd < 0)
|
|
return 0;
|
|
|
|
memset(inbuf, 0, 0x20);
|
|
inbuf[0x00] = 0xe3000000;
|
|
inbuf[0x01] = 0;
|
|
inbuf[0x02] = 0;
|
|
|
|
_state = WDVD_STOP;
|
|
res = IOS_IoctlAsync( _dvd_fd, 0xe3, inbuf, 0x20, outbuf, 0x20,
|
|
__WiiDVD_Callback, NULL);
|
|
break;
|
|
|
|
case WDVD_STOP:
|
|
_state = WDVD_CLOSE;
|
|
res = IOS_CloseAsync(_dvd_fd, __WiiDVD_Callback, NULL);
|
|
break;
|
|
|
|
case WDVD_CLOSE:
|
|
_dvd_fd = -1;
|
|
_state = WDVD_DONE;
|
|
res = 0;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
s32 WiiDVD_StopMotorAsync(void) {
|
|
_state = WDVD_OPEN;
|
|
|
|
gprintf("starting DVD motor stop callback chain\n");
|
|
return IOS_OpenAsync(_dvd_path, 0, __WiiDVD_Callback, NULL);
|
|
}
|
|
|
|
void WiiDVD_ShutDown(void) {
|
|
s32 fd = _dvd_fd;
|
|
|
|
if (fd > 0) {
|
|
_dvd_fd = -1;
|
|
_state = WDVD_DONE;
|
|
IOS_Close(fd);
|
|
gprintf("killed DVD motor stop callback chain\n");
|
|
}
|
|
}
|
|
|