static int lua_streamWav(lua_State *L)
{
int argc = lua_gettop(L);
if (argc != 1) return luaL_error(L, "wrong number of arguments");
wav* src = (wav*)luaL_checkint(L, 1);
if (((src->samplerate * src->bytepersample * ((osGetTime() - src->tick) / 1000)) > ((src->mem_size / 2) * src->moltiplier) && (src->isPlaying)){
if ((src->moltiplier % 2) == 1){
u32 bytesRead;
//Update and flush first half-buffer
if (src->audiobuf2 == NULL){
FSFILE_Read(src->sourceFile, &bytesRead, src->startRead+(src->mem_size)*(src->moltiplier), src->audiobuf, (src->mem_size)/2);
src->moltiplier = src->moltiplier + 1;
GSPGPU_FlushDataCache(NULL, src->audiobuf, (src->mem_size)/2);
}else{
u8* tmp_buffer = (u8*)linearAlloc((src->mem_size)/2);
FSFILE_Read(src->sourceFile, &bytesRead, src->startRead+(src->mem_size)*(src->moltiplier), tmp_buffer, (src->mem_size)/2);
src->moltiplier = src->moltiplier + 1;
u32 size_tbp = (src->mem_size)/2;
u32 off=0;
u32 i=0;
u16 z;
while (i < size_tbp){
z=0;
while (z < (src->bytepersample/2)){
src->audiobuf[off+z] = tmp_buffer[i+z];
src->audiobuf2[off+z] = tmp_buffer[i+z+(src->bytepersample/2)];
z++;
}
z=0;
i=i+src->bytepersample;
off=off+(src->bytepersample/2);
}
linearFree(tmp_buffer);
GSPGPU_FlushDataCache(NULL, src->audiobuf, (src->mem_size)/4);
GSPGPU_FlushDataCache(NULL, src->audiobuf2, (src->mem_size)/4);
}
}else{
u32 bytesRead;
//Update and flush second half-buffer
if (src->audiobuf2 == NULL){
FSFILE_Read(src->sourceFile, &bytesRead, src->startRead+(src->mem_size)*(src->moltiplier), src->audiobuf+((src->mem_size)/2), (src->mem_size)/2);
src->moltiplier = src->moltiplier + 1;
GSPGPU_FlushDataCache(NULL, src->audiobuf+((src->mem_size)/2), (src->mem_size)/2);
}else{
u8* tmp_buffer = (u8*)linearAlloc((src->mem_size)/2);
FSFILE_Read(src->sourceFile, &bytesRead, src->startRead+(src->mem_size)*(src->moltiplier), tmp_buffer, (src->mem_size)/2);
src->moltiplier = src->moltiplier + 1;
u32 size_tbp = (src->mem_size)/2;
u32 off=0;
u32 i=0;
u16 z;
while (i < size_tbp){
z=0;
while (z < (src->bytepersample/2)){
src->audiobuf[(src->mem_size)/2+off+z] = tmp_buffer[i+z];
src->audiobuf2[(src->mem_size)/2+off+z] = tmp_buffer[i+z+(src->bytepersample/2)];
z++;
}
i=i+src->bytepersample;
off=off+(src->bytepersample/2);
}
linearFree(tmp_buffer);
GSPGPU_FlushDataCache(NULL, src->audiobuf+((src->mem_size)/2), (src->mem_size)/4);
GSPGPU_FlushDataCache(NULL, src->audiobuf2+((src->mem_size)/2), (src->mem_size)/4);
}
}
}
return 0;
}