/* microphone_demo1 ARM9 Code Chris Double (chris.double@double.co.nz) http://www.double.co.nz/nintendo_ds */ #include #include "nds/arm9/console.h" #include #include #include #include "command.h" static int key_prev = 0; static int key_curr = 0; #define KEYS (*(vuint16*)0x04000130) #define key_poll() { key_prev=key_curr; key_curr = KEYS; } #define key_transit(key) ((key_curr^key_prev) & key) #define key_held(key) (~(key_curr|key_prev) & key) #define key_hit(key) ((~key_curr&key_prev) & key) #define key_released(key) ((key_curr&~key_prev) & key) static int buffer_length = 1000000; static s8* buffer = 0; static int recorded_length = 0; static int recording = 0; void on_irq() { if(REG_IF & IRQ_VBLANK) { printf("\x1b[2J"); printf("Microphone Demo Program\n\n"); printf("Press 'A' to start recording.\n"); printf("Press 'A' again to stop.\n"); printf("Press 'B' to playback.\n\n"); if(recording) printf("Recording...\n"); else printf("Recorded %d bytes.\n", recorded_length); VBLANK_INTR_WAIT_FLAGS |= IRQ_VBLANK; REG_IF |= IRQ_VBLANK; } else { REG_IF = REG_IF; } } void InitInterruptHandler() { REG_IME = 0; IRQ_HANDLER = on_irq; REG_IE = IRQ_VBLANK; REG_IF = ~0; DISP_SR = DISP_VBLANK_IRQ; REG_IME = 1; } int main(void) { powerON(POWER_ALL); videoSetMode(MODE_0_2D | DISPLAY_BG0_ACTIVE); vramSetBankA(VRAM_A_MAIN_BG); BG0_CR = BG_MAP_BASE(31); BG_PALETTE[255] = RGB15(31,31,31); consoleInitDefault((u16*)SCREEN_BASE_BLOCK(31), (u16*)CHAR_BASE_BLOCK(0), 16); InitInterruptHandler(); CommandInit(); buffer = (s8*)malloc(buffer_length); while(1) { swiWaitForVBlank(); key_poll(); if(!recording && key_hit(KEY_A)) { recording = 1; CommandStartRecording(buffer, buffer_length); } else if(recording && key_hit(KEY_A)) { recorded_length = CommandStopRecording(); recording = 0; } if(key_hit(KEY_B)) { CommandPlayOneShotSample(0, 16384, buffer, recorded_length, 0x7f); } } return 0; }