void streamCode(u32 arg){
wav* src = (wav*)arg;
while(!closeStream){
//if (src->encoding == CSND_ENCODING_VORBIS) return lua_streamOgg(L);
u32 bytesRead;
u32 control;
if (src->encoding == CSND_ENCODING_IMA_ADPCM) control = (src->samplerate / 2) * ((osGetTime() - src->tick) / 1000);
else control = src->samplerate * src->bytepersample * ((osGetTime() - src->tick) / 1000);
if (((control) >= (src->size - src->startRead)) && (src->isPlaying)){
if (src->streamLoop){
src->tick = osGetTime();
src->moltiplier = 1;
}else{
src->isPlaying = false;
src->tick = (osGetTime()-src->tick);
src->moltiplier = 1;
CSND_setchannel_playbackstate(src->ch, 0);
if (src->audiobuf2 != NULL) CSND_setchannel_playbackstate(src->ch2, 0);
CSND_sharedmemtype0_cmdupdatestate(0);
}
if (src->audiobuf2 == NULL){
FSFILE_Read(src->sourceFile, &bytesRead, src->startRead, src->audiobuf, src->mem_size);
u64 i = 0;
if (src->big_endian){
while (i < (src->mem_size)){
u8 tmp = src->audiobuf[i];
src->audiobuf[i] = src->audiobuf[i+1];
src->audiobuf[i+1] = tmp;
i=i+2;
}
}
}else{
u8* tmp_buffer = (u8*)linearAlloc(src->mem_size);
FSFILE_Read(src->sourceFile, &bytesRead, src->startRead, tmp_buffer, src->mem_size);
u32 size_tbp = src->mem_size;
u32 off=0;
u32 i=0;
u16 z;
if (src->big_endian){
while (i < size_tbp){
z=0;
while (z < (src->bytepersample/2)){
src->audiobuf[off+z] = tmp_buffer[i+(src->bytepersample/2)-z-1];
src->audiobuf2[off+z] = tmp_buffer[i+(src->bytepersample)-z-1];
z++;
}
i=i+src->bytepersample;
off=off+(src->bytepersample/2);
}
}else{
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++;
}
i=i+src->bytepersample;
off=off+(src->bytepersample/2);
}
}
linearFree(tmp_buffer);
}
}else if (((control) > ((src->mem_size / 2) * src->moltiplier)) && (src->isPlaying)){
if ((src->moltiplier % 2) == 1){
//Update and flush first half-buffer
if (src->audiobuf2 == NULL){
if (src->encoding == CSND_ENCODING_IMA_ADPCM){ //ADPCM Decoding TODO
u32 buffer_headers_num = ((src->mem_size)/2) / src->bytepersample;
u8* tmp_audiobuf = (u8*)linearAlloc((src->mem_size)/2);
FSFILE_Read(src->sourceFile, &bytesRead, src->startRead+(((src->mem_size)/2)*(src->moltiplier + 1)), tmp_audiobuf, (src->mem_size)/2);
int z=0,i=0;
while (i < (src->mem_size/2)){
src->audiobuf[z] = tmp_audiobuf[i];
z++;
i++;
if ((i % src->bytepersample) == 0) i=i+4;
}
linearFree(tmp_audiobuf);
}else{ //PCM-16 Decoding
FSFILE_Read(src->sourceFile, &bytesRead, src->startRead+(((src->mem_size)/2)*(src->moltiplier + 1)), src->audiobuf, (src->mem_size)/2);
u64 i = 0;
if (bytesRead != ((src->mem_size)/2)){
FSFILE_Read(src->sourceFile, &bytesRead, src->startRead, src->audiobuf, (src->mem_size)/2);
src->moltiplier = src->moltiplier + 1;
}
if (src->big_endian){
while (i < ((src->mem_size)/2)){
u8 tmp = src->audiobuf[i];
src->audiobuf[i] = src->audiobuf[i+1];
src->audiobuf[i+1] = tmp;
i=i+2;
}
}
}
src->moltiplier = src->moltiplier + 1;
}else{
u8* tmp_buffer = (u8*)linearAlloc((src->mem_size)/2);
FSFILE_Read(src->sourceFile, &bytesRead, src->startRead+(src->mem_size/2)*(src->moltiplier + 1), tmp_buffer, (src->mem_size)/2);
if (bytesRead != ((src->mem_size)/2)){
FSFILE_Read(src->sourceFile, &bytesRead, src->startRead, tmp_buffer, (src->mem_size)/2);
src->moltiplier = src->moltiplier + 1;
}
src->moltiplier = src->moltiplier + 1;
u32 size_tbp = (src->mem_size)/2;
u32 off=0;
u32 i=0;
u16 z;
if (src->big_endian){
while (i < size_tbp){
z=0;
while (z < (src->bytepersample/2)){
src->audiobuf[off+z] = tmp_buffer[i+(src->bytepersample/2)-z-1];
src->audiobuf2[off+z] = tmp_buffer[i+(src->bytepersample)-z-1];
z++;
}
i=i+src->bytepersample;
off=off+(src->bytepersample/2);
}
}else{
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++;
}
i=i+src->bytepersample;
off=off+(src->bytepersample/2);
}
}
linearFree(tmp_buffer);
}
}else{
u32 bytesRead;
//Update and flush second half-buffer
if (src->audiobuf2 == NULL){
if (src->encoding == CSND_ENCODING_IMA_ADPCM){ // ADPCM Decoding TODO
u32 buffer_headers_num = ((src->mem_size)/2) / src->bytepersample;
u8* tmp_audiobuf = (u8*)linearAlloc((src->mem_size)/2);
FSFILE_Read(src->sourceFile, &bytesRead, src->startRead+(((src->mem_size)/2)*(src->moltiplier + 1)), tmp_audiobuf, (src->mem_size)/2);
int z=0,i=0;
while (i < (src->mem_size/2)){
src->audiobuf[z+(src->mem_size/2)] = tmp_audiobuf[i];
z++;
i++;
if ((i % src->bytepersample) == 0) i=i+4;
}
linearFree(tmp_audiobuf);
}else{ // PCM-16 Decoding
FSFILE_Read(src->sourceFile, &bytesRead, src->startRead+(((src->mem_size)/2)*(src->moltiplier + 1)), src->audiobuf+((src->mem_size)/2), (src->mem_size)/2);
if (src->big_endian){
u64 i = 0;
while (i < ((src->mem_size)/2)){
u8 tmp = src->audiobuf[i+((src->mem_size)/2)];
src->audiobuf[i+((src->mem_size)/2)] = src->audiobuf[i+((src->mem_size)/2)+1];
src->audiobuf[i+((src->mem_size)/2)+1] = tmp;
i=i+2;
}
}
}
src->moltiplier = src->moltiplier + 1;
}else{
u8* tmp_buffer = (u8*)linearAlloc((src->mem_size)/2);
FSFILE_Read(src->sourceFile, &bytesRead, src->startRead+(src->mem_size/2)*(src->moltiplier + 1), 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;
if (src->big_endian){
while (i < size_tbp){
z=0;
while (z < (src->bytepersample/2)){
src->audiobuf[(src->mem_size)/4+off+z] = tmp_buffer[i+(src->bytepersample/2)-z-1];
src->audiobuf2[(src->mem_size)/4+off+z] = tmp_buffer[i+(src->bytepersample)-z-1];
z++;
}
z=0;
i=i+src->bytepersample;
off=off+(src->bytepersample/2);
}
}else{
while (i < size_tbp){
z=0;
while (z < (src->bytepersample/2)){
src->audiobuf[(src->mem_size)/4+off+z] = tmp_buffer[i+z];
src->audiobuf2[(src->mem_size)/4+off+z] = tmp_buffer[i+z+(src->bytepersample/2)];
z++;
}
i=i+src->bytepersample;
off=off+(src->bytepersample/2);
}
}
linearFree(tmp_buffer);
}
}
}
}
svcExitThread();
}