11#include <promeki/config.h>
12#if PROMEKI_ENABLE_NETWORK
27PROMEKI_NAMESPACE_BEGIN
54struct RtpAudioTxContext {
61 AudioDesc storageDesc;
66 size_t packetSamples = 0;
72 size_t packetBytes = 0;
84 RtpSession *session =
nullptr;
89 RtpPayload *payload =
nullptr;
95 uint32_t clockRate = 0;
100 Atomic<int64_t> *packetsSent =
nullptr;
104 Atomic<int64_t> *bytesSent =
nullptr;
109 Atomic<int64_t> *senderOctets =
nullptr;
115 Atomic<int64_t> *silencePacketsEmitted =
nullptr;
120 Atomic<int64_t> *silenceSamplesEmitted =
nullptr;
132 uint32_t initialRtpTs = 0;
174class RtpAudioTxThread :
public RtpTxThread {
182 static constexpr int64_t HeadroomUs = 1'000'000;
187 static constexpr size_t MinDepth = 8;
196 static constexpr int64_t StallReanchorMultiplier = 16;
206 explicit RtpAudioTxThread(RtpAudioTxContext ctx,
207 const String &name = String(
"RtpAudTx"));
211 ~RtpAudioTxThread()
override;
213 RtpAudioTxThread(
const RtpAudioTxThread &) =
delete;
214 RtpAudioTxThread &operator=(
const RtpAudioTxThread &) =
delete;
222 Queue<Buffer> &packetQueue() {
return _packetQueue; }
225 const Queue<Buffer> &packetQueue()
const {
return _packetQueue; }
232 uint32_t rtpTsCursor()
const {
return _rtpTs; }
258 bool runOnceForTest();
261 void onShutdown()
override { _packetQueue.cancelWaiters(); }
269 bool emitOne(
const Buffer &silenceBuf);
273 Buffer silenceBuffer();
275 RtpAudioTxContext _ctx;
276 Queue<Buffer> _packetQueue;
279 bool _silenceBuilt =
false;