From c71fa02bf5c6a154d4d3a029664769e870d3394f Mon Sep 17 00:00:00 2001 From: Bastien Bouclet Date: Tue, 15 Oct 2019 22:18:05 +0200 Subject: 3DS: Change the audio thread to wait for the audio buffers to complete Fixes the regular pop sounds caused by buffer underruns / clobbering of the previous implementation. --- backends/platform/3ds/osystem-audio.cpp | 34 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 19 deletions(-) (limited to 'backends/platform/3ds') diff --git a/backends/platform/3ds/osystem-audio.cpp b/backends/platform/3ds/osystem-audio.cpp index 58262372cc..043aaf1fe2 100644 --- a/backends/platform/3ds/osystem-audio.cpp +++ b/backends/platform/3ds/osystem-audio.cpp @@ -31,18 +31,16 @@ static void audioThreadFunc(void *arg) { Audio::MixerImpl *mixer = (Audio::MixerImpl *)arg; OSystem_3DS *osys = (OSystem_3DS *)g_system; - int i; const int channel = 0; int bufferIndex = 0; - const int bufferCount = 3; - const int bufferSize = 80000; // Can't be too small, based on delayMillis duration + const int bufferCount = 2; const int sampleRate = mixer->getOutputRate(); - int sampleLen = 0; - uint32 lastTime = osys->getMillis(true); - uint32 time = lastTime; + const int bufferSamples = 1024; + const int bufferSize = bufferSamples * 4; + ndspWaveBuf buffers[bufferCount]; - for (i = 0; i < bufferCount; ++i) { + for (int i = 0; i < bufferCount; ++i) { memset(&buffers[i], 0, sizeof(ndspWaveBuf)); buffers[i].data_vaddr = linearAlloc(bufferSize); buffers[i].looping = false; @@ -55,27 +53,25 @@ static void audioThreadFunc(void *arg) { ndspChnSetFormat(channel, NDSP_FORMAT_STEREO_PCM16); while (!osys->exiting) { - osys->delayMillis(100); // Note: Increasing the delay requires a bigger buffer - - time = osys->getMillis(true); - sampleLen = (time - lastTime) * 22 * 4; // sampleRate / 1000 * channelCount * sizeof(int16); - lastTime = time; + svcSleepThread(5000 * 1000); // Wake up the thread every 5 ms - if (!osys->sleeping && sampleLen > 0) { - bufferIndex++; - bufferIndex %= bufferCount; - ndspWaveBuf *buf = &buffers[bufferIndex]; + if (osys->sleeping) continue; - buf->nsamples = mixer->mixCallback(buf->data_adpcm, sampleLen); + ndspWaveBuf *buf = &buffers[bufferIndex]; + if (buf->status == NDSP_WBUF_FREE || buf->status == NDSP_WBUF_DONE) { + buf->nsamples = mixer->mixCallback(buf->data_adpcm, bufferSize); if (buf->nsamples > 0) { DSP_FlushDataCache(buf->data_vaddr, bufferSize); ndspChnWaveBufAdd(channel, buf); } + + bufferIndex++; + bufferIndex %= bufferCount; } } - for (i = 0; i < bufferCount; ++i) - linearFree(buffers[i].data_pcm8); + for (int i = 0; i < bufferCount; ++i) + linearFree(buffers[i].data_pcm16); } void OSystem_3DS::initAudio() { -- cgit v1.2.3