New endpoint accepts chunked, header-less, 16-bit LE stereo PCM @ 48 kHz in the request body and writes it straight to the shared I2S sink for as long as the connection stays open. Chosen deliberately unencoded (no MP3/AAC/Opus decode) to keep this path as simple and low-risk as possible — the companion app controls the encoding on its side. Extracted the I2S TX channel that used to be owned outright by web_radio_stream.cpp into main/esp32_i2s_sink.cpp, shared by both producers with a simple tryAcquire()/release() exclusivity guard — web radio streaming and a phone PCM stream would otherwise fight over the same physical wire. web_radio_stream.cpp now acquires/releases around each streamWhileEnabled() cycle instead of owning the channel itself. net::PhoneStreamSink is a plain function-pointer struct (not a class hierarchy) threaded through NetBootstrap::start() -> SetupWebServer::start() -> HttpRouteContext, so components/net stays free of I2S driver headers; main/phone_stream.cpp supplies the concrete functions (bound to esp32_i2s_sink) and does the int16->ADAU 32-bit-slot conversion, batched per chunk rather than per sample for the same reason as the web radio stutter fix (6974095/7e65394 lineage). Verified by build only — not confirmed live yet (board disconnected this session); the actual phone app that will exercise this endpoint doesn't exist yet either. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0178rASQ6ZETPMUamvpoR2KR
27 lines
662 B
C++
27 lines
662 B
C++
/**
|
|
* @file phone_stream.hpp
|
|
* @brief net::PhoneStreamSink implementation over the shared I2S sink.
|
|
*
|
|
* DigiRadio firmware — https://github.com/manvalan/DigiRadio
|
|
*
|
|
* Copyright 2026 Michele Bigi
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
#pragma once
|
|
|
|
#include "net/SetupWebServer.hpp"
|
|
|
|
namespace phone_stream {
|
|
|
|
/**
|
|
* @brief sink — the process-lifetime PhoneStreamSink instance.
|
|
*
|
|
* @dname sink
|
|
* @return Function-pointer table bound to esp32_i2s_sink, for
|
|
* net::HttpRouteContext::phoneStream / PUT /api/stream/phone.
|
|
* @pubstate none
|
|
*/
|
|
[[nodiscard]] net::PhoneStreamSink& sink() noexcept;
|
|
|
|
} // namespace phone_stream
|