DS Audio: Fix audio sampling slightly too quickly
Vicki Pfau vi@endrift.com
Sat, 15 Apr 2017 22:29:58 -0700
3 files changed,
14 insertions(+),
0 deletions(-)
M
CHANGES
→
CHANGES
@@ -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.h
→
include/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.c
→
src/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; + } }