#include <string.h>
#include <3ds.h>
u8* audiobuf;
int main()
{
// Initialize services
srvInit();
aptInit();
hidInit(NULL);
gfxInit();
fsInit();
CSND_initialize(NULL);
//gfxSet3D(true); // uncomment if using stereoscopic 3D
u64 size;
u32 magic, samplerate, bytesRead, jump, chunk=0x00000000;
u32 pos = 16;
const char *file_tbo = "/canary.wav";
Handle fileHandle;
//Open wav file
FS_archive sdmcArchive=(FS_archive){ARCH_SDMC, (FS_path){PATH_EMPTY, 1, (u8*)""}};
FS_path filePath=FS_makePath(PATH_CHAR, file_tbo);
Result ret=FSUSER_OpenFileDirectly(NULL, &fileHandle, sdmcArchive, filePath, FS_OPEN_READ, FS_ATTRIBUTE_NONE);
FSFILE_Read(fileHandle, &bytesRead, 0, &magic, 4);
if (magic == 0x46464952){
while (chunk != 0x61746164){
FSFILE_Read(fileHandle, &bytesRead, pos, &jump, 4);
pos=pos+4+jump;
FSFILE_Read(fileHandle, &bytesRead, pos, &chunk, 4);
pos=pos+4;
}
FSFILE_GetSize(fileHandle, &size);
audiobuf = (u8*)linearAlloc(size-(pos+4));
FSFILE_Read(fileHandle, &bytesRead, 24, &samplerate, 4);
FSFILE_Read(fileHandle, &bytesRead, pos+4, audiobuf, size-(pos+4));
}
FSFILE_Close(fileHandle);
// Main loop
while (aptMainLoop())
{
gspWaitForVBlank();
hidScanInput();
u32 kDown = hidKeysDown();
if (kDown & KEY_START){
break;
};
//Start wav file
if(hidKeysUp() & KEY_A){
CSND_playsound(0x8, CSND_LOOP_DISABLE, CSND_ENCODING_PCM16, samplerate, (u32*)audiobuf, NULL, size-(pos+4), 2, 0);
};
// Flush and swap framebuffers
gfxFlushBuffers();
gfxSwapBuffers();
}
linearFree(audiobuf);
CSND_shutdown();
svcCloseHandle(fileHandle);
// Exit services
fsExit();
gfxExit();
hidExit();
aptExit();
srvExit();
return 0;
}