mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +00:00
fix(tci): SAVE отдаёт писателю сами куски записи, а не сплошную копию
Потолок 128 МБ всё ещё пробивался примерно вдвое на пике: Take собирал
линейную копию ДО освобождения FChunks, поэтому при полном бюджете рядом
жили ~128 МБ кусков и ~128 МБ копии, а счётчик показывал 128. Передача
резерва писателю (9b77809) закрывала учёт, но не сам пик.
Копии больше нет вовсе. Take отдаёт куски КАК ЕСТЬ — новый TTCIRecTake
(Chunks + Chunk + Count + Reserved), — и вместе с ними уезжает их место в
бюджете целиком. TTCIWavWriter пишет куски в файл подряд: в WAV сэмплы и
так лежат встык, а хвост последнего куска за Count просто не наш. Место
отпускается в ReleaseData, ровно один раз на любом пути выхода Execute.
Продовый путь теперь не выделяет под запись ни одного лишнего байта:
TTCIPcm остался только внутри куска. Склейка нужна одному стенду, чтобы
проверять порядок и уровень, — она и живёт в стенде (FlatTake).
Стенд 199/199: 2.5 с записи отдаются ТРЕМЯ кусками по секунде (свёрнутая
копия дала бы один), счёт бюджета при Take не меняется, резерва хватает
на отданные куски, склеенные куски дают непрерывный звук, писатель
возвращает резерв по окончании. Проверено, что копирующая реализация Take
краснит четыре проверки. GUI (--ws=qt6) и демон зелёные.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+14
-9
@@ -529,13 +529,16 @@ ExpertSDR3 давно бы не было.
|
||||
Спрашивается при выделении каждого куска. Отказ не рушит запись: набранное
|
||||
остаётся сохраняемым, просто дальше она не растёт — иначе клиент терял бы
|
||||
уже записанное из-за чужой записи на другом приёмнике. ★`SAVE` бюджет не
|
||||
обходит: `Take` собирает куски в сплошную копию и **передаёт ей их резерв**
|
||||
(out-параметр `Reserved`), а не возвращает его сразу — копия живёт дальше в
|
||||
`TTCIWavWriter`, и отпускает место он же, когда данные больше не нужны
|
||||
(`ReleaseData` — ровно один раз, сколько бы путей выхода ни было у
|
||||
`Execute`). Иначе один `SAVE` поднимал бы настоящее потребление вдвое, а на
|
||||
медленном или зависшем сетевом каталоге очередь writer-потоков росла бы
|
||||
мимо потолка вовсе.
|
||||
обходит **и не удваивает пик**: `Take` отдаёт писателю САМИ КУСКИ
|
||||
(`TTCIRecTake`) вместе с их местом в бюджете, а не сплошную копию. Копия
|
||||
была бы худшим из вариантов ровно там, где памяти меньше всего: при полном
|
||||
бюджете рядом жили бы 128 МБ кусков и 128 МБ копии, а счётчик показывал бы
|
||||
128. Куски и так лежат встык, поэтому `TTCIWavWriter` пишет их в файл
|
||||
подряд (хвост последнего за `Count` — не данные), а место отпускает в
|
||||
`ReleaseData` — ровно один раз, сколько бы путей выхода ни было у
|
||||
`Execute`. Пока писатель ждёт медленный или зависший сетевой каталог, эти
|
||||
байты остаются занятыми: потолок держит и очередь сохранений, а не только
|
||||
сами записи.
|
||||
3. **Освобождение по трём событиям, а не по одному.** Раньше срок проверял
|
||||
только `Feed`, то есть DSP-поток — а к мёртвому приёмнику он не приходит
|
||||
никогда, и `START` на несуществующий номер оставлял память навсегда.
|
||||
@@ -868,8 +871,10 @@ ExpertSDR3 давно бы не было.
|
||||
выделяет ни байта, бюджет растёт кусками по мере звука и возвращается по
|
||||
`Free`, потолок берётся целиком и сверх него следует отказ, при отказе запись
|
||||
не рушится, окно истекает по часам **без единого `Feed`** и отдаёт память
|
||||
само, `Take` отдаёт резерв размером с копию и после него занят ровно он, а
|
||||
писатель возвращает этот резерв по окончании записи. ★Имя файла: простое имя ложится в каталог записей, а каталог из
|
||||
само, `Take` отдаёт САМИ КУСКИ (2.5 с записи = три куска по секунде, а не
|
||||
один свёрнутый — сплошной копии не появляется ни на миг), счёт бюджета при
|
||||
этом не меняется, склеенные куски дают непрерывный звук, и писатель
|
||||
возвращает резерв по окончании записи. ★Имя файла: простое имя ложится в каталог записей, а каталог из
|
||||
просьбы отбрасывается — абсолютный путь, `..` и буква диска наружу не
|
||||
выводят; пусто, `..`, не-`.wav`, управляющий символ и отсутствие каталога
|
||||
записей дают отказ; существующий файл писатель не перезаписывает.
|
||||
|
||||
Reference in New Issue
Block a user