11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
21PROMEKI_NAMESPACE_BEGIN
128class AudioDataEncoder {
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;
147 static constexpr uint8_t SyncNibble = 0xAu;
158 static constexpr uint32_t DefaultSamplesPerBit = 8;
168 static constexpr uint32_t MinSamplesPerBit = 4;
178 static constexpr uint32_t MaxSamplesPerBit = 64;
187 static constexpr float DefaultAmplitude = 0.1f;
199 static constexpr uint32_t DefaultLeadInBits = 0;
210 static constexpr uint32_t MaxLeadInBits = 32;
226 uint64_t firstSample = 0;
228 uint64_t sampleCount = 0;
230 uint32_t channel = 0;
232 uint64_t payload = 0;
236 AudioDataEncoder() =
default;
285 explicit AudioDataEncoder(
const AudioDesc &desc, uint32_t samplesPerBit = DefaultSamplesPerBit,
286 float amplitude = DefaultAmplitude,
287 uint32_t leadInBits = DefaultLeadInBits);
290 bool isValid()
const {
return _valid; }
293 uint32_t samplesPerBit()
const {
return _samplesPerBit; }
296 float amplitude()
const {
return _amplitude; }
299 uint32_t leadInBits()
const {
return _leadInBits; }
302 const AudioDesc &desc()
const {
return _desc; }
313 uint64_t packetSamples()
const {
314 return static_cast<uint64_t
>(BitsPerPacket + _leadInBits) *
315 static_cast<uint64_t
>(_samplesPerBit);
338 Error encode(PcmAudioPayload &inout,
const List<Item> &items)
const;
341 Error encode(PcmAudioPayload &inout,
const Item &item)
const;
352 static uint8_t computeCrc(uint64_t payload);
356 uint32_t _samplesPerBit = 0;
357 float _amplitude = 0.0f;
358 uint32_t _leadInBits = 0;
362 size_t _bytesPerSample = 0;
366 size_t _channelStride = 0;
374 Buffer _silenceSample;
376 Error stampOne(uint8_t *channelBase,
const Item &item)
const;