11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
21PROMEKI_NAMESPACE_BEGIN
80class AudioDataDecoder {
83 static constexpr uint32_t BitsPerPacket = AudioDataEncoder::BitsPerPacket;
85 static constexpr uint32_t SyncBits = AudioDataEncoder::SyncBits;
87 static constexpr uint32_t PayloadBits = AudioDataEncoder::PayloadBits;
89 static constexpr uint32_t CrcBits = AudioDataEncoder::CrcBits;
91 static constexpr uint8_t SyncNibble = AudioDataEncoder::SyncNibble;
99 uint64_t firstSample = 0;
101 uint64_t sampleCount = 0;
103 uint32_t channel = 0;
118 Error error = Error::Ok;
120 uint8_t decodedSync = 0;
122 uint8_t decodedCrc = 0;
124 uint8_t expectedCrc = 0;
126 uint64_t payload = 0;
128 double samplesPerBit = 0.0;
132 uint64_t syncStartSample = 0;
144 int64_t streamSampleStart = -1;
156 int64_t packetSampleCount = 0;
160 using DecodedList = List<DecodedItem>;
163 AudioDataDecoder() =
default;
177 explicit AudioDataDecoder(
const AudioDesc &desc,
178 uint32_t expectedSamplesPerBit = AudioDataEncoder::DefaultSamplesPerBit);
181 bool isValid()
const {
return _valid; }
184 uint32_t expectedSamplesPerBit()
const {
return _expectedSamplesPerBit; }
187 const AudioDesc &desc()
const {
return _desc; }
201 Error decode(
const PcmAudioPayload &payload,
const List<Band> &bands, DecodedList &out)
const;
204 DecodedItem decode(
const PcmAudioPayload &payload,
const Band &band)
const;
230 DecodedItem decode(
const float *samples,
size_t count)
const;
262 int64_t sampleAnchor = 0;
274 static constexpr size_t kStreamBufferMaxSamples = 8192;
325 void decodeAll(StreamState &state,
const float *newSamples,
size_t count, DecodedList &out)
const;
329 uint32_t _expectedSamplesPerBit = 0;
330 uint32_t _samplesPerBitMin = 0;
331 uint32_t _samplesPerBitMax = 0;
334 DecodedItem decodeOne(
const PcmAudioPayload &payload,
const Band &band)
const;
335 DecodedItem decodeSamples(
const float *samples,
size_t count)
const;
344 DecodedItem demodulate(
const float *samples,
size_t count,
double syncStart,
double samplesPerBit,
345 uint64_t syncStartSampleInt)
const;