mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +00:00
feat(slices): этап 3.2 — WDSPEngine per-pan (аккумулятор, анализаторы, слайсы в панах)
- общая IQ-очередь с TIQQueueItem.PanId (64→256 слотов); DSP-поток диспетчеризует пан-пакеты в PushPanItemToDSP: декод, feed анализатора PAN_DISP_BASE+PanId, аккумулятор, ProcessSlicesFor(PanId) под FSliceLock - пан-анализаторы: Create/DestroyPanAnalyzer + ApplyPanAnalyzerSettings (rate пана, без зума — пан-зум в 3.3+), живут в OpenAnalyzer/CloseAnalyzer, общие настройки дисплея перекатываются (ReapplyPanDisplaySettings) - слайсы в панах: TSliceChan.PanId, AddSlice(..., APanId), OpenSliceChannel от rate/блока своего пана, SliceDSPRateFor (WFM от rate пана); блок пана = FAudioBufSize*Rate/FAudioRate => аудио-блок слайсов неизменен - выдача пикселей: OnPanSpectrum/OnPanWaterfall(PanId,...) из display-потока, GetPixels пана под FSliceLock, колбэки вне лока - MAX_PANS=4 переехал в WDSPEngine (единый движок/контроллер/UI) - контроллер: AddPanDDC создаёт пан в движке до включения DDC, RemovePanDDC убирает слайсы (со звуковухами)+движок+DDC, гейт/NCO слайсов от центра своего пана, ретюн пана двигает его слайсы - смоук-тест на libwdsp без железа ALL PASS: пик спектра пана точно на месте, слайс пана выдал 1 кГц RMS 0.68, главный тракт жив, RemovePan чисто Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -283,6 +283,43 @@ static/глобального. (CPU-LUT палитры общий — это о
|
||||
создание/удаление пана только под локом, как переоткрытие слайсов при
|
||||
ChangeSampleRate).
|
||||
|
||||
**СТАТУС 3.2 (2026-07-11): РЕАЛИЗОВАНО + СМОУК-ТЕСТ БЕЗ ЖЕЛЕЗА ПРОШЁЛ
|
||||
ПОЛНОСТЬЮ.** Отличия/уточнения против текста плана:
|
||||
|
||||
- Пан-пакеты идут в ОБЩУЮ очередь IQ с меткой `TIQQueueItem.PanId` (0 =
|
||||
главный) — порядок прихода сохранён, один семафор; `IQ_QUEUE_SIZE` 64→256.
|
||||
Диспетчер в `TDSPThread` → `PushPanItemToDSP` (декод + feed анализатора +
|
||||
аккумулятор + `ProcessSlicesFor(PanId)`), всё под `FSliceLock`.
|
||||
- `MAX_PANS=4` переехал в WDSPEngine (единый для движка/контроллера/UI);
|
||||
`PAN_DISP_BASE=8` (id панов 9..11).
|
||||
- Блок пана `BufSize = FAudioBufSize·Rate/FAudioRate` ⇒ выходной аудио-блок
|
||||
слайсов ЛЮБОГО пана всегда `FAudioBufSize` (буферы не перевыделяются);
|
||||
`AllocSliceBuffers` берёт максимум блока по всем панам. Rate пана обязан
|
||||
быть кратен 48к (гейт в `AddPan`).
|
||||
- `TSliceChan.PanId` + `AddSlice(..., APanId)`; `OpenSliceChannel` открывает
|
||||
канал от rate/блока СВОЕГО пана; `SliceDSPRateFor(Mode, InRate)` — WFM-слайс
|
||||
поднимается от rate пана. Слайсы панов переживают `ChangeSampleRate`
|
||||
главного (пересоздаются в Open, как раньше).
|
||||
- Анализатор пана: `CreatePanAnalyzer`/`ApplyPanAnalyzerSettings` (без
|
||||
span-clip/zoom — пан-зум в 3.3+), живёт в OpenAnalyzer/CloseAnalyzer
|
||||
(пересоздание при смене rate главного). Смена детектора/усреднения/FFT/
|
||||
пикселей главного перекатывается на паны (`ReapplyPanDisplaySettings`).
|
||||
- Выдача пикселей: `OnPanSpectrum`/`OnPanWaterfall(PanId, Pixels, N)` из
|
||||
display-потока; `GetPixels` пана под `FSliceLock` (гонка с RemovePan),
|
||||
колбэки — вне лока.
|
||||
- Контроллер: `TCtrlSlice.PanId`, `AddSlice(..., APanId)`, гейт/`CapturedSpan`
|
||||
per-pan, `SetSliceTarget`/`RefreshSliceShifts` относительно центра СВОЕГО
|
||||
пана, ретюн пана двигает NCO его слайсов; `AddPanDDC` создаёт пан в движке
|
||||
(до включения DDC), `RemovePanDDC` убирает слайсы (со звуковухами) + движок
|
||||
+ DDC.
|
||||
- Смоук-тест (scratchpad `pantest.pas`, консольный, libwdsp): AddPan-валидации,
|
||||
спектр/водопад пана 384к с тоном +52к — пик ровно на месте (пиксель 650/651),
|
||||
слайс пана (USB, NCO +51к) выдал аудио-тон 1043 Гц RMS 0.68, главный тракт
|
||||
параллельно жив (пик −30к на месте), RemovePan мгновенно глушит слайс, без
|
||||
крэшей. Попутно зафиксирована конвенция синтетического IQ: «+Гц на дисплее»
|
||||
= I=cos, Q=−sin (полезно для будущих тестов).
|
||||
- НЕ проверено на эфире (нужен UI 3.3, панов никто не создаёт из GUI).
|
||||
|
||||
### 3.3 — UI: второй панадаптер в главном окне
|
||||
|
||||
- **Стек панов**: область спектра = вертикальный стек `TPanafallPanel` с
|
||||
|
||||
Reference in New Issue
Block a user