all repos — mgba @ aafac329fbb27d441c3915ceccc12ea15ac3556f

mGBA Game Boy Advance Emulator

DS Audio: Fix audio sampling slightly too quickly
Vicki Pfau vi@endrift.com
Sat, 15 Apr 2017 22:29:58 -0700
commit

aafac329fbb27d441c3915ceccc12ea15ac3556f

parent

c0f427597ebf649bdc7cea2e03869135fe6902cf

3 files changed, 14 insertions(+), 0 deletions(-)

jump to
M CHANGESCHANGES

@@ -22,6 +22,7 @@ - DS GX: Allow viewport to change in the middle of a frame

- DS GX: Properly mask address for slot 2 4x4-texel textures - DS Slot-1: Emulate initial SPI command delay - DS: Fix exposed CPU frequencies and audio timing + - DS Audio: Fix audio sampling slightly too quickly Misc: - DS: Set boot complete bit in RAM on boot (fixes mgba.io/i/576, mgba.io/i/580, mgba.io/i/586) - DS Memory: Ensure DS9 I/O is 8-byte aligned
M include/mgba/internal/ds/audio.hinclude/mgba/internal/ds/audio.h

@@ -80,6 +80,7 @@ size_t samples;

unsigned sampleRate; int32_t sampleInterval; + unsigned sampleDrift; bool forceDisableCh[16]; int bias;
M src/ds/audio.csrc/ds/audio.c

@@ -86,6 +86,7 @@ mTimingDeschedule(&audio->p->ds7.timing, &audio->sampleEvent);

mTimingSchedule(&audio->p->ds7.timing, &audio->sampleEvent, 0); audio->sampleRate = 0x8000; audio->sampleInterval = DS_ARM7TDMI_FREQUENCY / audio->sampleRate; + audio->sampleDrift = 0; int ch; for (ch = 0; ch < 16; ++ch) {

@@ -325,6 +326,12 @@

int16_t sampleLeft = _applyBias(audio, audio->sampleLeft); int16_t sampleRight = _applyBias(audio, audio->sampleRight); + audio->sampleDrift += DS_ARM7TDMI_FREQUENCY % audio->sampleRate; + + if (audio->sampleDrift >= audio->sampleRate) { + ++audio->sampleInterval; + } + mCoreSyncLockAudio(audio->p->sync); unsigned produced; if ((size_t) blip_samples_avail(audio->left) < audio->samples) {

@@ -351,4 +358,9 @@ if (wait && audio->p->stream && audio->p->stream->postAudioBuffer) {

audio->p->stream->postAudioBuffer(audio->p->stream, audio->left, audio->right); } mTimingSchedule(timing, &audio->sampleEvent, audio->sampleInterval - cyclesLate); + + if (audio->sampleDrift >= audio->sampleRate) { + --audio->sampleInterval; + audio->sampleDrift -= audio->sampleRate; + } }