-
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