GB Audio: Reoptimize channel 4

This commit is contained in:
Jeffrey Pfau 2016-12-24 18:33:45 -08:00
parent 0bf0975a5d
commit b515214fbe
2 changed files with 16 additions and 9 deletions

View File

@ -873,15 +873,21 @@ static void _fadeChannel3(struct mTiming* timing, void* user, uint32_t cyclesLat
static void _updateChannel4(struct mTiming* timing, void* user, uint32_t cyclesLate) {
struct GBAudio* audio = user;
struct GBAudioNoiseChannel* ch = &audio->ch4;
int lsb = ch->lfsr & 1;
ch->sample = lsb * 0x10 - 0x8;
ch->sample *= ch->envelope.currentVolume;
ch->lfsr >>= 1;
ch->lfsr ^= (lsb * 0x60) << (ch->power ? 0 : 8);
int cycles = ch->ratio ? 2 * ch->ratio : 1;
cycles <<= ch->frequency;
cycles *= 8;
mTimingSchedule(timing, &audio->ch4Event, audio->timingFactor * cycles - cyclesLate);
int32_t baseCycles = ch->ratio ? 2 * ch->ratio : 1;
baseCycles <<= ch->frequency;
baseCycles *= 8 * audio->timingFactor;
int32_t cycles = 0;
do {
int lsb = ch->lfsr & 1;
ch->sample = lsb * 0x10 - 0x8;
ch->sample *= ch->envelope.currentVolume;
ch->lfsr >>= 1;
ch->lfsr ^= (lsb * 0x60) << (ch->power ? 0 : 8);
cycles += baseCycles;
} while (cycles < audio->sampleInterval);
mTimingSchedule(timing, &audio->ch4Event, cycles - cyclesLate);
}
void GBAudioPSGSerialize(const struct GBAudio* audio, struct GBSerializedPSGState* state, uint32_t* flagsOut) {

View File

@ -73,6 +73,7 @@ void GBAAudioReset(struct GBAAudio* audio) {
audio->chBTimer = false;
audio->enable = false;
audio->sampleInterval = GBA_ARM7TDMI_FREQUENCY / audio->sampleRate;
audio->psg.sampleInterval = audio->sampleInterval;
blip_clear(audio->psg.left);
blip_clear(audio->psg.right);