Synchronize OPL4 track finalization

This commit is contained in:
2026-09-15 18:00:52 +03:00
parent 3ef0b1dc95
commit ffee082140
6 changed files with 41 additions and 33 deletions
+11 -12
View File
@@ -675,6 +675,7 @@ void start_playback(void)
isr_active_buf = 0;
isr_wait_ctr = 0;
isr_done = 0;
isr_final_pending = 0;
/* MultiSound ctrl: включить FM/SAA только для присутствующих чипов.
* 0xF2 = FM ON + SAA ON + normal read + chip1 (base).
@@ -763,6 +764,7 @@ void stop_playback(void)
s_buf_ready[1] = 0;
s_last_active_buf = 0;
isr_done = 0;
isr_final_pending = 0;
ints_enable();
}
@@ -865,18 +867,6 @@ 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);
@@ -1130,6 +1120,15 @@ void main(void)
/* ── 1. Буфер: максимальный приоритет ──────────────── */
update_buffer();
/* ISR исполнил весь музыкальный хвост и замер на FINALIZE.
* Пересобрать shutdown с начала чистого буфера — тот же путь,
* который используется для надёжного выхода по ESC. */
if (isr_final_pending) {
isr_final_pending = 0;
vgm_hl_pos = vgm_hl_abort_pos;
instant_abort();
}
/* ISR замер на CMD_ISR_DONE → чистый выход */
if (isr_done)
break;