mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-05-23 06:34:18 -04:00
208 lines
5.8 KiB
C
208 lines
5.8 KiB
C
#ifndef _DOLPHIN_DVD_H
|
|
#define _DOLPHIN_DVD_H
|
|
|
|
#include "types.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif // ifdef __cplusplus
|
|
|
|
/////////// DVD TYPES ///////////
|
|
typedef struct DVDCommandBlock DVDCommandBlock;
|
|
typedef struct DVDFileInfo DVDFileInfo;
|
|
|
|
// Callback function types.
|
|
typedef void (*DVDCallback)(s32 result, DVDFileInfo* fileInfo);
|
|
typedef void (*DVDCBCallback)(s32 result, DVDCommandBlock* block);
|
|
typedef void (*DVDLowCallback)(u32 intType);
|
|
typedef void (*DVDDoneReadCallback)(s32, DVDFileInfo*);
|
|
typedef void (*DVDOptionalCommandChecker)(DVDCommandBlock* block, DVDLowCallback callback);
|
|
|
|
typedef struct DVDDriveInfo {
|
|
u16 revisionLevel; // _00
|
|
u16 deviceCode; // _02
|
|
u32 releaseDate; // _04
|
|
u8 padding[24]; // _08
|
|
} DVDDriveInfo;
|
|
|
|
// Struct for DVD information (size 0x20)
|
|
typedef struct DVDDiskID {
|
|
char gameName[4]; // _00
|
|
char company[2]; // _04
|
|
u8 diskNumber; // _06
|
|
u8 gameVersion; // _07
|
|
u8 streaming; // _08
|
|
u8 streamBufSize; // _09, default = 0
|
|
u8 padding[22]; // _0A, all 0s
|
|
} DVDDiskID;
|
|
|
|
// Struct for command information (size 0x30).
|
|
struct DVDCommandBlock {
|
|
DVDCommandBlock* next; // _00
|
|
DVDCommandBlock* prev; // _04
|
|
u32 command; // _08
|
|
s32 state; // _0C
|
|
u32 offset; // _10
|
|
u32 length; // _14
|
|
void* addr; // _18
|
|
u32 currTransferSize; // _1C
|
|
u32 transferredSize; // _20
|
|
DVDDiskID* id; // _24
|
|
DVDCBCallback callback; // _28
|
|
void* userData; // _2C
|
|
};
|
|
|
|
// Struct for file information (size 0x3C).
|
|
// NB: we had this as DVDPlayer previously.
|
|
struct DVDFileInfo {
|
|
DVDCommandBlock cBlock; // _00
|
|
u32 startAddr; // _30
|
|
u32 length; // _34
|
|
DVDCallback callback; // _38
|
|
};
|
|
|
|
// Struct for directory information (size 0xC).
|
|
typedef struct DVDDir {
|
|
u32 entryNum; // _00
|
|
u32 location; // _04
|
|
u32 next; // _08
|
|
} DVDDir;
|
|
|
|
// Struct for directory entries (size 0xC).
|
|
typedef struct DVDDirEntry {
|
|
u32 entryNum; // _00
|
|
BOOL isDir; // _04
|
|
char* name; // _08
|
|
} DVDDirEntry;
|
|
|
|
// Struct for handing queues.
|
|
typedef struct DVDQueue DVDQueue;
|
|
|
|
struct DVDQueue {
|
|
DVDQueue* mHead; // _00
|
|
DVDQueue* mTail; // _04
|
|
};
|
|
|
|
// DVD Boot information instructions.
|
|
// Struct 1.
|
|
typedef struct DVDBB1 {
|
|
u32 appLoaderLength; // _00
|
|
void* appLoaderFunc1; // _04
|
|
void* appLoaderFunc2; // _08
|
|
void* appLoaderFunc3; // _0C
|
|
} DVDBB1;
|
|
|
|
// Struct 2.
|
|
typedef struct DVDBB2 {
|
|
u32 bootFilePosition; // _00
|
|
u32 FSTPosition; // _04
|
|
u32 FSTLength; // _08
|
|
u32 FSTMaxLength; // _0C
|
|
void* FSTAddress; // _10
|
|
u32 userPosition; // _14
|
|
u32 userLength; // _18
|
|
u32 reserved_1C; // _1C
|
|
} DVDBB2;
|
|
|
|
//////////////////////////////////
|
|
|
|
///////// DVD FUNCTIONS //////////
|
|
// Basic DVD functions.
|
|
void DVDInit();
|
|
BOOL DVDOpen(char* filename, DVDFileInfo* fileInfo);
|
|
BOOL DVDFastOpen(s32 entryNum, DVDFileInfo* fileInfo);
|
|
s32 DVDReadPrio(DVDFileInfo* fileInfo, void* addr, s32 length, s32 offset, s32 prio);
|
|
BOOL DVDReadAsyncPrio(DVDFileInfo* fileInfo, void* addr, s32 length, s32 offset, DVDCallback callback, s32 prio);
|
|
BOOL DVDClose(DVDFileInfo* fileInfo);
|
|
|
|
void DVDResume();
|
|
void DVDReset();
|
|
|
|
BOOL DVDCancelAsync(DVDCommandBlock* block, DVDCBCallback callback);
|
|
s32 DVDCancel(DVDCommandBlock* block);
|
|
|
|
s32 DVDChangeDisk(DVDCommandBlock* block, DVDDiskID* id);
|
|
BOOL DVDChangeDiskAsync(DVDCommandBlock* block, DVDDiskID* id, DVDCBCallback callback);
|
|
|
|
// Status functions.
|
|
s32 DVDGetCommandBlockStatus(const DVDCommandBlock* block);
|
|
s32 DVDGetDriveStatus();
|
|
BOOL DVDSetAutoInvalidation(BOOL doAutoInval);
|
|
void* DVDGetFSTLocation();
|
|
|
|
// DVD Dir functions.
|
|
BOOL DVDOpenDir(char* dirName, DVDDir* dir);
|
|
BOOL DVDReadDir(DVDDir* dir, DVDDirEntry* dirEntry);
|
|
BOOL DVDCloseDir(DVDDir* dir);
|
|
BOOL DVDGetCurrentDir(char* path, u32 maxLength);
|
|
BOOL DVDChangeDir(char* dirName);
|
|
s32 DVDConvertPathToEntrynum(char* path);
|
|
|
|
// Other disk functions.
|
|
s32 DVDGetTransferredSize(DVDFileInfo* fileInfo);
|
|
DVDDiskID* DVDGetCurrentDiskID();
|
|
BOOL DVDCompareDiskID(DVDDiskID* id1, DVDDiskID* id2);
|
|
DVDLowCallback DVDLowClearCallback();
|
|
BOOL DVDPrepareStreamAsync(DVDFileInfo* fileInfo, u32 length, u32 offset, DVDCallback callback);
|
|
s32 DVDCancelStream(DVDCommandBlock* block);
|
|
|
|
BOOL DVDCheckDisk();
|
|
|
|
// Unused/inlined in P2.
|
|
void DVDPause();
|
|
s32 DVDSeekPrio(DVDFileInfo* fileInfo, s32 offset, s32 prio);
|
|
BOOL DVDSeekAsyncPrio(DVDFileInfo* fileInfo, s32 offset, DVDCallback callback, s32 prio);
|
|
s32 DVDGetFileInfoStatus(DVDFileInfo* fileInfo);
|
|
BOOL DVDFastOpenDir(s32 entryNum, DVDDir* dir);
|
|
BOOL DVDCancelAllAsync(DVDCBCallback callback);
|
|
s32 DVDCancelAll();
|
|
void DVDDumpWaitingQueue();
|
|
|
|
//////////////////////////////////
|
|
|
|
////// USEFUL DVD DEFINES ////////
|
|
// Macro for reading.
|
|
#define DVDReadAsync(fileInfo, addr, length, offset, callback) \
|
|
DVDReadAsyncPrio((fileInfo), (addr), (length), (offset), (callback), 2)
|
|
#define DVDGetFileInfoStatus(fileInfo) DVDGetCommandBlockStatus(&(fileInfo)->cBlock)
|
|
|
|
// Minimum transfer size.
|
|
#define DVD_MIN_TRANSFER_SIZE 32
|
|
|
|
// DVD states.
|
|
#define DVD_STATE_FATAL_ERROR -1
|
|
#define DVD_STATE_END 0
|
|
#define DVD_STATE_BUSY 1
|
|
#define DVD_STATE_WAITING 2
|
|
#define DVD_STATE_COVER_CLOSED 3
|
|
#define DVD_STATE_NO_DISK 4
|
|
#define DVD_STATE_COVER_OPEN 5
|
|
#define DVD_STATE_WRONG_DISK 6
|
|
#define DVD_STATE_MOTOR_STOPPED 7
|
|
#define DVD_STATE_PAUSING 8
|
|
#define DVD_STATE_IGNORED 9
|
|
#define DVD_STATE_CANCELED 10
|
|
#define DVD_STATE_RETRY 11
|
|
|
|
// File info states.
|
|
#define DVD_FILEINFO_READY 0
|
|
#define DVD_FILEINFO_BUSY 1
|
|
|
|
// DVD results.
|
|
#define DVD_RESULT_GOOD 0
|
|
#define DVD_RESULT_FATAL_ERROR -1
|
|
#define DVD_RESULT_IGNORED -2
|
|
#define DVD_RESULT_CANCELED -3
|
|
|
|
#define DVD_AIS_SUCCESS 0
|
|
|
|
DVDDiskID DiskID AT_ADDRESS(0x80000000);
|
|
|
|
//////////////////////////////////
|
|
|
|
#ifdef __cplusplus
|
|
};
|
|
#endif // ifdef __cplusplus
|
|
|
|
#endif
|