Prevent non-loop VGM playback overrun

This commit is contained in:
2026-09-15 15:11:24 +03:00
parent 1686838e03
commit c6004c19fb
5 changed files with 12 additions and 11 deletions
+12 -3
View File
@@ -861,6 +861,18 @@ void update_playback_info(void)
sec = isr_play_seconds;
/* Страховка для VGM без разрешённого loop. Нормальный путь
* заканчивается на opcode 0x66; если нестандартный хвост до него не
* дошёл, не оставляем OPL4 удерживать последнюю ноту бесконечно.
* Две секунды запаса покрывают округление total_samples и уже
* поставленные в ISR команды. */
if (!vgm_loop_enabled && vgm_total_seconds &&
sec >= (uint16_t)(vgm_total_seconds + 2u))
{
vgm_hl_pos = vgm_hl_abort_pos;
instant_abort();
}
sec_changed = (sec != s_last_displayed_sec);
loop_changed = (vgm_loop_count != s_last_loop_count);
@@ -1124,21 +1136,18 @@ void main(void)
if (key == KEY_NEXT)
{
vgm_hl_pos = vgm_hl_abort_pos;
vgm_song_ended = 0;
wc_exit_code = WC_EXIT_NEXT;
instant_abort();
}
else if (key == KEY_PREV)
{
vgm_hl_pos = vgm_hl_abort_pos;
vgm_song_ended = 0;
wc_exit_code = WC_EXIT_PREV;
instant_abort();
}
else if (key == KEY_ESC)
{
vgm_hl_pos = vgm_hl_abort_pos;
vgm_song_ended = 0;
wc_exit_code = WC_EXIT_ESC;
instant_abort();
}