Финальная тема won: кольцевой стриминг с диска

Последний неозвученный кусок игры. 115 секунд и 1,2 МБ в память не влезают
никак, поэтому тема играется кольцом из шести страниц (96 КБ = 9 с): насос
идёт по кругу, а pop_music_service дочитывает файл в те страницы, которые
насос уже прошёл. Страница звучит 1,5 с и читается 33 мс — запас
сорокакратный; дистанция считается без отдельных счётчиков, потому что
страница это ровно 128 блоков насоса.

Три вещи, всплывшие при живой проверке:

- кольцо обязано сниматься при любом обычном запуске трека, иначе
  следующая тема играет по кругу первых шести страниц (поймано на титрах
  сразу после победы);
- живые сцены комнаты принцессы теперь открывают CBL сами (cut_begin):
  pop_ending_show глушит звук первым действием, и «arrived to princess»
  не звучал вовсе;
- тема дослушивается до конца с возможностью прервать клавишей — как
  seg001:637. У оригинала там стоит ввод имени в таблицу рекордов; когда
  он появится, ожидание переедет за него (задача HOF-ENTRY).

Проверено в MAME на сборке LEVEL=14: после встречи с принцессой звучит
тема победы (id 56, кольцо 6), курсор уходит далеко за размер кольца —
подкачка успевает. Host-тесты: 15 наборов.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-26 12:32:40 +03:00
parent 5d912f0f3f
commit faec9a7d3a
10 changed files with 256 additions and 17 deletions
+8
View File
@@ -19,6 +19,7 @@
#include "pop_timer.h"
#include "pop_pal.h"
#include "pop_ui.h"
#include "pop_music.h" /* подкачка потоковой темы победы */
#include "pop_hof.h"
#define HOF_COUNT 5
@@ -260,10 +261,15 @@ static void hof_draw(uint8_t edit_row)
pop_screen_present(page);
}
/* Ожидания на экране рекордов держат ПОТОКОВУЮ музыку: победная тема
* (1,2 МБ) играет кольцом страниц, и дочитывать её надо всё время, пока
* игрок смотрит таблицу — иначе насос догонит загрузчик и пойдёт по
* кругу старыми данными. */
static void hof_wait_release(void)
{
while (kbd_raw_any_down()) {
kbd_raw_sync();
pop_music_service();
gfx_wait_vsync();
}
}
@@ -340,6 +346,7 @@ void pop_hof_show(void) __banked
hof_wait_release();
while (!kbd_raw_any_down()) {
kbd_raw_sync();
pop_music_service();
gfx_wait_vsync();
}
hof_wait_release();
@@ -363,6 +370,7 @@ void pop_hof_show_title(void) __banked
hof_wait_release();
while (!kbd_raw_any_down()) {
kbd_raw_sync();
pop_music_service();
gfx_wait_vsync();
}
hof_wait_release();