static int lua_startBMPV(lua_State *L){ int argc = lua_gettop(L); if ((argc != 3) && (argc != 4)) return luaL_error(L, "wrong number of arguments"); BMPV* src = (BMPV*)luaL_checkint(L, 1); int loop = luaL_checkint(L, 2); int ch1 = luaL_checkint(L, 3); if (argc == 4){ int ch2 = luaL_checkint(L, 4); src->ch2 = ch2; } src->loop = loop; src->isPlaying = true; src->ch1 = ch1; src->currentFrame = 0; u32 bytesRead; if (src->samplerate != 0 && src->audio_size != 0 && !GW_MODE){ while(src->mem_size > MAX_RAM_ALLOCATION){ src->mem_size = src->mem_size / 2; } if (src->audiotype == 1){ FSFILE_Read(src->sourceFile, &bytesRead, 28, src->audiobuf, src->mem_size); GSPGPU_FlushDataCache(NULL, src->audiobuf, src->audio_size); My_CSND_playsound(ch1, CSND_LOOP_ENABLE, CSND_ENCODING_PCM16, src->samplerate, (u32*)src->audiobuf, (u32*)src->audiobuf, src->mem_size, 0xFFFF, 0xFFFF); }else{ u8* audiobuf = (u8*)linearAlloc(src->mem_size); FSFILE_Read(src->sourceFile, &bytesRead, 28, audiobuf, src->mem_size); src->audiobuf = (u8*)linearAlloc(src->mem_size/2); src->audiobuf2 = (u8*)linearAlloc(src->mem_size/2); u32 off=0; u32 i=0; u16 z; while (i < (src->mem_size)){ z=0; while (z < (src->bytepersample/2)){ src->audiobuf[off+z] = audiobuf[i+z]; src->audiobuf2[off+z] = audiobuf[i+z+(src->bytepersample/2)]; z++; } i=i+src->bytepersample; off=off+(src->bytepersample/2); } linearFree(audiobuf); GSPGPU_FlushDataCache(NULL, src->audiobuf, src->mem_size/2); GSPGPU_FlushDataCache(NULL, src->audiobuf2, src->mem_size/2); My_CSND_playsound(src->ch1, CSND_LOOP_ENABLE, CSND_ENCODING_PCM16, src->samplerate, (u32*)src->audiobuf, (u32*)src->audiobuf, src->mem_size/2, 0xFFFF, 0); My_CSND_playsound(src->ch2, CSND_LOOP_ENABLE, CSND_ENCODING_PCM16, src->samplerate, (u32*)src->audiobuf2, (u32*)src->audiobuf2, src->mem_size/2, 0, 0xFFFF); } src->tick = osGetTime(); CSND_setchannel_playbackstate(ch1, 1); if (src->audiotype == 2){ CSND_setchannel_playbackstate(src->ch2, 1); } CSND_sharedmemtype0_cmdupdatestate(0); src->moltiplier = 1; }else{ src->tick = osGetTime(); } return 0; }
static int lua_resumeBMPV(lua_State *L){ int argc = lua_gettop(L); if (argc != 1) return luaL_error(L, "wrong number of arguments"); BMPV* src = (BMPV*)luaL_checkint(L, 1); src->isPlaying = true; src->tick = (osGetTime() - src->tick); if (src->samplerate != 0 && src->audio_size != 0 && !GW_MODE){ CSND_setchannel_playbackstate(src->ch1, 1); if (src->audiotype == 2){ CSND_setchannel_playbackstate(src->ch2, 1); } CSND_sharedmemtype0_cmdupdatestate(0); } return 0; }
static int lua_stopBMPV(lua_State *L){ int argc = lua_gettop(L); if (argc != 1) return luaL_error(L, "wrong number of arguments"); BMPV* src = (BMPV*)luaL_checkint(L, 1); src->isPlaying = false; src->currentFrame = 0; if (src->samplerate != 0 && src->audio_size != 0 && !GW_MODE){ CSND_setchannel_playbackstate(src->ch1, 0); if (src->audiotype == 2){ CSND_setchannel_playbackstate(src->ch2, 0); } CSND_sharedmemtype0_cmdupdatestate(0); } return 0; }
void Audio_MixFinish() { curpos++; if (curpos >= (MIXBUFSIZE/256)) { if (Audio_Type == 1) { int newbuffer = curbuffer^1; myCSND_playsound(8+newbuffer, 1, 1/*PCM16*/, 32000, (u32*)&Audio_Buffer[0], (u32*)&Audio_Buffer[(MIXBUFSIZE*2)-1], MIXBUFSIZE*4, 2, 0); myCSND_playsound(10+newbuffer, 1, 1/*PCM16*/, 32000, (u32*)&Audio_Buffer[MIXBUFSIZE*2], (u32*)&Audio_Buffer[(MIXBUFSIZE*4)-1], MIXBUFSIZE*4, 2, 0); CSND_setchannel_playbackstate(8+curbuffer, 0); CSND_setchannel_playbackstate(10+curbuffer, 0); CSND_sharedmemtype0_cmdupdatestate(0); } curbuffer ^= 1; Audio_Buffer = curbuffer ? Audio_Buffer1 : Audio_Buffer0; curpos = 0; } }
void myCSND_playsound(u32 channel, u32 looping, u32 encoding, u32 samplerate, u32 *vaddr0, u32 *vaddr1, u32 totalbytesize, u32 unk0, u32 unk1) { u32 physaddr0 = 0; u32 physaddr1 = 0; physaddr0 = osConvertVirtToPhys((u32)vaddr0); physaddr1 = osConvertVirtToPhys((u32)vaddr1); CSND_sharedmemtype0_cmde(channel, looping, encoding, samplerate, unk0, unk1, physaddr0, physaddr1, totalbytesize); CSND_sharedmemtype0_cmd8(channel, samplerate); if(looping) { if(physaddr1>physaddr0)totalbytesize = (u32)physaddr1 - (u32)physaddr0; CSND_sharedmemtype0_cmd3(channel, physaddr1, totalbytesize); } CSND_sharedmemtype0_cmd8(channel, samplerate); CSND_sharedmemtype0_cmd9(channel, 0xffff); CSND_setchannel_playbackstate(channel, 1); }
int main() { // Initialize services srvInit(); aptInit(); hidInit(NULL); gfxInit(); CSND_initialize(NULL); srand(osGetTime()); //gfxSet3D(true); // uncomment if using stereoscopic 3D u8 *audiobuf = linearAlloc(sadloop_bin_size); int i; for (i=0;i<sadloop_bin_size;i++) { memcpy(&audiobuf[i], &sadloop_bin[i], 1); } bool flip = false; u64 nextflip = osGetTime()+500; u8 *crow = linearAlloc(crow1_bin_size); for (i=0;i<crow1_bin_size;i++) { memcpy(&crow[i], &crow1_bin[i], 1); } CSND_setchannel_playbackstate(0x8, 0); CSND_sharedmemtype0_cmdupdatestate(0); u64 nextsong = osGetTime()+68000; CSND_playsound(0x8, CSND_LOOP_ENABLE, CSND_ENCODING_PCM16, 22050, (u32*)audiobuf, NULL, sadloop_bin_size, 2, 0); char* fact; u64 nextfact = osGetTime()+newFact(&fact); // Main loop while (aptMainLoop()) { gspWaitForVBlank(); hidScanInput(); u64 now = osGetTime(); if (now >= nextsong) { nextsong = now+68000; CSND_playsound(0x8, CSND_LOOP_ENABLE, CSND_ENCODING_PCM16, 22050, (u32*)audiobuf, NULL, sadloop_bin_size, 2, 0); } if (now >= nextflip) { nextflip = now+500; if (flip) { for (i=0;i<crow1_bin_size;i++) { memcpy(&crow[i], &crow1_bin[i], 1); } flip = false; } else { for (i=0;i<crow1_bin_size;i++) { memcpy(&crow[i], &crow2_bin[i], 1); } flip = true; } } if (now >= nextfact) { nextfact = now+newFact(&fact); } u32 kDown = hidKeysDown(); if (kDown & KEY_START) break; // break in order to return to hbmenu // Please note that the 3DS screens are sideways (thus 240x400 and 240x320) u8* fb = gfxGetFramebuffer(GFX_TOP, GFX_LEFT, NULL, NULL); memset(fb, 0, 240*400*3); tsDrawWord(GFX_TOP, GFX_LEFT, "Fact Crow says:", 30, 180, 255, 255, 255); drawFact(fact); gfxDrawSprite(GFX_TOP, GFX_LEFT, crow, 37, 37, 138, 30); // Flush and swap framebuffers gfxFlushBuffers(); gfxSwapBuffers(); } CSND_shutdown(); linearFree(audiobuf); // Exit services gfxExit(); hidExit(); aptExit(); srvExit(); return 0; }
static int lua_drawBMPV(lua_State *L){ int argc = lua_gettop(L); if ((argc != 4) && (argc != 5)) return luaL_error(L, "wrong number of arguments"); int x = luaL_checkint(L, 1); int y = luaL_checkint(L, 2); BMPV* src = (BMPV*)luaL_checkint(L, 3); u32 bytesRead; int screen = luaL_checkint(L, 4); int side = 0; if (argc == 5){ side = luaL_checkint(L,5); } if (src->isPlaying){ if (src->currentFrame >= src->tot_frame){ if (src->loop == 1){ src->currentFrame = 0; if (!GW_MODE){ src->moltiplier = 1; } src->tick = osGetTime(); }else{ src->isPlaying = false; src->moltiplier = 1; CSND_setchannel_playbackstate(src->ch1, 0); if (src->audiobuf2 != NULL) CSND_setchannel_playbackstate(src->ch2, 0); CSND_sharedmemtype0_cmdupdatestate(0); } if (src->audiobuf2 == NULL){ FSFILE_Read(src->sourceFile, &bytesRead, 28, src->audiobuf, src->mem_size); GSPGPU_FlushDataCache(NULL, src->audiobuf, src->mem_size); }else{ u8* tmp_buffer = (u8*)linearAlloc(src->mem_size); FSFILE_Read(src->sourceFile, &bytesRead, 28, tmp_buffer, src->mem_size); u32 size_tbp = src->mem_size; 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)/2); GSPGPU_FlushDataCache(NULL, src->audiobuf2, (src->mem_size)/2); } }else{ if (((src->samplerate * src->bytepersample * ((osGetTime() - src->tick) / 1000)) > ((src->mem_size / 2) * src->moltiplier)) && (src->isPlaying)){ if ((src->moltiplier % 2) == 1){ //Update and flush first half-buffer if (src->audiobuf2 == NULL){ FSFILE_Read(src->sourceFile, &bytesRead, 28+(((src->mem_size)/2)*(src->moltiplier + 1)), src->audiobuf, (src->mem_size)/2); if (bytesRead != ((src->mem_size)/2)){ FSFILE_Read(src->sourceFile, &bytesRead, 28, src->audiobuf, (src->mem_size)/2); src->moltiplier = src->moltiplier + 1; } src->moltiplier = src->moltiplier + 1; GSPGPU_FlushDataCache(NULL, src->audiobuf, src->mem_size); }else{ u8* tmp_buffer = (u8*)linearAlloc((src->mem_size)/2); FSFILE_Read(src->sourceFile, &bytesRead, 28+(src->mem_size/2)*(src->moltiplier + 1), tmp_buffer, (src->mem_size)/2); if (bytesRead != ((src->mem_size)/2)){ FSFILE_Read(src->sourceFile, &bytesRead, 28, 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; 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); GSPGPU_FlushDataCache(NULL, src->audiobuf, (src->mem_size)/2); GSPGPU_FlushDataCache(NULL, src->audiobuf2, (src->mem_size)/2); } }else{ u32 bytesRead; //Update and flush second half-buffer if (src->audiobuf2 == NULL){ FSFILE_Read(src->sourceFile, &bytesRead, 28+(((src->mem_size)/2)*(src->moltiplier + 1)), src->audiobuf+((src->mem_size)/2), (src->mem_size)/2); src->moltiplier = src->moltiplier + 1; GSPGPU_FlushDataCache(NULL, src->audiobuf, src->mem_size); }else{ u8* tmp_buffer = (u8*)linearAlloc((src->mem_size)/2); FSFILE_Read(src->sourceFile, &bytesRead, 28+(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; 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); GSPGPU_FlushDataCache(NULL, src->audiobuf, (src->mem_size)/2); GSPGPU_FlushDataCache(NULL, src->audiobuf2, (src->mem_size)/2); } } } src->currentFrame =((osGetTime() - src->tick) * src->framerate / 1000); Bitmap bitmap; bitmap.width = src->width; bitmap.height = src->height; bitmap.bitperpixel = 24; u32 frame_size = src->width * src->height * 3; u32 bytesRead; FSFILE_Read(src->sourceFile, &bytesRead, 28+src->audio_size+(src->currentFrame*frame_size), src->framebuf, frame_size); bitmap.pixels = src->framebuf; if (screen > 1) PrintImageBitmap(x,y,&bitmap,screen); else PrintScreenBitmap(x,y,&bitmap,screen,side); } }else{ if (src->tick != 0){ Bitmap bitmap; bitmap.width = src->width; bitmap.height = src->height; bitmap.bitperpixel = 24; u32 frame_size = src->width * src->height * 3; u32 bytesRead; FSFILE_Read(src->sourceFile, &bytesRead, 28+src->audio_size+(src->currentFrame*frame_size), src->framebuf, frame_size); bitmap.pixels = src->framebuf; if (screen > 1) PrintImageBitmap(x,y,&bitmap,screen); else PrintScreenBitmap(x,y,&bitmap,screen,side); } } return 0; }