• Nikitos's avatar
    Звук: seek/position и приоритеты каналов вместо «глушим нулевой»
    · 9a5c064e
    Nikitos создал
    Закрывает два пункта §11 «осталось незакрытым».
    
    ЧТО БЫЛО НЕ ТАК: r2d_audio_play при нехватке каналов ВСЕГДА переиспользовал
    канал 0 — то есть важная реплика глушилась первым же шагом по траве, а
    приоритета не существовало вовсе. Перемотки тоже не было.
    
    ЧТО СДЕЛАНО:
    * C: r2d_audio_play(..., int priority) — ищет свободный канал, иначе вытесняет
      САМЫЙ НЕВАЖНЫЙ и только если новый не менее важен; иначе -1 (лучше не играть,
      чем заглушить важное). Приоритет канала хранится в a->channel_priority;
    * C: r2d_audio_seek / r2d_audio_position / r2d_audio_channel_duration /
      r2d_audio_channel_priority — через MIX_Set/GetTrackPlaybackPosition (каналы
      движка это MIX_Track) и MIX_GetAudioDuration; кадры переводятся в секунды по
      частоте микшера;
    * engine.audio.play(id, volume, pan, loop, priority), seek, position,
      channelDuration, channelPriority, channelCount;
    * $.sound.play(..., { priority }), seek, position, durationOf, priorityOf, busy.
    
    ПРОВЕРКА (tests/agent/highlevel_sound_seek_test.py, 22 проверки). Файл звука
    тест ГЕНЕРИРУЕТ сам (2 с, 440 Гц) — в фикстурах звуков нет. Проверено: позиция
    растёт; seek(0.30) даёт позицию ≈0.30; перемотка в конец освобождает канал; на
    неиграющем канале seek → false, position → -1; при 16 занятых каналах важный
    звук (9) вытесняет неважный и НЕ глушит другой важный; слабый (-5) получает -1 и
    важные остаются; $.sound.priorityOf/durationOf/busy работают.
    
    МОЯ ЖЕ ОШИБКА В ТЕСТЕ, из-за которой сначала было три ложных провала: я передал
    ЛИШНИЙ ноль — play(id,1,0,0,0,pr) вместо play(id,1,0,0,pr) — и приоритет уехал
    на шестой аргумент, которого нет. Плюс тон 0.5 с успевал доиграть между
    проверками, и «отказ» случался по другой причине. Исправлено и отмечено
    комментарием в тесте.
    
    ДОКИ: sound.md §2.1 (приоритеты, перемотка, зачем вытеснять неважного),
    API.md (одна строка на функцию), TASKS §11 — из остатков убраны оба пункта.
    
    Полный qjs, агентские тесты, doc_coverage, doc_claims, duplicate_keys, быстрый
    набор — зелёные.
    9a5c064e