i'm new in NDS programming, but not new at C / C++ programming.
I want to transform my Nintendo DS in a sort of microphone for live streaming.
That is, while i'm talking into the MIC, the sound buffer should come out to the speakers or (better!) to the hearphones if connected through the jack.
Maybe not really in real-time: a second's fraction is tolerated
I tried the following:
Code: Select all
#include <nds.h>
#include <stdio.h>
//the record sample rate
#define sample_rate 8000
//buffer to hold sound data for playback
u16* sound_buffer = 0;
//buffer which is written to by the arm7
u16* mic_buffer = 0;
//the length of the current data
u32 data_length = 0;
//enough hold 5 seconds of 16bit audio
u32 sound_buffer_size = sample_rate * 2 * 5;
//the mic buffer sent to the arm7 is a double buffer
//every time it is half full the arm7 signals us so we can read the
//data. I want the buffer to swap about once per frame so i chose a
//buffer size large enough to hold two frames of 16bit mic data
u32 mic_buffer_size = sample_rate * 2 / 30;
//------ live ------
void live_micHandler(void* data, int length)
{
if(!sound_buffer || data_length > sound_buffer_size) return;
DC_InvalidateRange(data, length);
dmaCopy(data, ((u8*)sound_buffer) + data_length, length);
iprintf("+");
soundPlaySample(sound_buffer, SoundFormat_16Bit, length, sample_rate, 127, 64, false, 0);
}
void live_start()
{
data_length = 0;
soundEnable();
soundMicRecord(mic_buffer, mic_buffer_size, MicFormat_12Bit, sample_rate, live_micHandler);
}
void live_stop()
{
soundMicOff();
}
//----------------------------
int main(void)
{
int key;
bool recording = false;
sound_buffer = (u16*)malloc(sound_buffer_size);
mic_buffer = (u16*)malloc(mic_buffer_size);
consoleDemoInit();
iprintf("Press B for live streaming\n");
while(1)
{
scanKeys();
key = keysDown();
if(key & KEY_B)
{
recording ? live_stop() : live_start();
recording = !recording;
iprintf("LIVE %s\n", recording ? "start" : "stop");
}
swiWaitForVBlank();
}
}
the "live_micHandler" should manage the output on the speakers, for every data recorded.
Intead, it stops at first block of data.
Someone could tell me why?
Thank you!
Regards