11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
28PROMEKI_NAMESPACE_BEGIN
93class AudioTestPattern {
96 using UPtr = UniquePtr<AudioTestPattern>;
104 AudioTestPattern(
const AudioDesc &desc);
109 AudioTestPattern(
const AudioTestPattern &) =
delete;
110 AudioTestPattern &operator=(
const AudioTestPattern &) =
delete;
113 const AudioDesc &desc()
const {
return _desc; }
116 const EnumList &channelModes()
const {
return _channelModes; }
125 void setChannelModes(
const EnumList &modes) { _channelModes = modes; }
128 double toneFrequency()
const {
return _toneFreq; }
131 void setToneFrequency(
double freq) { _toneFreq = freq; }
134 AudioLevel toneLevel()
const {
return _toneLevel; }
137 void setToneLevel(AudioLevel level) { _toneLevel = level; }
140 AudioLevel ltcLevel()
const {
return _ltcLevel; }
143 void setLtcLevel(AudioLevel level) { _ltcLevel = level; }
146 double channelIdBaseFreq()
const {
return _chanIdBaseFreq; }
154 void setChannelIdBaseFreq(
double hz) { _chanIdBaseFreq = hz; }
157 double channelIdStepFreq()
const {
return _chanIdStepFreq; }
160 void setChannelIdStepFreq(
double hz) { _chanIdStepFreq = hz; }
163 double chirpStartFreq()
const {
return _chirpStartFreq; }
166 void setChirpStartFreq(
double hz) { _chirpStartFreq = hz; }
169 double chirpEndFreq()
const {
return _chirpEndFreq; }
172 void setChirpEndFreq(
double hz) { _chirpEndFreq = hz; }
175 double chirpDurationSec()
const {
return _chirpDurationSec; }
178 void setChirpDurationSec(
double sec) { _chirpDurationSec = sec; }
181 double dualToneFreq1()
const {
return _dualToneFreq1; }
184 void setDualToneFreq1(
double hz) { _dualToneFreq1 = hz; }
187 double dualToneFreq2()
const {
return _dualToneFreq2; }
190 void setDualToneFreq2(
double hz) { _dualToneFreq2 = hz; }
199 double dualToneRatio()
const {
return _dualToneRatio; }
202 void setDualToneRatio(
double ratio) { _dualToneRatio = ratio; }
205 double sweepStartFreq()
const {
return _sweepStartFreq; }
208 void setSweepStartFreq(
double hz) { _sweepStartFreq = hz; }
211 double sweepEndFreq()
const {
return _sweepEndFreq; }
214 void setSweepEndFreq(
double hz) { _sweepEndFreq = hz; }
217 double sweepDurationSec()
const {
return _sweepDurationSec; }
220 void setSweepDurationSec(
double sec) { _sweepDurationSec = sec; }
223 double polarityPulseHz()
const {
return _polarityPulseHz; }
226 void setPolarityPulseHz(
double hz) { _polarityPulseHz = hz; }
229 double polarityPulseWidthSec()
const {
return _polarityPulseWidthSec; }
232 void setPolarityPulseWidthSec(
double sec) { _polarityPulseWidthSec = sec; }
235 const List<double> &steppedToneFreqs()
const {
return _steppedToneFreqs; }
238 void setSteppedToneFreqs(
const List<double> &freqs) { _steppedToneFreqs = freqs; }
241 double steppedToneStepSec()
const {
return _steppedToneStepSec; }
244 void setSteppedToneStepSec(
double sec) { _steppedToneStepSec = sec; }
247 AudioLevel dialnormLevel()
const {
return _dialnormLevel; }
250 void setDialnormLevel(AudioLevel level) { _dialnormLevel = level; }
266 double noiseBufferSeconds()
const {
return _noiseBufferSeconds; }
269 void setNoiseBufferSeconds(
double sec) { _noiseBufferSeconds = sec; }
279 uint32_t noiseSeed()
const {
return _noiseSeed; }
282 void setNoiseSeed(uint32_t seed) { _noiseSeed = seed; }
319 SharedPtr<PcmAudioPayload, true, PcmAudioPayload> createPayload(
size_t samples,
320 const Timecode &tc)
const;
328 SharedPtr<PcmAudioPayload, true, PcmAudioPayload> createPayload(
size_t samples)
const {
329 return createPayload(samples, Timecode());
336 uint8_t pcmMarkerStreamId()
const {
return _pcmMarkerStreamId; }
346 void setPcmMarkerStreamId(uint8_t streamId) { _pcmMarkerStreamId = streamId; }
356 uint64_t pcmMarkerFrameNumber()
const {
return _pcmMarkerCounter; }
368 void setPcmMarkerFrameNumber(uint64_t fn) { _pcmMarkerCounter = fn; }
382 static double channelIdFrequency(
size_t channelIndex,
double baseFreq,
double stepFreq) {
383 return baseFreq +
static_cast<double>(channelIndex) * stepFreq;
391 static constexpr double kSrcProbeFrequencyHz = 997.0;
394 static constexpr uint8_t kDefaultPcmMarkerStreamId = 0;
399 static constexpr uint64_t kPcmMarkerFrameMask = 0x0000ffffffffffffULL;
402 static const List<double> kDefaultSteppedToneFreqs;
405 static constexpr double kEbuLineupFreqHz = 1000.0;
408 static constexpr double kEbuLineupOnSec = 3.0;
411 static constexpr double kEbuLineupCycleSec = 5.0;
414 static constexpr double kBlitsFreqHz = 1000.0;
417 static constexpr double kBlitsSegmentSec = 1.0;
420 static constexpr size_t kIec60958StatusBits = 192;
423 static constexpr size_t kIec60958SamplesPerBit = 4;
427 EnumList _channelModes;
428 double _toneFreq = 1000.0;
429 AudioLevel _toneLevel = AudioLevel::fromDbfs(-20.0);
430 AudioLevel _ltcLevel = AudioLevel::fromDbfs(-20.0);
431 double _chanIdBaseFreq = 1000.0;
432 double _chanIdStepFreq = 100.0;
434 double _chirpStartFreq = 20.0;
435 double _chirpEndFreq = 20000.0;
436 double _chirpDurationSec = 1.0;
438 double _dualToneFreq1 = 60.0;
439 double _dualToneFreq2 = 7000.0;
440 double _dualToneRatio = 0.25;
442 double _sweepStartFreq = 20.0;
443 double _sweepEndFreq = 20000.0;
444 double _sweepDurationSec = 1.0;
446 double _polarityPulseHz = 1.0;
447 double _polarityPulseWidthSec = 0.001;
449 List<double> _steppedToneFreqs;
450 double _steppedToneStepSec = 1.0;
452 AudioLevel _dialnormLevel = AudioLevel::fromDbfs(-24.0);
454 double _noiseBufferSeconds = 10.0;
455 uint32_t _noiseSeed = 0x505244A4u;
463 mutable List<AudioGen *> _chanGens;
464 LtcEncoder::UPtr _ltcEncoder;
472 mutable Map<size_t, List<float>> _avSyncToneCache;
481 List<float> _whiteNoiseBuffer;
482 List<float> _pinkNoiseBuffer;
494 mutable double _chirpSampleCursor = 0.0;
495 mutable double _chirpPhase = 0.0;
502 mutable double _dualTonePhase1 = 0.0;
503 mutable double _dualTonePhase2 = 0.0;
514 mutable size_t _noiseSampleCursor = 0;
519 uint8_t _pcmMarkerStreamId = kDefaultPcmMarkerStreamId;
526 mutable uint64_t _pcmMarkerCounter = 0;
528 mutable double _sweepSampleCursor = 0.0;
529 mutable double _sweepPhase = 0.0;
531 mutable double _polarityCursor = 0.0;
533 mutable double _steppedToneSampleCursor = 0.0;
534 mutable double _steppedTonePhase = 0.0;
536 mutable size_t _blitsSampleCursor = 0;
537 mutable double _blitsPhase = 0.0;
539 mutable size_t _ebuLineupSampleCursor = 0;
540 mutable double _ebuLineupPhase = 0.0;
542 mutable size_t _iec60958SampleCursor = 0;
544 void clearGenerators();
545 AudioPattern modeForChannel(
size_t channelIndex)
const;
546 const List<float> &avSyncBurst(
size_t samples)
const;
553 void writePattern(
float *out,
size_t samples,
const Timecode &tc)
const;
554 void buildWhiteNoiseBuffer();
555 void buildPinkNoiseBuffer();
557 void writeNoiseChannel(
float *out,
size_t channel,
size_t channels,
size_t samples,
558 const List<float> &buffer)
const;
559 void writeChirpChannel(
float *out,
size_t channel,
size_t channels,
size_t samples)
const;
560 void writeDualToneChannel(
float *out,
size_t channel,
size_t channels,
size_t samples)
const;
571 void stampPcmMarkers(PcmAudioPayload &payload, uint64_t frameNumber)
const;
572 void writeSweepChannel(
float *out,
size_t channel,
size_t channels,
size_t samples)
const;
573 void writePolarityChannel(
float *out,
size_t channel,
size_t channels,
size_t samples)
const;
574 void writeSteppedToneChannel(
float *out,
size_t channel,
size_t channels,
size_t samples)
const;
575 void writeBlitsChannel(
float *out,
size_t channel,
size_t channels,
size_t totalChannels,
576 size_t samples)
const;
577 void writeEbuLineupChannel(
float *out,
size_t channel,
size_t channels,
size_t samples)
const;
578 void writeDialnormChannel(
float *out,
size_t channel,
size_t channels,
size_t samples)
const;
579 void writeIec60958Channel(
float *out,
size_t channel,
size_t channels,
size_t samples)
const;