Ctrl+S — вкл/выкл звук; чит «выдать меч» убран
Порт Ctrl+S из SDLPoP (seg000:657). Выключение реально закрывает CBL, а не глушит сэмпл: иначе насос продолжал бы отдавать блоки тишины и платить те же 3,26 % процессорного времени. Флаг намерения pop_snd_want отдельно от pop_snd_ok: последний гасит служебная пауза на время загрузки уровня, и правь Ctrl+S только его — первая же смена уровня вернула бы выключенный звук. Индикация: пурпурная палочка в борте, когда звука НЕТ (включённый слышно и так, а молчание неотличимо от «нечему звучать»). Чит S «выдать меч» был отладочным и больше не нужен — снят, клавиша ушла под звук. Замер цены звука — sound_plan.md §9: 8 001 такт на прерывание при периоде 245 759 (3,26 % времени), +2,2 % к работе кадра в сцене 11/15, период кадра не сдвинулся ни разу. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -32,6 +32,7 @@ int pop_sfx_init(void) __banked
|
||||
}
|
||||
}
|
||||
snd_blk = blk;
|
||||
pop_snd_want = 1; /* набор есть — звук по умолчанию включён */
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -52,8 +53,9 @@ int pop_sfx_init(void) __banked
|
||||
* резиденте W2 тесная, и её отказ ронял бы весь звук. */
|
||||
int pop_sfx_start(void) __banked
|
||||
{
|
||||
if (pop_snd_ok) return 0;
|
||||
if (!snd_blk) return -1; /* набор не загружен */
|
||||
if (pop_snd_ok) return 0;
|
||||
if (!pop_snd_want) return 0; /* выключено пользователем (Ctrl+S) */
|
||||
if (!snd_blk) return -1; /* набор не загружен */
|
||||
if (cbl_open(CBL_FREQ_10K9, CBL_FMT_MONO8, CBL_PUMP_OTIR,
|
||||
CBL_UNDERRUN_APP, pop_sfx_fill) != 0)
|
||||
return -1;
|
||||
@@ -74,3 +76,22 @@ void pop_sfx_close(void) __banked
|
||||
pop_sfx_pause();
|
||||
if (snd_blk) { mem_free_block(snd_blk); snd_blk = 0; }
|
||||
}
|
||||
|
||||
/* Ctrl+S — порт `turn_sound_on_off((!is_sound_on) * 15)` из SDLPoP
|
||||
* (seg000:657). Выключение реально ЗАКРЫВАЕТ CBL, а не глушит сэмпл:
|
||||
* иначе насос продолжал бы отдавать блоки тишины 85 раз в секунду, а это
|
||||
* 3,3 % процессорного времени ни за что (замер: 8 001 такт на прерывание
|
||||
* при периоде 245 759). Открытие обратно дешёвое — cbl_open только
|
||||
* настраивает железо, страницы набора никуда не девались. */
|
||||
void pop_sfx_toggle(void) __banked
|
||||
{
|
||||
if (pop_snd_want) {
|
||||
pop_sfx_pause(); /* pause сам не трогает want... */
|
||||
pop_snd_want = 0; /* ...поэтому гасим его следом */
|
||||
} else {
|
||||
pop_snd_want = 1;
|
||||
/* Набора может не быть вовсе (файлы не прочитались, страницы не
|
||||
* дались) — тогда откатываем флаг, чтобы индикация не врала. */
|
||||
if (pop_sfx_start() != 0) pop_snd_want = 0;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user