diff --git a/ewsdrd.lpr b/ewsdrd.lpr index f5f517c..37f0c43 100644 --- a/ewsdrd.lpr +++ b/ewsdrd.lpr @@ -28,7 +28,7 @@ uses {$IFDEF UNIX}cthreads, BaseUnix,{$ENDIF} Classes, SysUtils, RadioController, WebServer, WebAdapter, - HPSDRNetwork, Settings; + HPSDRNetwork, Settings, WDSP, PlatformUtils; const DAEMON_SPEC_WIDTH = 1024; // ширина спектра для StartRunning (web-буфер = 1024) @@ -199,13 +199,34 @@ begin end; function THeadlessHost.EnsureWDSP: Boolean; +var + WisdomDir: AnsiString; begin if FCtrl.FWDSPReady then Exit(True); + // FFTW-wisdom ДО Open: иначе XCreateAnalyzer строит планы с нуля (~минуту). + // WDSPwisdom(dir) импортирует готовый wdspWisdom00 (обычно создан GUI) за мс; + // если файла нет — строит и пишет его (одноразово, медленно). Как GUI + // (MainForm.EnsureWDSPWisdom), но без потока/диалога — демону блокировать ок. + if Assigned(@WDSPwisdom) then + begin + WisdomDir := AnsiString(GetAppCfgDir); + if not FileExists(string(WisdomDir) + 'wdspWisdom00') then + Log('Building WDSP wisdom (one-time, may take ~30-60s)...'); + WDSPwisdom(PAnsiChar(WisdomDir)); + end; Log('Opening WDSP...'); Result := FCtrl.FDSPEngine.Open; FCtrl.FWDSPReady := Result; if not Result then + begin Log('WDSP open FAILED: ' + FCtrl.FDSPEngine.LastError); + Exit; + end; + // Ширина анализатора спектра. Без UI её никто не выставляет (GUI зовёт + // SetSpectrumWidth(панель) каждый тик), и анализатор отдаёт дефолтные 64 пикселя + // → web рисует лишь ~6% ширины, остальное белым. Ставим ровно под web-буфер + // (SPECTRUM_PIXELS=1024). FLastSpectrumW переживает пересоздание канала. + FCtrl.FDSPEngine.SetSpectrumWidth(DAEMON_SPEC_WIDTH); end; procedure THeadlessHost.ConnectTo(const Dev: THPSDRDevice); @@ -365,6 +386,11 @@ begin Log('Web control on http://' + WebCfg.BindAddr + ':' + IntToStr(WebCfg.Port)); PushDeviceList; + // FRunning ставим ДО autostart: первый WDSP-open может занять время, и если за + // него прилетит SIGINT (RequestStop→FRunning:=False), цикл сразу завершится, а + // не перетрётся обратно в True. + FRunning := True; + // Autostart — подключаемся сразу к отмеченному устройству. AutoIP := FCtrl.FDeviceStore.AutoStartIP; if AutoIP <> '' then @@ -377,7 +403,6 @@ begin else Log('No autostart device — waiting for web connect.'); - FRunning := True; lastPush := GetTickCount64; while FRunning do begin