diff --git a/applications/SprPoP/src/pop_menu.c b/applications/SprPoP/src/pop_menu.c index 82fda82..18bcc6f 100644 --- a/applications/SprPoP/src/pop_menu.c +++ b/applications/SprPoP/src/pop_menu.c @@ -197,10 +197,21 @@ static uint8_t ui_begin(void) gfx_rect_t full; uint8_t back = (uint8_t)(gfx_get_visible_page() ^ 1); - /* Полностраничная accel-копия держит DI дольше половины CBL-буфера. - * Закрываем вывод, иначе железо повторяет старые 128 байт (скрежет). - * ui_end откроет его уже с заново заполненной тишиной. */ - pop_sfx_pause(); + /* ЗВУК ЗДЕСЬ БОЛЬШЕ НЕ ГЛУШИМ (снято 2026-08-28). + * + * Был вызов pop_sfx_pause() с обоснованием «полностраничная accel-копия + * держит DI дольше половины CBL-буфера, иначе железо повторяет старые + * 128 байт». Обоснование устарело: лист, который зовёт gfx_copy_page + * (_bgi_scroll_rows_raw), режет DI бандами по 16 строк — это ~1,6 мс + * против дедлайна насоса 11,7 мс, и окно прерываний между бандами есть. + * Тот же полностраничный копир каждый кадр делают игровой цикл и + * катсцены, и звук там не рвётся. + * + * А цена была слышимой: pause закрывает CBL целиком (cbl_close), курсор + * трека остаётся на месте, и короткая мелодия начала уровня замирала + * ровно на время перерисовки меню — «тормозится на кусочек» (жалоба + * пользователя 2026-08-28). У оригинала такого нет и быть не может: + * там нет насоса, который надо кормить руками. */ gfx_set_draw_page(back); full.x = 0; full.y = 0; full.w = GFX_WIDTH; full.h = GFX_HEIGHT; gfx_copy_page(&full, GFX_COPY_DIRECT); @@ -230,6 +241,10 @@ static void ui_end(uint8_t back) { ui_wait_frame(); /* готовый кадр показать только на фронте */ gfx_set_visible_page(back); + /* Парный к снятому pop_sfx_pause (см. ui_begin) вызов оставлен: он + * идемпотентен (открытый CBL возвращает 0 сразу) и чинит случай, когда + * в меню вошли при закрытом выводе — например сразу после загрузки + * уровня, которая глушит звук намеренно. */ (void)pop_sfx_start(); }