Skip to content

Commit

Permalink
JP0 dvdmgr progress
Browse files Browse the repository at this point in the history
  • Loading branch information
SeekyCt committed Jan 14, 2025
1 parent 1730a40 commit e7ac6d5
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 2 deletions.
8 changes: 7 additions & 1 deletion spm-headers/include/spm/dvdmgr.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@ CPP_WRAPPER(spm::dvdmgr)

USING(wii::dvd::DVDFileInfo)

#if (defined SPM_EU0) || (defined SPM_EU1) || (defined SPM_US2) || (defined SPM_KR0)
#define DVDMGR_C_VERSION 2
#else
#define DVDMGR_C_VERSION 1
#endif

typedef void (DVDMgrCallback)(s32 result, DVDFileInfo * fileInfo);

#define MAX_DVD_ENTRY 0x200
Expand Down Expand Up @@ -72,7 +78,7 @@ DECOMP_STATIC(void dvdmgr__cb(s32 result, DVDFileInfo * fileInfo))
/*
Read from a file asynchronously
*/
s32 DVDMgrReadAsync(DVDEntry * entry, void * dest, s32 length, s32 offset,
void DVDMgrReadAsync(DVDEntry * entry, void * dest, s32 length, s32 offset,
DVDMgrCallback * callback);

/*
Expand Down
56 changes: 55 additions & 1 deletion src/dvdmgr.c
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#include "wii/dvd.h"
#include <common.h>
#include <spm/dvdmgr.h>
#include <spm/memory.h>
Expand Down Expand Up @@ -101,6 +102,7 @@ s32 DVDMgrRead(DVDEntry * entry, void * dest, s32 length, s32 offset)
return (s32) entry->fileInfo.length;
}

#if DVDMGR_C_VERSION >= 2
static void _cb(s32 result, DVDFileInfo * fileInfo)
{
DVDEntry * entry;
Expand All @@ -112,7 +114,7 @@ static void _cb(s32 result, DVDFileInfo * fileInfo)
entry->readCallback(result, fileInfo);
}

s32 DVDMgrReadAsync(DVDEntry * entry, void * dest, s32 length, s32 offset,
void DVDMgrReadAsync(DVDEntry * entry, void * dest, s32 length, s32 offset,
DVDMgrCallback * callback)
{
// Backup data
Expand All @@ -130,6 +132,58 @@ s32 DVDMgrReadAsync(DVDEntry * entry, void * dest, s32 length, s32 offset,
// Start read
return DVDReadAsyncPrio(&entry->fileInfo, dest, length, offset, _cb, entry->priority);
}
#else // 1
static void readAsync(DVDEntry * entry, s32 lengthToRead, DVDFICallback * callback)
{
// Setup callback context
entry->fileInfo.commandBlock.userData = entry;

// Start read
DVDReadAsyncPrio(&entry->fileInfo, entry->dest, lengthToRead, entry->offset + entry->lengthRead, callback, entry->priority);

entry->lengthRemaining -= lengthToRead;
entry->lengthRead += lengthToRead;
entry->dest = (void *) ((u32)entry->dest + lengthToRead);
}

static void _cb(s32 result, DVDFileInfo * fileInfo)
{
DVDEntry * entry;

// Get context
entry = (DVDEntry *)fileInfo->commandBlock.userData;

if (result < 0)
{
// Run user callback on failure
entry->readCallback(result, fileInfo);
}
else if (entry->lengthRemaining == 0)
{
// Run user callback on completion
entry->readCallback(result, fileInfo);
}
else
{
readAsync(entry, entry->lengthRemaining, _cb); // inline
}
}

// NON_MATCHING: _cb pointer is loaded too late
void DVDMgrReadAsync(DVDEntry * entry, void * dest, s32 length, s32 offset,
DVDMgrCallback * callback)
{
// Backup data
entry->readCallback = callback;
entry->dest = dest;
entry->lengthRemaining = length;
entry->offset = offset;
entry->lengthRead = 0;

readAsync(entry, entry->lengthRemaining, _cb); // inline
}

#endif

void DVDMgrClose(DVDEntry * entry)
{
Expand Down

0 comments on commit e7ac6d5

Please sign in to comment.