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
128class AudioDataEncoder {
129 public:
131 static constexpr uint32_t SyncBits = 4;
133 static constexpr uint32_t PayloadBits = 64;
135 static constexpr uint32_t CrcBits = 8;
137 static constexpr uint32_t BitsPerPacket = SyncBits + PayloadBits + CrcBits;
138
147 static constexpr uint8_t SyncNibble = 0xAu;
148
158 static constexpr uint32_t DefaultSamplesPerBit = 8;
159
168 static constexpr uint32_t MinSamplesPerBit = 4;
169
178 static constexpr uint32_t MaxSamplesPerBit = 64;
179
187 static constexpr float DefaultAmplitude = 0.1f;
188
199 static constexpr uint32_t DefaultLeadInBits = 0;
200
210 static constexpr uint32_t MaxLeadInBits = 32;
211
224 struct Item {
226 uint64_t firstSample = 0;
228 uint64_t sampleCount = 0;
230 uint32_t channel = 0;
232 uint64_t payload = 0;
233 };
234
236 AudioDataEncoder() = default;
237
285 explicit AudioDataEncoder(const AudioDesc &desc, uint32_t samplesPerBit = DefaultSamplesPerBit,
286 float amplitude = DefaultAmplitude,
287 uint32_t leadInBits = DefaultLeadInBits);
288
290 bool isValid() const { return _valid; }
291
293 uint32_t samplesPerBit() const { return _samplesPerBit; }
294
296 float amplitude() const { return _amplitude; }
297
299 uint32_t leadInBits() const { return _leadInBits; }
300
302 const AudioDesc &desc() const { return _desc; }
303
313 uint64_t packetSamples() const {
314 return static_cast<uint64_t>(BitsPerPacket + _leadInBits) *
315 static_cast<uint64_t>(_samplesPerBit);
316 }
317
338 Error encode(PcmAudioPayload &inout, const List<Item> &items) const;
339
341 Error encode(PcmAudioPayload &inout, const Item &item) const;
342
352 static uint8_t computeCrc(uint64_t payload);
353
354 private:
355 AudioDesc _desc;
356 uint32_t _samplesPerBit = 0;
357 float _amplitude = 0.0f;
358 uint32_t _leadInBits = 0;
359 bool _valid = false;
360
361 // Bytes per single sample of one channel, in the target format.
362 size_t _bytesPerSample = 0;
363 // Stride (bytes) between consecutive samples of the
364 // same channel. Equals _bytesPerSample for planar,
365 // _bytesPerSample * channels for interleaved.
366 size_t _channelStride = 0;
367
368 // Pre-built half-bit primers and one-sample silence in
369 // the target sample format. Each primer holds
370 // _samplesPerBit/2 single-channel samples; silence is
371 // a single sample (zero amplitude, format-encoded).
372 Buffer _posHalf;
373 Buffer _negHalf;
374 Buffer _silenceSample;
375
376 Error stampOne(uint8_t *channelBase, const Item &item) const;
377};
378
379PROMEKI_NAMESPACE_END
380
381#endif // PROMEKI_ENABLE_PROAV