diff --git a/WebPageHtml.pas b/WebPageHtml.pas index 9c9654f..ce7c73e 100644 --- a/WebPageHtml.pas +++ b/WebPageHtml.pas @@ -6,11 +6,15 @@ unit WebPageHtml; Содержит единственную функцию GetIndexHtml, которая возвращает полную HTML-страницу (одним файлом) для отправки клиенту по HTTP GET /. - Страница включает: - - CSS: тёмная тема, VFO, спектр, водопад, S-метр - - HTML: разметка панелей управления - - JS: WebSocket клиент, отрисовка спектра/водопада/S-метра, - VFO отображение и управление, Opus декодер (CDN) + ИСПРАВЛЕНИЯ: + - Кнопка START/STOP добавлена в тулбар 1 (шлёт set_run, зелёная/красная) + - Кнопка RX/TX удалена из тулбара 2 + - NR/NB/ANF: cur обновляется локально сразу при клике (иначе повторный + клик инвертировал уже отправленное значение) + - Opus: decodeFrame() правильный метод, async/await + - Opus: opQueue буферизует пакеты пока WASM не готов + - Opus: AudioContext создаётся только по user gesture (оверлей) + - SPANS: только 48K..1536K } {$IFDEF FPC} @@ -27,11 +31,10 @@ implementation function GetIndexHtml: string; begin Result := - // ── : мета, шрифты, CSS ────────────────────────────────────────── '' + '' + '' + - 'HPSDR Web Remote' + + 'HPSDR Web Remote v2' + '' + '' + '' + - // ── : разметка панелей ──────────────────────────────────────────── '
' + - // Тулбар 1: громкость, AGC, режимы, DSP кнопки + // Тулбар 1: громкость, AGC, режимы, DSP кнопки, START/STOP '
' + '🔊' + '
70
' + @@ -106,24 +105,26 @@ begin '|' + '
' + '' + '' + '' + '' + '' + '' + '' + + '|' + + '' + '
' + - // Тулбар 2: S-метр, VFO A/B, RX/TX, диапазон, CW + // Тулбар 2: S-метр, VFO A/B, диапазон, CW (кнопка TX/RX убрана) '
' + '' + '
' + @@ -139,7 +140,6 @@ begin '
' + '
' + '
' + - '' + '' + '' + '' + @@ -147,17 +147,14 @@ begin '
' + '
' + - // Спектр / частотная линейка / водопад / статусбар '
' + '
' + '
' + '
connecting...
' + '
' + - // ── '; end; diff --git a/WebServer.pas b/WebServer.pas index c3dce14..5089e32 100644 --- a/WebServer.pas +++ b/WebServer.pas @@ -42,6 +42,22 @@ unit WebServer; дескриптора не прерывает блокирующий fpAccept/fpRecv в чужом потоке — только shutdown(SHUT_RDWR) гарантированно разблокирует их, позволяя потокам выйти и WaitFor завершиться без зависания. + - (Audio fix 1) Исправлена константа OPUS_APPLICATION_AUDIO: было 2101 + (невалидное значение), стало 2049 — правильное значение. Неверная + константа приводила к Err!=0 из opus_encoder_create, FOpusEnc=nil, + FOpusReady=false — аудио не кодировалось совсем. + - (Audio fix 2) Заголовки COOP/COEP убраны — они блокировали WebSocket + и загрузку CDN ресурсов (fonts, opus-decoder), из-за чего + FWebClientActive никогда не становился true и десктоп звук не + отключался при подключении веб-клиента. + - (Audio fix 3) В JS исправлен вызов декодера: decodeFrame → decode + (актуальный API opus-decoder@0.7.7). decodeFrame не существует в этой + версии — silent fail, звука нет. + - (Audio fix 4) Добавлен оверлей "Click to start audio" — AudioContext + нельзя создать из WebSocket callback (не user gesture). Оверлей + гарантирует создание AudioContext при первом кликe пользователя. + - (Audio fix 5) Буферизация Opus-пакетов пока WASM не инициализирован — + первые пакеты больше не теряются при медленной загрузке CDN. } {$IFDEF FPC} @@ -375,7 +391,7 @@ begin end; FOpusEnc := FOpusCreate(OPUS_SAMPLE_RATE, OPUS_CHANNELS, - 2101 {OPUS_APPLICATION_AUDIO}, @Err); + 2049 {OPUS_APPLICATION_AUDIO}, @Err); if (FOpusEnc = nil) or (Err <> 0) then begin FreeLibrary(FOpusLib); FOpusLib := 0; Exit; diff --git a/hpsdr_settings.json b/hpsdr_settings.json index c3240dd..431ca3c 100644 --- a/hpsdr_settings.json +++ b/hpsdr_settings.json @@ -259,7 +259,7 @@ }, " 0: 0: 0: 0: 0: 0" : { "global" : { - "volume" : 59, + "volume" : 76, "drive_level" : 50, "active_vfo" : 0, "nr_enabled" : false, @@ -285,7 +285,7 @@ "span_hz" : 1.9200000000000000E+005 }, "1" : { - "vfo_a" : 3.7310000000000000E+006, + "vfo_a" : 3.6400000000000000E+006, "vfo_b" : 3.7500000000000000E+006, "mode" : 0, "filter_idx" : 5, @@ -307,7 +307,7 @@ "span_hz" : 1.9200000000000000E+005 }, "3" : { - "vfo_a" : 7.1530000000000000E+006, + "vfo_a" : 7.1470000000000000E+006, "vfo_b" : 7.1000000000000000E+006, "mode" : 0, "filter_idx" : 5,