13#include <promeki/config.h>
14#if PROMEKI_ENABLE_CORE
19PROMEKI_NAMESPACE_BEGIN
63class AudioMarkerType :
public TypedEnum<AudioMarkerType> {
65 PROMEKI_REGISTER_ENUM_TYPE_DISPLAY(
"AudioMarkerType",
"Audio Marker Type", 0,
66 {
"Unknown", 0,
"Unknown / Unclassified"},
67 {
"SilenceFill", 1,
"Synthesized Silence Fill"},
68 {
"ConcealedLoss", 2,
"Concealed Packet Loss"},
69 {
"Discontinuity", 3,
"Timeline Discontinuity"},
70 {
"Glitch", 4,
"Detected Glitch"});
72 using TypedEnum<AudioMarkerType>::TypedEnum;
74 static const AudioMarkerType Unknown;
75 static const AudioMarkerType SilenceFill;
76 static const AudioMarkerType ConcealedLoss;
77 static const AudioMarkerType Discontinuity;
78 static const AudioMarkerType Glitch;
81inline const AudioMarkerType AudioMarkerType::Unknown{0};
82inline const AudioMarkerType AudioMarkerType::SilenceFill{1};
83inline const AudioMarkerType AudioMarkerType::ConcealedLoss{2};
84inline const AudioMarkerType AudioMarkerType::Discontinuity{3};
85inline const AudioMarkerType AudioMarkerType::Glitch{4};
101class AudioDataType :
public TypedEnum<AudioDataType> {
103 PROMEKI_REGISTER_ENUM_TYPE_DISPLAY(
"AudioDataType",
"Audio Sample Format", 1,
104 {
"Invalid", 0,
"Invalid"},
105 {
"PCMI_Float32LE", 1,
"PCM 32-bit Float, Interleaved, Little-Endian"},
106 {
"PCMI_Float32BE", 2,
"PCM 32-bit Float, Interleaved, Big-Endian"},
107 {
"PCMI_S8", 3,
"PCM Signed 8-bit, Interleaved"},
108 {
"PCMI_U8", 4,
"PCM Unsigned 8-bit, Interleaved"},
109 {
"PCMI_S16LE", 5,
"PCM Signed 16-bit, Interleaved, Little-Endian"},
110 {
"PCMI_U16LE", 6,
"PCM Unsigned 16-bit, Interleaved, Little-Endian"},
111 {
"PCMI_S16BE", 7,
"PCM Signed 16-bit, Interleaved, Big-Endian"},
112 {
"PCMI_U16BE", 8,
"PCM Unsigned 16-bit, Interleaved, Big-Endian"},
113 {
"PCMI_S24LE", 9,
"PCM Signed 24-bit, Interleaved, Little-Endian"},
114 {
"PCMI_U24LE", 10,
"PCM Unsigned 24-bit, Interleaved, Little-Endian"},
115 {
"PCMI_S24BE", 11,
"PCM Signed 24-bit, Interleaved, Big-Endian"},
116 {
"PCMI_U24BE", 12,
"PCM Unsigned 24-bit, Interleaved, Big-Endian"},
117 {
"PCMI_S32LE", 13,
"PCM Signed 32-bit, Interleaved, Little-Endian"},
118 {
"PCMI_U32LE", 14,
"PCM Unsigned 32-bit, Interleaved, Little-Endian"},
119 {
"PCMI_S32BE", 15,
"PCM Signed 32-bit, Interleaved, Big-Endian"},
120 {
"PCMI_U32BE", 16,
"PCM Unsigned 32-bit, Interleaved, Big-Endian"});
122 using TypedEnum<AudioDataType>::TypedEnum;
124 static const AudioDataType Invalid;
125 static const AudioDataType PCMI_Float32LE;
126 static const AudioDataType PCMI_Float32BE;
127 static const AudioDataType PCMI_S8;
128 static const AudioDataType PCMI_U8;
129 static const AudioDataType PCMI_S16LE;
130 static const AudioDataType PCMI_U16LE;
131 static const AudioDataType PCMI_S16BE;
132 static const AudioDataType PCMI_U16BE;
133 static const AudioDataType PCMI_S24LE;
134 static const AudioDataType PCMI_U24LE;
135 static const AudioDataType PCMI_S24BE;
136 static const AudioDataType PCMI_U24BE;
137 static const AudioDataType PCMI_S32LE;
138 static const AudioDataType PCMI_U32LE;
139 static const AudioDataType PCMI_S32BE;
140 static const AudioDataType PCMI_U32BE;
143inline const AudioDataType AudioDataType::Invalid{0};
144inline const AudioDataType AudioDataType::PCMI_Float32LE{1};
145inline const AudioDataType AudioDataType::PCMI_Float32BE{2};
146inline const AudioDataType AudioDataType::PCMI_S8{3};
147inline const AudioDataType AudioDataType::PCMI_U8{4};
148inline const AudioDataType AudioDataType::PCMI_S16LE{5};
149inline const AudioDataType AudioDataType::PCMI_U16LE{6};
150inline const AudioDataType AudioDataType::PCMI_S16BE{7};
151inline const AudioDataType AudioDataType::PCMI_U16BE{8};
152inline const AudioDataType AudioDataType::PCMI_S24LE{9};
153inline const AudioDataType AudioDataType::PCMI_U24LE{10};
154inline const AudioDataType AudioDataType::PCMI_S24BE{11};
155inline const AudioDataType AudioDataType::PCMI_U24BE{12};
156inline const AudioDataType AudioDataType::PCMI_S32LE{13};
157inline const AudioDataType AudioDataType::PCMI_U32LE{14};
158inline const AudioDataType AudioDataType::PCMI_S32BE{15};
159inline const AudioDataType AudioDataType::PCMI_U32BE{16};
183class AudioWireFormat :
public TypedEnum<AudioWireFormat> {
185 PROMEKI_REGISTER_ENUM_TYPE_DISPLAY(
"AudioWireFormat",
"Audio Wire Format", 0,
186 {
"Auto", 0,
"Automatic (L16 / L24 by Sample Width)"},
187 {
"L16", 1,
"16-bit Linear PCM (L16)"},
188 {
"L24", 2,
"24-bit Linear PCM (L24)"});
190 using TypedEnum<AudioWireFormat>::TypedEnum;
192 static const AudioWireFormat Auto;
193 static const AudioWireFormat L16;
194 static const AudioWireFormat L24;
197inline const AudioWireFormat AudioWireFormat::Auto{0};
198inline const AudioWireFormat AudioWireFormat::L16{1};
199inline const AudioWireFormat AudioWireFormat::L24{2};
222class AudioConformanceLevel :
public TypedEnum<AudioConformanceLevel> {
224 PROMEKI_REGISTER_ENUM_TYPE_DISPLAY(
"AudioConformanceLevel",
"ST 2110-30 Conformance Level", 0,
225 {
"None", 0,
"Non-Conformant"},
226 {
"A", 1,
"Level A (48 kHz / 1 ms / 1-8 ch)"},
227 {
"AX", 2,
"Level AX (96 kHz / 1 ms / 1-4 ch)"},
228 {
"B", 3,
"Level B (48 kHz / 125 us / 1-8 ch)"},
229 {
"BX", 4,
"Level BX (96 kHz / 125 us / 1-8 ch)"},
230 {
"C", 5,
"Level C (48 kHz / 125 us / 9-64 ch)"},
231 {
"CX", 6,
"Level CX (96 kHz / 125 us / 9-32 ch)"});
233 using TypedEnum<AudioConformanceLevel>::TypedEnum;
235 static const AudioConformanceLevel None;
236 static const AudioConformanceLevel A;
237 static const AudioConformanceLevel AX;
238 static const AudioConformanceLevel B;
239 static const AudioConformanceLevel BX;
240 static const AudioConformanceLevel C;
241 static const AudioConformanceLevel CX;
267 static AudioConformanceLevel compute(
int sampleRateHz,
272inline const AudioConformanceLevel AudioConformanceLevel::None{0};
273inline const AudioConformanceLevel AudioConformanceLevel::A{1};
274inline const AudioConformanceLevel AudioConformanceLevel::AX{2};
275inline const AudioConformanceLevel AudioConformanceLevel::B{3};
276inline const AudioConformanceLevel AudioConformanceLevel::BX{4};
277inline const AudioConformanceLevel AudioConformanceLevel::C{5};
278inline const AudioConformanceLevel AudioConformanceLevel::CX{6};
280inline AudioConformanceLevel AudioConformanceLevel::compute(
int sampleRateHz,
288 if (channels < 1)
return None;
289 if (sampleRateHz == 48000 && packetTimeUs == 1000 && channels >= 1 && channels <= 8) {
292 if (sampleRateHz == 96000 && packetTimeUs == 1000 && channels >= 1 && channels <= 4) {
295 if (sampleRateHz == 48000 && packetTimeUs == 125 && channels >= 1 && channels <= 8) {
298 if (sampleRateHz == 96000 && packetTimeUs == 125 && channels >= 1 && channels <= 8) {
301 if (sampleRateHz == 48000 && packetTimeUs == 125 && channels >= 9 && channels <= 64) {
304 if (sampleRateHz == 96000 && packetTimeUs == 125 && channels >= 9 && channels <= 32) {
328class AudioSourceHint :
public TypedEnum<AudioSourceHint> {
330 PROMEKI_REGISTER_ENUM_TYPE_DISPLAY(
"AudioSourceHint",
"Audio Source Preference", 0,
331 {
"Sidecar", 0,
"Sidecar Audio File"},
332 {
"Embedded", 1,
"Embedded Per-Frame Audio"});
334 using TypedEnum<AudioSourceHint>::TypedEnum;
336 static const AudioSourceHint Sidecar;
337 static const AudioSourceHint Embedded;
340inline const AudioSourceHint AudioSourceHint::Sidecar{0};
341inline const AudioSourceHint AudioSourceHint::Embedded{1};
365class SrcQuality :
public TypedEnum<SrcQuality> {
367 PROMEKI_REGISTER_ENUM_TYPE_DISPLAY(
"SrcQuality",
"Sample Rate Conversion Quality", 1,
368 {
"SincBest", 0,
"Best Sinc (Highest Quality)"},
369 {
"SincMedium", 1,
"Medium Sinc (Balanced)"},
370 {
"SincFastest", 2,
"Fastest Sinc (Low Latency)"},
371 {
"Linear", 3,
"Linear Interpolation"},
372 {
"ZeroOrderHold", 4,
"Zero-Order Hold (Nearest Sample)"});
374 using TypedEnum<SrcQuality>::TypedEnum;
376 static const SrcQuality SincBest;
377 static const SrcQuality SincMedium;
378 static const SrcQuality SincFastest;
379 static const SrcQuality Linear;
380 static const SrcQuality ZeroOrderHold;
383inline const SrcQuality SrcQuality::SincBest{0};
384inline const SrcQuality SrcQuality::SincMedium{1};
385inline const SrcQuality SrcQuality::SincFastest{2};
386inline const SrcQuality SrcQuality::Linear{3};
387inline const SrcQuality SrcQuality::ZeroOrderHold{4};
432class ChannelRole :
public TypedEnum<ChannelRole> {
434 PROMEKI_REGISTER_ENUM_TYPE_DISPLAY(
"ChannelRole",
"Audio Channel Role", 0,
435 {
"Unused", 0,
"Unused / Unassigned"},
437 {
"FrontLeft", 2,
"Front Left"},
438 {
"FrontRight", 3,
"Front Right"},
439 {
"FrontCenter", 4,
"Front Center"},
440 {
"LFE", 5,
"Low-Frequency Effects (LFE)"},
441 {
"BackLeft", 6,
"Back Left"},
442 {
"BackRight", 7,
"Back Right"},
443 {
"BackCenter", 8,
"Back Center"},
444 {
"SideLeft", 9,
"Side Left"},
445 {
"SideRight", 10,
"Side Right"},
446 {
"FrontLeftOfCenter", 11,
"Front Left of Center"},
447 {
"FrontRightOfCenter", 12,
"Front Right of Center"},
448 {
"TopFrontLeft", 13,
"Top Front Left"},
449 {
"TopFrontCenter", 14,
"Top Front Center"},
450 {
"TopFrontRight", 15,
"Top Front Right"},
451 {
"TopBackLeft", 16,
"Top Back Left"},
452 {
"TopBackCenter", 17,
"Top Back Center"},
453 {
"TopBackRight", 18,
"Top Back Right"},
454 {
"TopCenter", 19,
"Top Center"},
455 {
"AmbisonicW", 20,
"Ambisonic W (Omnidirectional)"},
456 {
"AmbisonicX", 21,
"Ambisonic X"},
457 {
"AmbisonicY", 22,
"Ambisonic Y"},
458 {
"AmbisonicZ", 23,
"Ambisonic Z"},
459 {
"Aux0", 24,
"Auxiliary 0"},
460 {
"Aux1", 25,
"Auxiliary 1"},
461 {
"Aux2", 26,
"Auxiliary 2"},
462 {
"Aux3", 27,
"Auxiliary 3"},
463 {
"Aux4", 28,
"Auxiliary 4"},
464 {
"Aux5", 29,
"Auxiliary 5"},
465 {
"Aux6", 30,
"Auxiliary 6"},
466 {
"Aux7", 31,
"Auxiliary 7"},
467 {
"LeftTotal", 32,
"Left Total (Lt, Matrix Stereo)"},
468 {
"RightTotal", 33,
"Right Total (Rt, Matrix Stereo)"});
470 using TypedEnum<ChannelRole>::TypedEnum;
472 static const ChannelRole Unused;
473 static const ChannelRole Mono;
474 static const ChannelRole FrontLeft;
475 static const ChannelRole FrontRight;
476 static const ChannelRole FrontCenter;
477 static const ChannelRole LFE;
478 static const ChannelRole BackLeft;
479 static const ChannelRole BackRight;
480 static const ChannelRole BackCenter;
481 static const ChannelRole SideLeft;
482 static const ChannelRole SideRight;
483 static const ChannelRole FrontLeftOfCenter;
484 static const ChannelRole FrontRightOfCenter;
485 static const ChannelRole TopFrontLeft;
486 static const ChannelRole TopFrontCenter;
487 static const ChannelRole TopFrontRight;
488 static const ChannelRole TopBackLeft;
489 static const ChannelRole TopBackCenter;
490 static const ChannelRole TopBackRight;
491 static const ChannelRole TopCenter;
492 static const ChannelRole AmbisonicW;
493 static const ChannelRole AmbisonicX;
494 static const ChannelRole AmbisonicY;
495 static const ChannelRole AmbisonicZ;
496 static const ChannelRole Aux0;
497 static const ChannelRole Aux1;
498 static const ChannelRole Aux2;
499 static const ChannelRole Aux3;
500 static const ChannelRole Aux4;
501 static const ChannelRole Aux5;
502 static const ChannelRole Aux6;
503 static const ChannelRole Aux7;
510 static const ChannelRole LeftTotal;
513 static const ChannelRole RightTotal;
516inline const ChannelRole ChannelRole::Unused{0};
517inline const ChannelRole ChannelRole::Mono{1};
518inline const ChannelRole ChannelRole::FrontLeft{2};
519inline const ChannelRole ChannelRole::FrontRight{3};
520inline const ChannelRole ChannelRole::FrontCenter{4};
521inline const ChannelRole ChannelRole::LFE{5};
522inline const ChannelRole ChannelRole::BackLeft{6};
523inline const ChannelRole ChannelRole::BackRight{7};
524inline const ChannelRole ChannelRole::BackCenter{8};
525inline const ChannelRole ChannelRole::SideLeft{9};
526inline const ChannelRole ChannelRole::SideRight{10};
527inline const ChannelRole ChannelRole::FrontLeftOfCenter{11};
528inline const ChannelRole ChannelRole::FrontRightOfCenter{12};
529inline const ChannelRole ChannelRole::TopFrontLeft{13};
530inline const ChannelRole ChannelRole::TopFrontCenter{14};
531inline const ChannelRole ChannelRole::TopFrontRight{15};
532inline const ChannelRole ChannelRole::TopBackLeft{16};
533inline const ChannelRole ChannelRole::TopBackCenter{17};
534inline const ChannelRole ChannelRole::TopBackRight{18};
535inline const ChannelRole ChannelRole::TopCenter{19};
536inline const ChannelRole ChannelRole::AmbisonicW{20};
537inline const ChannelRole ChannelRole::AmbisonicX{21};
538inline const ChannelRole ChannelRole::AmbisonicY{22};
539inline const ChannelRole ChannelRole::AmbisonicZ{23};
540inline const ChannelRole ChannelRole::Aux0{24};
541inline const ChannelRole ChannelRole::Aux1{25};
542inline const ChannelRole ChannelRole::Aux2{26};
543inline const ChannelRole ChannelRole::Aux3{27};
544inline const ChannelRole ChannelRole::Aux4{28};
545inline const ChannelRole ChannelRole::Aux5{29};
546inline const ChannelRole ChannelRole::Aux6{30};
547inline const ChannelRole ChannelRole::Aux7{31};
548inline const ChannelRole ChannelRole::LeftTotal{32};
549inline const ChannelRole ChannelRole::RightTotal{33};
570class OpusApplication :
public TypedEnum<OpusApplication> {
572 PROMEKI_REGISTER_ENUM_TYPE_DISPLAY(
"OpusApplication",
"Opus Application Mode", 1,
573 {
"Voip", 0,
"VoIP (Voice Optimized)"},
574 {
"Audio", 1,
"Audio (Music / General)"},
575 {
"LowDelay", 2,
"Restricted Low Delay"});
577 using TypedEnum<OpusApplication>::TypedEnum;
579 static const OpusApplication Voip;
580 static const OpusApplication Audio;
581 static const OpusApplication LowDelay;
584inline const OpusApplication OpusApplication::Voip{0};
585inline const OpusApplication OpusApplication::Audio{1};
586inline const OpusApplication OpusApplication::LowDelay{2};
600template <>
struct std::hash<promeki::ChannelRole> {
601 size_t operator()(
const promeki::ChannelRole &v)
const noexcept {
return std::hash<int>()(v.value()); }