DS Audio: Fix audio sampling slightly too quickly

This commit is contained in:
Vicki Pfau 2017-04-15 22:29:58 -07:00
parent c0f427597e
commit aafac329fb
3 changed files with 14 additions and 0 deletions

View File

@ -22,6 +22,7 @@ Bugfixes:
- DS GX: Properly mask address for slot 2 4x4-texel textures - DS GX: Properly mask address for slot 2 4x4-texel textures
- DS Slot-1: Emulate initial SPI command delay - DS Slot-1: Emulate initial SPI command delay
- DS: Fix exposed CPU frequencies and audio timing - DS: Fix exposed CPU frequencies and audio timing
- DS Audio: Fix audio sampling slightly too quickly
Misc: Misc:
- DS: Set boot complete bit in RAM on boot (fixes mgba.io/i/576, mgba.io/i/580, mgba.io/i/586) - 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 - DS Memory: Ensure DS9 I/O is 8-byte aligned

View File

@ -80,6 +80,7 @@ struct DSAudio {
unsigned sampleRate; unsigned sampleRate;
int32_t sampleInterval; int32_t sampleInterval;
unsigned sampleDrift;
bool forceDisableCh[16]; bool forceDisableCh[16];
int bias; int bias;

View File

@ -86,6 +86,7 @@ void DSAudioReset(struct DSAudio* audio) {
mTimingSchedule(&audio->p->ds7.timing, &audio->sampleEvent, 0); mTimingSchedule(&audio->p->ds7.timing, &audio->sampleEvent, 0);
audio->sampleRate = 0x8000; audio->sampleRate = 0x8000;
audio->sampleInterval = DS_ARM7TDMI_FREQUENCY / audio->sampleRate; audio->sampleInterval = DS_ARM7TDMI_FREQUENCY / audio->sampleRate;
audio->sampleDrift = 0;
int ch; int ch;
for (ch = 0; ch < 16; ++ch) { for (ch = 0; ch < 16; ++ch) {
@ -325,6 +326,12 @@ static void _sample(struct mTiming* timing, void* user, uint32_t cyclesLate) {
int16_t sampleLeft = _applyBias(audio, audio->sampleLeft); int16_t sampleLeft = _applyBias(audio, audio->sampleLeft);
int16_t sampleRight = _applyBias(audio, audio->sampleRight); 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); mCoreSyncLockAudio(audio->p->sync);
unsigned produced; unsigned produced;
if ((size_t) blip_samples_avail(audio->left) < audio->samples) { if ((size_t) blip_samples_avail(audio->left) < audio->samples) {
@ -351,4 +358,9 @@ static void _sample(struct mTiming* timing, void* user, uint32_t cyclesLate) {
audio->p->stream->postAudioBuffer(audio->p->stream, audio->left, audio->right); audio->p->stream->postAudioBuffer(audio->p->stream, audio->left, audio->right);
} }
mTimingSchedule(timing, &audio->sampleEvent, audio->sampleInterval - cyclesLate); mTimingSchedule(timing, &audio->sampleEvent, audio->sampleInterval - cyclesLate);
if (audio->sampleDrift >= audio->sampleRate) {
--audio->sampleInterval;
audio->sampleDrift -= audio->sampleRate;
}
} }