SprPoP: музыка не замолкает в меню и в долгих фейдах
Насос CBL идёт из прерывания (и его запрос защёлкивается до подтверждения — проверено по MAME irqack_cb), поэтому сам звук главному циклу не нужен. А вот ПОТОКОВЫЙ трек — титульная тема играется кольцом — дочитывается с диска только в pop_music_service: страница ложится в слот, который насос уже прошёл. Этот вызов был лишь в игровом цикле, HOF и сценах, но не в меню и не в фейдах, а там главный цикл стоит секундами — кольцо опустошалось, и музыка замолкала до закрытия меню (жалоба пользователя). Добавлено: ui_wait_frame() в pop_menu.c (обслужить музыку + ждать фронт, заменил все ожидания кадра в меню) и pop_music_service() в fade_run и transition_ltr (pop_ui.c) — темп тот же, 50 раз в секунду, как в игровом цикле. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
#include "pop_arc.h"
|
||||
#include "pop_ui.h"
|
||||
#include "pop_status.h"
|
||||
#include "pop_music.h" /* pop_music_service — подкачка кольца в долгих фейдах */
|
||||
|
||||
typedef struct {
|
||||
uint8_t base;
|
||||
@@ -292,6 +293,11 @@ static uint8_t fade_run(uint8_t frames, uint8_t up, uint8_t skip)
|
||||
pop_ui_palette_dim(step, 0);
|
||||
shown = step;
|
||||
}
|
||||
/* Fade — это 2,13 с, и всё это время главный цикл стоит. Кольцо
|
||||
* потокового трека дочитывает pop_music_service, иначе музыка
|
||||
* замолкает прямо посреди перехода (та же причина, что у меню:
|
||||
* ui_wait_frame в pop_menu.c). */
|
||||
pop_music_service();
|
||||
gfx_wait_vsync();
|
||||
if (skip) {
|
||||
kbd_raw_sync();
|
||||
@@ -429,6 +435,7 @@ uint8_t pop_screen_present_ltr(void) __banked
|
||||
stripe.x = x;
|
||||
stripe.w = (uint16_t)((GFX_WIDTH - x < 4) ? GFX_WIDTH - x : 4);
|
||||
gfx_copy_page(&stripe, GFX_COPY_DIRECT);
|
||||
pop_music_service(); /* 80 кадров перехода — см. fade_run */
|
||||
gfx_wait_vsync();
|
||||
}
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user