Synchronize OPL4 track finalization
This commit is contained in:
+11
-12
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user