static int lua_openwav(lua_State *L)
{
int argc = lua_gettop(L);
if (argc != 1) return luaL_error(L, "wrong number of arguments");
const char *file_tbo = luaL_checkstring(L, 1);
Handle fileHandle;
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);
if(ret) return luaL_error(L, "error opening file");
u32 magic,samplerate,bytesRead,jump,chunk=0x00000000;
u16 audiotype;
FSFILE_Read(fileHandle, &bytesRead, 0, &magic, 4);
if (magic == 0x46464952){
u64 size;
u32 pos = 16;
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);
FSFILE_Read(fileHandle, &bytesRead, 22, &audiotype, 2);
FSFILE_Read(fileHandle, &bytesRead, 24, &samplerate, 4);
wav *wav_file = (wav*)malloc(sizeof(wav));
wav_file->samplerate = samplerate;
if (audiotype == 1){
wav_file->audiobuf = (u8*)linearAlloc(size-(pos+4));
FSFILE_Read(fileHandle, &bytesRead, pos+4, wav_file->audiobuf, size-(pos+4));
wav_file->audiobuf2 = NULL;
wav_file->size = size-(pos+4);
}else{
// I must reordinate my buffer in order to play stereo sound (Thanks CSND/FS libraries .-.)
u16 bytepersample;
FSFILE_Read(fileHandle, &bytesRead, 32, &bytepersample, 2);
u8* tmp_buffer = (u8*)linearAlloc((size-(pos+4)));
wav_file->audiobuf = (u8*)linearAlloc((size-(pos+4))/2);
wav_file->audiobuf2 = (u8*)linearAlloc((size-(pos+4))/2);
FSFILE_Read(fileHandle, &bytesRead, pos+4, tmp_buffer, size-(pos+4));
u32 off=0;
u32 i=0;
u16 z;
while (i < (size-(pos+4))){
z=0;
while (z < (bytepersample/2)){
wav_file->audiobuf[off+z] = tmp_buffer[i+z];
z++;
}
z=0;
while (z < (bytepersample/2)){
wav_file->audiobuf2[off+z] = tmp_buffer[i+z+(bytepersample/2)];
z++;
}
i=i+bytepersample;
off=off+(bytepersample/2);
}
linearFree(tmp_buffer);
wav_file->size = (size-(pos+4))/2;
}
lua_pushnumber(L,(u32)wav_file);
}
FSFILE_Close(fileHandle);
svcCloseHandle(fileHandle);
return 1;
}