NDSP: add mechanism to load the component from an external source
This commit is contained in:
parent
f1ce480ed9
commit
89e0bcd8cc
@ -371,7 +371,7 @@ void ndspiReadChnState(void)
|
|||||||
chn->wavBufCount--;
|
chn->wavBufCount--;
|
||||||
bool shouldBreak = seqId == 0 && (wb->sequence_id == st->lastSeqId || st->lastSeqId == 0);
|
bool shouldBreak = seqId == 0 && (wb->sequence_id == st->lastSeqId || st->lastSeqId == 0);
|
||||||
wb = wb->next;
|
wb = wb->next;
|
||||||
if (shouldBreak || chn->wavBufCount == 0)
|
if (!wb || shouldBreak || chn->wavBufCount == 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (seqId == 0)
|
if (seqId == 0)
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#include "ndsp-internal.h"
|
#include "ndsp-internal.h"
|
||||||
#include <3ds/services/cfgu.h>
|
#include <3ds/services/cfgu.h>
|
||||||
|
#include <3ds/services/fs.h>
|
||||||
|
|
||||||
#define NDSP_THREAD_STACK_SIZE 0x1000
|
#define NDSP_THREAD_STACK_SIZE 0x1000
|
||||||
|
|
||||||
@ -12,6 +13,7 @@ static u32 droppedFrames, frameCount;
|
|||||||
static const void* componentBin;
|
static const void* componentBin;
|
||||||
static u32 componentSize;
|
static u32 componentSize;
|
||||||
static u16 componentProgMask, componentDataMask;
|
static u16 componentProgMask, componentDataMask;
|
||||||
|
static bool componentFree;
|
||||||
|
|
||||||
static aptHookCookie aptCookie;
|
static aptHookCookie aptCookie;
|
||||||
|
|
||||||
@ -375,15 +377,84 @@ void ndspUseComponent(const void* binary, u32 size, u16 progMask, u16 dataMask)
|
|||||||
componentSize = size;
|
componentSize = size;
|
||||||
componentProgMask = progMask;
|
componentProgMask = progMask;
|
||||||
componentDataMask = dataMask;
|
componentDataMask = dataMask;
|
||||||
|
componentFree = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ndspFindAndLoadComponent(void)
|
||||||
|
{
|
||||||
|
extern Handle __get_handle_from_list(const char* name);
|
||||||
|
Result rc;
|
||||||
|
Handle rsrc;
|
||||||
|
void* bin;
|
||||||
|
|
||||||
|
componentProgMask = 0xFF;
|
||||||
|
componentDataMask = 0xFF;
|
||||||
|
|
||||||
|
// Try loading the DSP component from the filesystem
|
||||||
|
do
|
||||||
|
{
|
||||||
|
static const char dsp_filename[] = "/3ds/dspfirm.cdc";
|
||||||
|
FS_archive arch = { ARCH_SDMC, { PATH_EMPTY, 1, (u8*)"" }, 0, 0 };
|
||||||
|
FS_path path = { PATH_CHAR, sizeof(dsp_filename), (u8*)dsp_filename };
|
||||||
|
|
||||||
|
rc = FSUSER_OpenFileDirectly(&rsrc, arch, path, FS_OPEN_READ, FS_ATTRIBUTE_NONE);
|
||||||
|
if (rc) break;
|
||||||
|
|
||||||
|
u64 size = 0;
|
||||||
|
rc = FSFILE_GetSize(rsrc, &size);
|
||||||
|
if (rc) { FSFILE_Close(rsrc); break; }
|
||||||
|
|
||||||
|
bin = malloc(size);
|
||||||
|
if (!bin) { FSFILE_Close(rsrc); break; }
|
||||||
|
|
||||||
|
u32 dummy = 0;
|
||||||
|
rc = FSFILE_Read(rsrc, &dummy, 0, bin, size);
|
||||||
|
FSFILE_Close(rsrc);
|
||||||
|
if (rc) { free(bin); return false; }
|
||||||
|
|
||||||
|
componentBin = bin;
|
||||||
|
componentSize = size;
|
||||||
|
componentFree = true;
|
||||||
|
return true;
|
||||||
|
} while (0);
|
||||||
|
|
||||||
|
// Try loading the DSP component from hb:ndsp
|
||||||
|
rsrc = __get_handle_from_list("hb:ndsp");
|
||||||
|
if (rsrc) do
|
||||||
|
{
|
||||||
|
extern u32 fake_heap_end;
|
||||||
|
u32 mapAddr = (fake_heap_end+0xFFF) &~ 0xFFF;
|
||||||
|
rc = svcMapMemoryBlock(rsrc, mapAddr, 0x3, 0x3);
|
||||||
|
if (rc) break;
|
||||||
|
|
||||||
|
componentSize = *(u32*)(mapAddr + 0x104);
|
||||||
|
bin = malloc(componentSize);
|
||||||
|
if (bin)
|
||||||
|
memcpy(bin, (void*)mapAddr, componentSize);
|
||||||
|
svcUnmapMemoryBlock(rsrc, mapAddr);
|
||||||
|
if (!bin) break;
|
||||||
|
|
||||||
|
componentBin = bin;
|
||||||
|
componentFree = true;
|
||||||
|
return true;
|
||||||
|
} while (0);
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ndspRefCount = 0;
|
static int ndspRefCount = 0;
|
||||||
|
|
||||||
Result ndspInit(void)
|
Result ndspInit(void)
|
||||||
{
|
{
|
||||||
Result rc;
|
Result rc = 0;
|
||||||
if (ndspRefCount++) return 0;
|
if (ndspRefCount++) return 0;
|
||||||
|
|
||||||
|
if (!componentBin && !ndspFindAndLoadComponent())
|
||||||
|
{
|
||||||
|
rc = 1018 | (41 << 10) | (4 << 21) | (27 << 27);
|
||||||
|
goto _fail0;
|
||||||
|
}
|
||||||
|
|
||||||
LightLock_Init(&ndspMutex);
|
LightLock_Init(&ndspMutex);
|
||||||
ndspInitMaster();
|
ndspInitMaster();
|
||||||
ndspiInitChn();
|
ndspiInitChn();
|
||||||
@ -418,6 +489,12 @@ _fail2:
|
|||||||
ndspFinalize(false);
|
ndspFinalize(false);
|
||||||
_fail1:
|
_fail1:
|
||||||
dspExit();
|
dspExit();
|
||||||
|
if (componentFree)
|
||||||
|
{
|
||||||
|
free((void*)componentBin);
|
||||||
|
componentBin = NULL;
|
||||||
|
}
|
||||||
|
_fail0:
|
||||||
ndspRefCount--;
|
ndspRefCount--;
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -433,6 +510,11 @@ void ndspExit(void)
|
|||||||
aptUnhook(&aptCookie);
|
aptUnhook(&aptCookie);
|
||||||
ndspFinalize(false);
|
ndspFinalize(false);
|
||||||
dspExit();
|
dspExit();
|
||||||
|
if (componentFree)
|
||||||
|
{
|
||||||
|
free((void*)componentBin);
|
||||||
|
componentBin = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 ndspGetDroppedFrames(void)
|
u32 ndspGetDroppedFrames(void)
|
||||||
|
Loading…
Reference in New Issue
Block a user