Add internet radio streaming with runtime API, modernize web UI, remove auto-tune/beep at boot

Streaming (main feature this session):
- New WebRadioConfig/WebRadioJson core types, ISecureStore-backed persistence
- New webradio::WebRadioService (thread-safe live config) + GET/POST /api/streaming
- web_radio_stream task now runtime-toggleable (no reboot), no hardcoded URL
- Content-Type diagnostic: warns clearly when a URL is a webpage, not an audio stream

Boot cleanup:
- Removed boot-time auto FM/DAB tune, auto-beep, and the (now-concluded) Si4684
  crystal IBIAS/CTUN empirical sweep from main.cpp — tuning/beep are on-demand
  via the existing REST API only

Web UI:
- Modernized styling (cards, gradients, toggle switches, light/dark theme)
- New Stream tab wired to /api/streaming

Fixes found via real idf.py build (not just clangd):
- Restored wrongly-removed si4684/Si4684Tuner.hpp include in main.cpp
- Fixed MP3Decode() argument types in web_radio_stream.cpp (unsigned char**/int*)

Quality-gate fixes:
- Host-test stub headers (esp_log.h, freertos/*) so TunerService.cpp's
  scanForStation logging/pacing compiles for station_service_test /
  integration_service_test instead of running stale binaries
- Added WifiScanner and WebRadioService manual sections; filled in missing
  Doxygen docs on BluetoothService, i2s_sdata_probe, test_firmware, Bt1035At
- Ignore clangd's .cache/ index directory

Also includes prior uncommitted work carried in the tree: Wi-Fi/Bluetooth
device scan REST API and UI (WifiScanner, BT scan), SigmaStudio TCP bridge,
and the current ADAU1701 SigmaStudio DSP program export.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-08 21:15:22 +02:00
co-authored by Claude Sonnet 5
parent 8a8523515d
commit 6f7b6dd12c
131 changed files with 20309 additions and 1702 deletions
@@ -0,0 +1,82 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- *
* This software is distributed in the hope that it will be useful,
* but is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* This software may only be used to program products purchased from
* Analog Devices for incorporation by you into audio products that
* are intended for resale to audio product end users. This software
* may not be distributed whole or in any part to third parties.
*
* Copyright © 2026 Analog Devices, Inc. All rights reserved.
*/
-->
<!--NetList XML file-->
<NetList>
<IC name=" IC 1 " type="DSPSigma100">
<Schematic>
<Algorithm name="ICSigma100In1" friendlyname="170x\140x input " cell="Input1 " location="{X=-15, Y=104} " Growth="10 " GrowthB="0 " FS="48000">
<Link pin="O_C33_A0_P3_out" dir="out" link="Link0" />
<Link pin="O_C33_A0_P4_out" dir="out" link="Link1" />
<Link pin="O_C33_A0_P5_out" dir="out" link="Link2" />
<Link pin="O_C33_A0_P6_out" dir="out" link="Link3" />
</Algorithm>
<Algorithm name="BeepAlg1" friendlyname="Beep - variable gain " cell="Beep1 " location="{X=933, Y=138} " Growth="0 " GrowthB="0 " FS="48000">
<Link pin="O_C0_A0_P1_out" dir="out" link="Link15" />
</Algorithm>
<Algorithm name="Gain1940AlgNS1" friendlyname="Gain (no slew) " cell="Si4674 " location="{X=168, Y=5} " Growth="0 " GrowthB="0">
<Link pin="I_C63_A0_P1_in" dir="in" link="Link0" />
<Link pin="O_C63_A0_P2_out" dir="out" link="Link4" />
</Algorithm>
<Algorithm name="Gain1940AlgNS2" friendlyname="Gain (no slew) " cell="Si4674 " location="{X=168, Y=5} " Growth="0 " GrowthB="0">
<Link pin="I_C63_A1_P1_in" dir="in" link="Link1" />
<Link pin="O_C63_A1_P2_out" dir="out" link="Link5" />
</Algorithm>
<Algorithm name="Gain1940AlgNS3" friendlyname="Gain (no slew) " cell="ESP32 " location="{X=166, Y=196} " Growth="0 " GrowthB="0">
<Link pin="I_C75_A0_P1_in" dir="in" link="Link2" />
<Link pin="O_C75_A0_P2_out" dir="out" link="Link6" />
</Algorithm>
<Algorithm name="Gain1940AlgNS4" friendlyname="Gain (no slew) " cell="ESP32 " location="{X=166, Y=196} " Growth="0 " GrowthB="0">
<Link pin="I_C75_A1_P1_in" dir="in" link="Link3" />
<Link pin="O_C75_A1_P2_out" dir="out" link="Link7" />
</Algorithm>
<Algorithm name="ICSigma100Out1" friendlyname="170x\140x output " cell="Output1 " location="{X=1127, Y=55} " Growth="0 " GrowthB="0">
<Link pin="I_C183_A0_P1_in" dir="in" link="Link15" />
</Algorithm>
<Algorithm name="StereoMixerAlg1" friendlyname="Stereo Mixer " cell="St Mixer1 " location="{X=381, Y=115} " Growth="2 " GrowthB="0">
<Link pin="I_C84_A0_P3_in" dir="in" link="Link4" />
<Link pin="I_C84_A0_P4_in" dir="in" link="Link5" />
<Link pin="I_C84_A0_P5_in" dir="in" link="Link6" />
<Link pin="I_C84_A0_P6_in" dir="in" link="Link7" />
<Link pin="O_C84_A0_P1_out" dir="out" link="Link8" />
<Link pin="O_C84_A0_P2_out" dir="out" link="Link9" />
</Algorithm>
<Algorithm name="PEQ1Chan1" friendlyname="PEQ1Chan - Double Precision " cell="Param EQ1 " location="{X=502, Y=156} " Growth="2 " GrowthB="0">
<Link pin="I_C125_A0_P1_in" dir="in" link="Link8" />
<Link pin="I_C125_A0_P3_in" dir="in" link="Link9" />
<Link pin="O_C125_A0_P2_out" dir="out" link="Link10" />
<Link pin="O_C125_A0_P4_out" dir="out" link="Link11" />
</Algorithm>
<Algorithm name="Gain1940AlgNS5" friendlyname="Gain (no slew) " cell="Multiple 1 " location="{X=628, Y=88} " Growth="0 " GrowthB="0">
<Link pin="I_C138_A0_P1_in" dir="in" link="Link10" />
<Link pin="O_C138_A0_P2_out" dir="out" link="Link12" />
</Algorithm>
<Algorithm name="Gain1940AlgNS6" friendlyname="Gain (no slew) " cell="Multiple 1 " location="{X=628, Y=88} " Growth="0 " GrowthB="0">
<Link pin="I_C138_A1_P1_in" dir="in" link="Link11" />
<Link pin="O_C138_A1_P2_out" dir="out" link="Link13" />
</Algorithm>
<Algorithm name="limiterAlg1" friendlyname="Limiter with Indicator " cell="Limiter 1 " location="{X=761, Y=40} " Growth="0 " GrowthB="0">
<Link pin="I_C169_A0_P1_in" dir="in" link="Link12" />
</Algorithm>
<Algorithm name="limiterAlg2" friendlyname="Limiter with Indicator " cell="Limiter 2 " location="{X=765, Y=189} " Growth="0 " GrowthB="0">
<Link pin="I_C174_A0_P1_in" dir="in" link="Link13" />
<Link pin="O_C174_A0_P2_out" dir="out" link="Link14" />
</Algorithm>
<Algorithm name="ICSigma100Out2" friendlyname="170x\140x output " cell="Output2 " location="{X=890, Y=227} " Growth="0 " GrowthB="0">
<Link pin="I_C185_A0_P1_in" dir="in" link="Link14" />
</Algorithm>
</Schematic>
</IC>
</NetList>