11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
21PROMEKI_NAMESPACE_BEGIN
85class AudioDataDecoder {
88 static constexpr uint32_t BitsPerPacket = AudioDataEncoder::BitsPerPacket;
90 static constexpr uint32_t SyncBits = AudioDataEncoder::SyncBits;
92 static constexpr uint32_t PayloadBits = AudioDataEncoder::PayloadBits;
94 static constexpr uint32_t CrcBits = AudioDataEncoder::CrcBits;
96 static constexpr uint8_t SyncNibble = AudioDataEncoder::SyncNibble;
104 uint64_t firstSample = 0;
106 uint64_t sampleCount = 0;
108 uint32_t channel = 0;
123 Error error = Error::Ok;
125 uint8_t decodedSync = 0;
127 uint8_t decodedCrc = 0;
129 uint8_t expectedCrc = 0;
131 uint64_t payload = 0;
133 double samplesPerBit = 0.0;
137 uint64_t syncStartSample = 0;
149 int64_t streamSampleStart = -1;
161 int64_t packetSampleCount = 0;
165 using DecodedList = List<DecodedItem>;
168 AudioDataDecoder() =
default;
200 explicit AudioDataDecoder(
const AudioDesc &desc,
201 uint32_t expectedSamplesPerBit = AudioDataEncoder::DefaultSamplesPerBit,
202 float expectedAmplitude = AudioDataEncoder::DefaultAmplitude);
205 bool isValid()
const {
return _valid; }
208 uint32_t expectedSamplesPerBit()
const {
return _expectedSamplesPerBit; }
211 float expectedAmplitude()
const {
return _expectedAmplitude; }
214 const AudioDesc &desc()
const {
return _desc; }
228 Error decode(
const PcmAudioPayload &payload,
const List<Band> &bands, DecodedList &out)
const;
231 DecodedItem decode(
const PcmAudioPayload &payload,
const Band &band)
const;
257 DecodedItem decode(
const float *samples,
size_t count)
const;
289 int64_t sampleAnchor = 0;
301 static constexpr size_t kStreamBufferMaxSamples = 8192;
352 void decodeAll(StreamState &state,
const float *newSamples,
size_t count, DecodedList &out)
const;
356 uint32_t _expectedSamplesPerBit = 0;
357 uint32_t _samplesPerBitMin = 0;
358 uint32_t _samplesPerBitMax = 0;
359 float _expectedAmplitude = 0.0f;
364 float _positiveThreshold = 0.0f;
367 DecodedItem decodeOne(
const PcmAudioPayload &payload,
const Band &band)
const;
368 DecodedItem decodeSamples(
const float *samples,
size_t count)
const;
377 DecodedItem demodulate(
const float *samples,
size_t count,
double syncStart,
double samplesPerBit,
378 uint64_t syncStartSampleInt)
const;