2014-09-03 20:36:05 +02:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <malloc.h>
|
|
|
|
#include <3ds.h>
|
|
|
|
|
|
|
|
int main()
|
|
|
|
{
|
2015-01-03 01:06:22 +01:00
|
|
|
gfxInitDefault();
|
2015-07-07 22:21:47 +02:00
|
|
|
consoleInit(GFX_BOTTOM, NULL);
|
2015-01-09 09:14:01 +01:00
|
|
|
|
2015-11-07 07:02:37 +01:00
|
|
|
bool initialized = true;
|
|
|
|
|
|
|
|
u32 micbuf_size = 0x30000;
|
|
|
|
u32 micbuf_pos = 0;
|
2015-11-19 00:45:01 +01:00
|
|
|
u8* micbuf = memalign(0x1000, micbuf_size);
|
2015-11-07 07:02:37 +01:00
|
|
|
|
|
|
|
printf("Initializing CSND...\n");
|
|
|
|
if(R_FAILED(csndInit()))
|
2015-07-07 22:21:47 +02:00
|
|
|
{
|
2015-11-07 07:02:37 +01:00
|
|
|
initialized = false;
|
|
|
|
printf("Could not initialize CSND.\n");
|
|
|
|
} else printf("CSND initialized.\n");
|
|
|
|
|
|
|
|
printf("Initializing MIC...\n");
|
|
|
|
if(R_FAILED(micInit(micbuf, micbuf_size)))
|
|
|
|
{
|
|
|
|
initialized = false;
|
|
|
|
printf("Could not initialize MIC.\n");
|
|
|
|
} else printf("MIC initialized.\n");
|
|
|
|
|
|
|
|
u32 micbuf_datasize = micGetSampleDataSize();
|
2014-09-03 20:36:05 +02:00
|
|
|
|
2015-11-07 07:02:37 +01:00
|
|
|
u32 audiobuf_size = 0x100000;
|
|
|
|
u32 audiobuf_pos = 0;
|
|
|
|
u8* audiobuf = linearAlloc(audiobuf_size);
|
2014-09-03 20:36:05 +02:00
|
|
|
|
2015-11-07 07:02:37 +01:00
|
|
|
if(initialized) printf("Hold A to record, release to play.\n");
|
|
|
|
printf("Press START to exit.\n");
|
2014-09-03 20:36:05 +02:00
|
|
|
|
2014-11-02 18:58:37 +01:00
|
|
|
while(aptMainLoop())
|
2014-09-03 20:36:05 +02:00
|
|
|
{
|
2014-11-02 18:58:37 +01:00
|
|
|
hidScanInput();
|
2014-11-25 05:42:47 +01:00
|
|
|
gspWaitForVBlank();
|
|
|
|
|
|
|
|
u32 kDown = hidKeysDown();
|
|
|
|
if (kDown & KEY_START)
|
|
|
|
break; // break in order to return to hbmenu
|
2014-09-03 20:36:05 +02:00
|
|
|
|
2015-11-07 07:02:37 +01:00
|
|
|
if(initialized)
|
2014-11-02 18:58:37 +01:00
|
|
|
{
|
2014-11-25 05:42:47 +01:00
|
|
|
if(kDown & KEY_A)
|
|
|
|
{
|
|
|
|
audiobuf_pos = 0;
|
2015-11-07 07:02:37 +01:00
|
|
|
micbuf_pos = 0;
|
2014-09-03 20:36:05 +02:00
|
|
|
|
2015-11-07 07:02:37 +01:00
|
|
|
printf("Stopping audio playback...\n");
|
|
|
|
CSND_SetPlayState(0x8, 0);
|
|
|
|
if(R_FAILED(CSND_UpdateInfo(0))) printf("Failed to stop audio playback.\n");
|
2014-09-03 20:36:05 +02:00
|
|
|
|
2015-11-07 07:02:37 +01:00
|
|
|
printf("Starting sampling...\n");
|
2015-11-08 20:24:04 +01:00
|
|
|
if(R_SUCCEEDED(MICU_StartSampling(MICU_ENCODING_PCM16_SIGNED, MICU_SAMPLE_RATE_16360, 0, micbuf_datasize, true))) printf("Now recording.\n");
|
2015-11-07 07:02:37 +01:00
|
|
|
else printf("Failed to start sampling.\n");
|
2014-11-25 05:42:47 +01:00
|
|
|
}
|
2014-09-03 20:36:05 +02:00
|
|
|
|
2014-11-25 05:42:47 +01:00
|
|
|
if((hidKeysHeld() & KEY_A) && audiobuf_pos < audiobuf_size)
|
|
|
|
{
|
2015-11-07 07:02:37 +01:00
|
|
|
u32 micbuf_readpos = micbuf_pos;
|
|
|
|
micbuf_pos = micGetLastSampleOffset();
|
|
|
|
while(audiobuf_pos < audiobuf_size && micbuf_readpos != micbuf_pos)
|
|
|
|
{
|
|
|
|
audiobuf[audiobuf_pos] = micbuf[micbuf_readpos];
|
|
|
|
audiobuf_pos++;
|
|
|
|
micbuf_readpos = (micbuf_readpos + 1) % micbuf_datasize;
|
|
|
|
}
|
2014-11-25 05:42:47 +01:00
|
|
|
}
|
2014-09-03 20:36:05 +02:00
|
|
|
|
2014-11-25 05:42:47 +01:00
|
|
|
if(hidKeysUp() & KEY_A)
|
|
|
|
{
|
2015-11-07 07:02:37 +01:00
|
|
|
printf("Stoping sampling...\n");
|
2015-11-08 20:24:04 +01:00
|
|
|
if(R_FAILED(MICU_StopSampling())) printf("Failed to stop sampling.\n");
|
2014-11-25 05:42:47 +01:00
|
|
|
|
2015-11-07 07:02:37 +01:00
|
|
|
printf("Starting audio playback...\n");
|
|
|
|
if(R_SUCCEEDED(GSPGPU_FlushDataCache(audiobuf, audiobuf_pos)) && R_SUCCEEDED(csndPlaySound(0x8, SOUND_ONE_SHOT | SOUND_FORMAT_16BIT, 16360, 1.0, 0.0, (u32*)audiobuf, NULL, audiobuf_pos))) printf("Now playing.\n");
|
|
|
|
else printf("Failed to start playback.\n");
|
2014-11-25 05:42:47 +01:00
|
|
|
}
|
2014-09-03 20:36:05 +02:00
|
|
|
}
|
2014-11-02 18:58:37 +01:00
|
|
|
|
|
|
|
gfxFlushBuffers();
|
|
|
|
gfxSwapBuffers();
|
2014-09-03 20:36:05 +02:00
|
|
|
}
|
|
|
|
|
2014-11-25 05:42:47 +01:00
|
|
|
linearFree(audiobuf);
|
2014-09-03 20:36:05 +02:00
|
|
|
|
2015-11-07 07:02:37 +01:00
|
|
|
micExit();
|
|
|
|
free(micbuf);
|
|
|
|
|
|
|
|
csndExit();
|
2014-09-03 20:36:05 +02:00
|
|
|
gfxExit();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|