mirror of https://github.com/mgba-emu/mgba.git
Wii: Initial, very broken audio support
This commit is contained in:
parent
eb0366b61e
commit
dabd72ac13
|
@ -25,6 +25,7 @@ static void GBAWiiFrame(void);
|
||||||
static bool GBAWiiLoadGame(const char* path);
|
static bool GBAWiiLoadGame(const char* path);
|
||||||
|
|
||||||
static void _postVideoFrame(struct GBAAVStream*, struct GBAVideoRenderer* renderer);
|
static void _postVideoFrame(struct GBAAVStream*, struct GBAVideoRenderer* renderer);
|
||||||
|
static void _audioDMA(void);
|
||||||
|
|
||||||
static struct GBA gba;
|
static struct GBA gba;
|
||||||
static struct ARMCore cpu;
|
static struct ARMCore cpu;
|
||||||
|
@ -41,9 +42,18 @@ static GXTexObj tex;
|
||||||
static void* framebuffer[2];
|
static void* framebuffer[2];
|
||||||
static int whichFb = 0;
|
static int whichFb = 0;
|
||||||
|
|
||||||
|
static struct GBAStereoSample audioBuffer[2][SAMPLES] __attribute__ ((__aligned__(32)));
|
||||||
|
static size_t audioBufferSize = 0;
|
||||||
|
static int currentAudioBuffer = 0;
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
VIDEO_Init();
|
VIDEO_Init();
|
||||||
PAD_Init();
|
PAD_Init();
|
||||||
|
AUDIO_Init(0);
|
||||||
|
AUDIO_SetDSPSampleRate(AI_SAMPLERATE_48KHZ);
|
||||||
|
AUDIO_RegisterDMACallback(_audioDMA);
|
||||||
|
|
||||||
|
memset(audioBuffer, 0, sizeof(audioBuffer));
|
||||||
|
|
||||||
#if !defined(COLOR_16_BIT) && !defined(COLOR_5_6_5)
|
#if !defined(COLOR_16_BIT) && !defined(COLOR_5_6_5)
|
||||||
#error This pixel format is unsupported. Please use -DCOLOR_16-BIT -DCOLOR_5_6_5
|
#error This pixel format is unsupported. Please use -DCOLOR_16-BIT -DCOLOR_5_6_5
|
||||||
|
@ -140,8 +150,8 @@ int main() {
|
||||||
GBAAudioResizeBuffer(&gba.audio, SAMPLES);
|
GBAAudioResizeBuffer(&gba.audio, SAMPLES);
|
||||||
|
|
||||||
#if RESAMPLE_LIBRARY == RESAMPLE_BLIP_BUF
|
#if RESAMPLE_LIBRARY == RESAMPLE_BLIP_BUF
|
||||||
blip_set_rates(gba.audio.left, GBA_ARM7TDMI_FREQUENCY, 44100);
|
blip_set_rates(gba.audio.left, GBA_ARM7TDMI_FREQUENCY, 48000);
|
||||||
blip_set_rates(gba.audio.right, GBA_ARM7TDMI_FREQUENCY, 44100);
|
blip_set_rates(gba.audio.right, GBA_ARM7TDMI_FREQUENCY, 48000);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!GBAWiiLoadGame("/rom.gba")) {
|
if (!GBAWiiLoadGame("/rom.gba")) {
|
||||||
|
@ -149,6 +159,21 @@ int main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
|
#if RESAMPLE_LIBRARY == RESAMPLE_BLIP_BUF
|
||||||
|
int available = blip_samples_avail(gba.audio.left);
|
||||||
|
if (available + audioBufferSize > SAMPLES) {
|
||||||
|
available = SAMPLES - audioBufferSize;
|
||||||
|
}
|
||||||
|
if (available > 0) {
|
||||||
|
blip_read_samples(gba.audio.left, &audioBuffer[currentAudioBuffer][audioBufferSize].left, available, true);
|
||||||
|
blip_read_samples(gba.audio.right, &audioBuffer[currentAudioBuffer][audioBufferSize].right, available, true);
|
||||||
|
audioBufferSize += available;
|
||||||
|
}
|
||||||
|
if (audioBufferSize == SAMPLES && !AUDIO_GetDMAEnableFlag()) {
|
||||||
|
_audioDMA();
|
||||||
|
AUDIO_StartDMA();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
PAD_ScanPads();
|
PAD_ScanPads();
|
||||||
u16 padkeys = PAD_ButtonsHeld(0);
|
u16 padkeys = PAD_ButtonsHeld(0);
|
||||||
int keys = 0;
|
int keys = 0;
|
||||||
|
@ -284,3 +309,13 @@ static void _postVideoFrame(struct GBAAVStream* stream, struct GBAVideoRenderer*
|
||||||
UNUSED(renderer);
|
UNUSED(renderer);
|
||||||
GBAWiiFrame();
|
GBAWiiFrame();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _audioDMA(void) {
|
||||||
|
if (!audioBufferSize) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
currentAudioBuffer = !currentAudioBuffer;
|
||||||
|
DCFlushRange(audioBuffer[currentAudioBuffer], audioBufferSize * sizeof(struct GBAStereoSample));
|
||||||
|
AUDIO_InitDMA((u32) audioBuffer[currentAudioBuffer], audioBufferSize * sizeof(struct GBAStereoSample));
|
||||||
|
audioBufferSize = 0;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue