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;
162class RtpAudioTxThread :
public RtpTxThread {
170 static constexpr int64_t HeadroomUs = 1'000'000;
175 static constexpr size_t MinDepth = 8;
184 static constexpr int64_t StallReanchorMultiplier = 16;
194 explicit RtpAudioTxThread(RtpAudioTxContext ctx,
195 const String &name = String(
"RtpAudTx"));
199 ~RtpAudioTxThread()
override;
201 RtpAudioTxThread(
const RtpAudioTxThread &) =
delete;
202 RtpAudioTxThread &operator=(
const RtpAudioTxThread &) =
delete;
210 Queue<Buffer> &packetQueue() {
return _packetQueue; }
213 const Queue<Buffer> &packetQueue()
const {
return _packetQueue; }
220 uint32_t rtpTsCursor()
const {
return _rtpTs; }
246 bool runOnceForTest();
249 void onShutdown()
override { _packetQueue.cancelWaiters(); }
257 bool emitOne(
const Buffer &silenceBuf);
261 Buffer silenceBuffer();
263 RtpAudioTxContext _ctx;
264 Queue<Buffer> _packetQueue;
267 bool _silenceBuilt =
false;