feat(slices): аудио-устройства слайса на вкладке Slices (in/out на слот)

У каждого слайса B..G — свои Audio out / Audio in рядом с его CAT-портом.
Списки те же, что у главных комбо; пустой выбор (Default/None) = прежнее
поведение, общий выход/вход приложения.

Это устройство СЛОТА (буквы), а не шаблон:
  • смена настройки применяется к слайсу, стоящему на слоте, немедленно
    (SetSliceSlotAudio) — как и вся остальная форма настроек EWSDR;
  • слайс, который встанет на слот позже (создание/restore из персиста),
    получает то же устройство: слот сильнее аргумента AddSlice;
  • выбор во вкладке AUD флага пишется обратно в настройку слота
    (StoreSliceSlotAudio) — вкладка всегда показывает реальность, а не
    вторую, конкурирующую истину.

Хранятся ИМЕНА PortAudio-устройств, а не индексы: порядок перечисления
между запусками плавает. Имя устройства, которого сейчас нет в системе,
не теряется — комбо добавляет его в список и держит выбранным.

ApplySliceSlotAudio зовётся на старте и на смене устройства (rfDevice):
слайсы восстанавливаются позже, слот должен знать свои звуковухи заранее.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-25 14:33:42 +03:00
co-authored by Claude Opus 5
parent 2d15da0462
commit 20186ce132
5 changed files with 284 additions and 13 deletions
+21 -1
View File
@@ -134,7 +134,27 @@ SmartSDR: Transmit Slice переключён, а не одолжен). Бейд
## 4. Настройки
Вкладка **Slices**: на каждый слайс B..G — `Enable CAT TCP server`, `Port`
(по умолчанию 19091, 19092, …) и `Auto TX`.
(по умолчанию 19091, 19092, …), `Auto TX`, `Audio out`, `Audio in`.
### 4.1 Аудио слота
`Audio out`/`Audio in` — это **устройство слота (буквы)**, а не шаблон:
* смена настройки применяется немедленно к слайсу, который стоит на слоте
сейчас (`TRadioController.SetSliceSlotAudio`);
* слайс, который встанет на слот позже (создание/восстановление из персиста),
получает то же устройство — оно сильнее того, что попросил вызывающий
`AddSlice`;
* выбор во вкладке `AUD` флага слайса пишется обратно в настройку слота
(`SetSliceDevice`/`SetSliceInDevice``MainForm.StoreSliceSlotAudio`), так
что вкладка всегда показывает реальное устройство — одна истина, два места
правки;
* пусто (`Default (app output)` / `None (app input)`) — как раньше: общий выход
приложения и общий вход.
Хранятся **имена** PortAudio-устройств, а не индексы: порядок перечисления между
запусками плавает. Имя отсутствующего сейчас устройства (кабель не поднят) не
теряется — комбо добавляет его в список и держит выбранным.
* Хранятся вместе с остальным CAT: корневая секция `cat` (`slice_en_N`,
`slice_port_N`, `slice_autotx_N`) + device-blob (`cat_slice_*`), не привязаны