libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
rtpaudiotxthread.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_NETWORK
13#include <cstddef>
14#include <cstdint>
15#include <promeki/atomic.h>
16#include <promeki/audiodesc.h>
17#include <promeki/buffer.h>
18#include <promeki/cadence.h>
19#include <promeki/namespace.h>
21#include <promeki/queue.h>
22#include <promeki/rtppayload.h>
23#include <promeki/rtpsession.h>
24#include <promeki/rtptxthread.h>
25#include <promeki/string.h>
26
27PROMEKI_NAMESPACE_BEGIN
28
54struct RtpAudioTxContext {
61 AudioDesc storageDesc;
62
66 size_t packetSamples = 0;
67
72 size_t packetBytes = 0;
73
77 int packetTimeUs = 0;
78
84 RtpSession *session = nullptr;
85
89 RtpPayload *payload = nullptr;
90
95 uint32_t clockRate = 0;
96
100 Atomic<int64_t> *packetsSent = nullptr;
101
104 Atomic<int64_t> *bytesSent = nullptr;
105
109 Atomic<int64_t> *senderOctets = nullptr;
110
115 Atomic<int64_t> *silencePacketsEmitted = nullptr;
116
120 Atomic<int64_t> *silenceSamplesEmitted = nullptr;
121};
122
162class RtpAudioTxThread : public RtpTxThread {
163 public:
170 static constexpr int64_t HeadroomUs = 1'000'000;
171
175 static constexpr size_t MinDepth = 8;
176
184 static constexpr int64_t StallReanchorMultiplier = 16;
185
194 explicit RtpAudioTxThread(RtpAudioTxContext ctx,
195 const String &name = String("RtpAudTx"));
196
199 ~RtpAudioTxThread() override;
200
201 RtpAudioTxThread(const RtpAudioTxThread &) = delete;
202 RtpAudioTxThread &operator=(const RtpAudioTxThread &) = delete;
203
210 Queue<Buffer> &packetQueue() { return _packetQueue; }
211
213 const Queue<Buffer> &packetQueue() const { return _packetQueue; }
214
220 uint32_t rtpTsCursor() const { return _rtpTs; }
221
246 bool runOnceForTest();
247
248 protected:
249 void onShutdown() override { _packetQueue.cancelWaiters(); }
250 void run() override;
251
252 private:
257 bool emitOne(const Buffer &silenceBuf);
258
261 Buffer silenceBuffer();
262
263 RtpAudioTxContext _ctx;
264 Queue<Buffer> _packetQueue;
265 uint32_t _rtpTs = 0;
266 Buffer _silenceBuf;
267 bool _silenceBuilt = false;
268};
269
270PROMEKI_NAMESPACE_END
271
272#endif // PROMEKI_ENABLE_NETWORK