libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
audiodataencoder.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
13#include <cstdint>
14#include <cstddef>
15#include <promeki/namespace.h>
16#include <promeki/list.h>
17#include <promeki/error.h>
18#include <promeki/audiodesc.h>
19#include <promeki/buffer.h>
20
21PROMEKI_NAMESPACE_BEGIN
22
23class PcmAudioPayload;
24
114class AudioDataEncoder {
115 public:
117 static constexpr uint32_t SyncBits = 4;
119 static constexpr uint32_t PayloadBits = 64;
121 static constexpr uint32_t CrcBits = 8;
123 static constexpr uint32_t BitsPerPacket = SyncBits + PayloadBits + CrcBits;
124
133 static constexpr uint8_t SyncNibble = 0xAu;
134
144 static constexpr uint32_t DefaultSamplesPerBit = 8;
145
154 static constexpr uint32_t MinSamplesPerBit = 4;
155
164 static constexpr uint32_t MaxSamplesPerBit = 64;
165
173 static constexpr float DefaultAmplitude = 0.1f;
174
186 struct Item {
188 uint64_t firstSample = 0;
190 uint64_t sampleCount = 0;
192 uint32_t channel = 0;
194 uint64_t payload = 0;
195 };
196
198 AudioDataEncoder() = default;
199
216 explicit AudioDataEncoder(const AudioDesc &desc, uint32_t samplesPerBit = DefaultSamplesPerBit,
217 float amplitude = DefaultAmplitude);
218
220 bool isValid() const { return _valid; }
221
223 uint32_t samplesPerBit() const { return _samplesPerBit; }
224
226 float amplitude() const { return _amplitude; }
227
229 const AudioDesc &desc() const { return _desc; }
230
237 uint64_t packetSamples() const {
238 return static_cast<uint64_t>(BitsPerPacket) * static_cast<uint64_t>(_samplesPerBit);
239 }
240
261 Error encode(PcmAudioPayload &inout, const List<Item> &items) const;
262
264 Error encode(PcmAudioPayload &inout, const Item &item) const;
265
275 static uint8_t computeCrc(uint64_t payload);
276
277 private:
278 AudioDesc _desc;
279 uint32_t _samplesPerBit = 0;
280 float _amplitude = 0.0f;
281 bool _valid = false;
282
283 // Bytes per single sample of one channel, in the target format.
284 size_t _bytesPerSample = 0;
285 // Stride (bytes) between consecutive samples of the
286 // same channel. Equals _bytesPerSample for planar,
287 // _bytesPerSample * channels for interleaved.
288 size_t _channelStride = 0;
289
290 // Pre-built half-bit primers and one-sample silence in
291 // the target sample format. Each primer holds
292 // _samplesPerBit/2 single-channel samples; silence is
293 // a single sample (zero amplitude, format-encoded).
294 Buffer _posHalf;
295 Buffer _negHalf;
296 Buffer _silenceSample;
297
298 Error stampOne(uint8_t *channelBase, const Item &item) const;
299};
300
301PROMEKI_NAMESPACE_END
302
303#endif // PROMEKI_ENABLE_PROAV