diff --git a/Firmware/sdk/apps/gameboy/src/gameboy_app.cpp b/Firmware/sdk/apps/gameboy/src/gameboy_app.cpp index c89f210..e0296ee 100644 --- a/Firmware/sdk/apps/gameboy/src/gameboy_app.cpp +++ b/Firmware/sdk/apps/gameboy/src/gameboy_app.cpp @@ -306,6 +306,34 @@ public: gb_run_frame(&gb); GB_PERF_ONLY(perf.runUs = nowMicros() - runStartUs;) + { + uint32_t freqHz = 0; + uint8_t loud = 0; + if (apu.computeEffectiveTone(freqHz, loud)) { + // Basic smoothing: if freq didn't change much, keep it; otherwise snap quickly + const uint32_t prev = lastFreqHz; + if (prev != 0 && freqHz != 0) { + const uint32_t diff = (prev > freqHz) ? (prev - freqHz) : (freqHz - prev); + if (diff < 15) { + freqHz = prev; // minor jitter suppression + ++stableFrames; + } else { + stableFrames = 0; + } + } else { + stableFrames = 0; + } + lastFreqHz = freqHz; + lastLoud = loud; + const uint32_t durMs = 16; + playTone(freqHz, durMs, 0); + } else { + lastFreqHz = 0; + lastLoud = 0; + // Don't enqueue anything; queue naturally drains and buzzer stops + } + } + GB_PERF_ONLY(const uint64_t renderStartUs = nowMicros();) renderGameFrame(); GB_PERF_ONLY(perf.renderUs = nowMicros() - renderStartUs;) @@ -1926,35 +1954,6 @@ private: drawLineOriginal(*self, pixels, static_cast(line)); break; } - - // Simple per-scanline hook: at end of last line, decide tone for the frame. - if (line + 1 == LCD_HEIGHT) { - uint32_t freqHz = 0; - uint8_t loud = 0; - if (self->apu.computeEffectiveTone(freqHz, loud)) { - // Basic smoothing: if freq didn't change much, keep it; otherwise snap quickly - const uint32_t prev = self->lastFreqHz; - if (prev != 0 && freqHz != 0) { - const uint32_t diff = (prev > freqHz) ? (prev - freqHz) : (freqHz - prev); - if (diff < 15) { - freqHz = prev; // minor jitter suppression - ++self->stableFrames; - } else { - self->stableFrames = 0; - } - } else { - self->stableFrames = 0; - } - self->lastFreqHz = freqHz; - self->lastLoud = loud; - const uint32_t durMs = 17; - self->playTone(freqHz, durMs, 0); - } else { - self->lastFreqHz = 0; - self->lastLoud = 0; - // Don't enqueue anything; queue naturally drains and buzzer stops - } - } } static const char* initErrorToString(enum gb_init_error_e err) {