11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
30PROMEKI_NAMESPACE_BEGIN
193 using PopResult = Result<size_t>;
196 AudioBuffer() =
default;
199 explicit AudioBuffer(
const AudioDesc &format);
202 AudioBuffer(
const AudioDesc &format,
size_t capacity);
204 AudioBuffer(
const AudioBuffer &) =
delete;
205 AudioBuffer &operator=(
const AudioBuffer &) =
delete;
208 AudioBuffer(AudioBuffer &&other)
noexcept;
211 AudioBuffer &operator=(AudioBuffer &&other)
noexcept;
214 ~AudioBuffer() =
default;
217 bool isValid()
const {
return _format.isValid(); }
239 AudioDesc format()
const {
240 Mutex::Locker lock(_mutex);
248 void setFormat(
const AudioDesc &format);
251 const AudioDesc &inputFormat()
const {
return _inputFormat; }
267 void setInputFormat(
const AudioDesc &input);
281 Error setResamplerQuality(
const SrcQuality &quality);
308 Error enableDriftCorrection(
size_t targetSamples,
double gain = 0.001);
321 void disableDriftCorrection();
328 bool driftCorrectionEnabled()
const;
339 double driftRatio()
const;
348 Error reserve(
size_t samples);
351 size_t capacity()
const {
352 Mutex::Locker lock(_mutex);
357 size_t available()
const {
358 Mutex::Locker lock(_mutex);
363 size_t free()
const {
364 Mutex::Locker lock(_mutex);
365 return _capacity - _count;
369 bool isEmpty()
const {
370 Mutex::Locker lock(_mutex);
375 bool isFull()
const {
376 Mutex::Locker lock(_mutex);
377 return _count >= _capacity;
399 Error setChannelGains(
const List<float> &gains);
402 List<float> channelGains()
const;
429 Error setChannelRemap(
const List<int> &remap);
432 List<int> channelRemap()
const;
449 void setMeter(AudioMeter::Ptr meter);
452 AudioMeter::Ptr meter()
const;
470 Error push(
const void *data,
size_t samples,
const AudioDesc &srcFormat,
471 const MediaTimeStamp &pts = MediaTimeStamp());
500 Error pushSilence(
size_t samples,
const MediaTimeStamp &pts = MediaTimeStamp());
518 PopResult pop(
void *dst,
size_t samples, MediaTimeStamp *firstSamplePts =
nullptr);
530 PopResult popWait(
void *dst,
size_t samples,
unsigned int timeoutMs = 0,
531 MediaTimeStamp *firstSamplePts =
nullptr);
541 PopResult peek(
void *dst,
size_t samples,
542 MediaTimeStamp *firstSamplePts =
nullptr)
const;
548 PopResult drop(
size_t samples);
569 Error push(
const PcmAudioPayload &payload);
598 Result<PcmAudioPayload::Ptr> popPayload(
size_t minSamples,
size_t maxSamples);
618 Result<PcmAudioPayload::Ptr> popWaitPayload(
size_t minSamples,
size_t maxSamples,
619 unsigned int timeoutMs = 0);
626 MediaTimeStamp nextSamplePts()
const;
640 int64_t resamplerSampleDelta()
const;
644 size_t bytesPerSample()
const;
647 void writeBytesAtTail(
const uint8_t *data,
size_t samples);
650 void readBytesFromHead(uint8_t *dst,
size_t samples,
size_t skip)
const;
653 Error pushLocked(
const void *data,
size_t samples,
const AudioDesc &srcFormat,
654 const MediaTimeStamp &pts,
size_t &outputSamples);
655 Error pushSilenceLocked(
size_t samples);
656 size_t popLocked(
void *dst,
size_t samples);
660 uint64_t outputIndex = 0;
672 void layAnchorLocked(uint64_t outputIndex,
const MediaTimeStamp &pts);
679 MediaTimeStamp ptsAtOutputIndexLocked(uint64_t outputIndex)
const;
686 void pruneAnchorsLocked();
688 mutable Mutex _mutex;
692 AudioDesc _inputFormat;
694 size_t _capacity = 0;
700 AudioMeter::Ptr _meter;
702 Deque<Anchor> _anchors;
703 uint64_t _outputProducedTotal = 0;
704 uint64_t _outputConsumedTotal = 0;
705 int64_t _resamplerSampleDelta = 0;
708 bool needsFloatProcessing()
const {
return !_remap.isEmpty() || !_gains.isEmpty() || _meter.isValid(); }
710#if PROMEKI_ENABLE_SRC
711 SrcQuality _resamplerQuality;
712 AudioResampler _resampler;
713 bool _driftEnabled =
false;
714 size_t _driftTarget = 0;
715 double _driftGain = 0.001;
716 double _driftRatio = 1.0;
717 double _driftIntegral = 0.0;
729 Error resampleAndPush(
const float *nativeData,
size_t samples,
730 size_t &outputSamples,
long &inputUsed);
733 bool needsResampler(
const AudioDesc &srcFormat)
const;
736 double computeRatio(
const AudioDesc &srcFormat);