libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
enums_audio.h
Go to the documentation of this file.
1
10#pragma once
11
12
13#include <promeki/config.h>
14#if PROMEKI_ENABLE_CORE
15#include <promeki/namespace.h>
16#include <promeki/enum.h>
17#include <functional>
18
19PROMEKI_NAMESPACE_BEGIN
20
63class AudioMarkerType : public TypedEnum<AudioMarkerType> {
64 public:
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"});
71
72 using TypedEnum<AudioMarkerType>::TypedEnum;
73
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;
79};
80
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};
86
101class AudioDataType : public TypedEnum<AudioDataType> {
102 public:
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"}); // default: PCMI_Float32LE
121
122 using TypedEnum<AudioDataType>::TypedEnum;
123
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;
141};
142
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};
160
183class AudioWireFormat : public TypedEnum<AudioWireFormat> {
184 public:
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)"}); // default: Auto
189
190 using TypedEnum<AudioWireFormat>::TypedEnum;
191
192 static const AudioWireFormat Auto;
193 static const AudioWireFormat L16;
194 static const AudioWireFormat L24;
195};
196
197inline const AudioWireFormat AudioWireFormat::Auto{0};
198inline const AudioWireFormat AudioWireFormat::L16{1};
199inline const AudioWireFormat AudioWireFormat::L24{2};
200
222class AudioConformanceLevel : public TypedEnum<AudioConformanceLevel> {
223 public:
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)"}); // default: None
232
233 using TypedEnum<AudioConformanceLevel>::TypedEnum;
234
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;
242
267 static AudioConformanceLevel compute(int sampleRateHz,
268 int packetTimeUs,
269 int channels);
270};
271
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};
279
280inline AudioConformanceLevel AudioConformanceLevel::compute(int sampleRateHz,
281 int packetTimeUs,
282 int channels) {
283 // Table 2 (Senders): a stream qualifies for a level when its
284 // (rate, ptime, channels) tuple falls within that row. Walk
285 // from lowest level to highest so the lowest matching level
286 // wins (Level A is preferred over AX for the same 48k/1ms
287 // case so single-receiver Level A boxes interoperate).
288 if (channels < 1) return None;
289 if (sampleRateHz == 48000 && packetTimeUs == 1000 && channels >= 1 && channels <= 8) {
290 return A;
291 }
292 if (sampleRateHz == 96000 && packetTimeUs == 1000 && channels >= 1 && channels <= 4) {
293 return AX;
294 }
295 if (sampleRateHz == 48000 && packetTimeUs == 125 && channels >= 1 && channels <= 8) {
296 return B;
297 }
298 if (sampleRateHz == 96000 && packetTimeUs == 125 && channels >= 1 && channels <= 8) {
299 return BX;
300 }
301 if (sampleRateHz == 48000 && packetTimeUs == 125 && channels >= 9 && channels <= 64) {
302 return C;
303 }
304 if (sampleRateHz == 96000 && packetTimeUs == 125 && channels >= 9 && channels <= 32) {
305 return CX;
306 }
307 return None;
308}
309
328class AudioSourceHint : public TypedEnum<AudioSourceHint> {
329 public:
330 PROMEKI_REGISTER_ENUM_TYPE_DISPLAY("AudioSourceHint", "Audio Source Preference", 0,
331 {"Sidecar", 0, "Sidecar Audio File"},
332 {"Embedded", 1, "Embedded Per-Frame Audio"}); // default: Sidecar
333
334 using TypedEnum<AudioSourceHint>::TypedEnum;
335
336 static const AudioSourceHint Sidecar;
337 static const AudioSourceHint Embedded;
338};
339
340inline const AudioSourceHint AudioSourceHint::Sidecar{0};
341inline const AudioSourceHint AudioSourceHint::Embedded{1};
342
365class SrcQuality : public TypedEnum<SrcQuality> {
366 public:
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)"}); // default: SincMedium
373
374 using TypedEnum<SrcQuality>::TypedEnum;
375
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;
381};
382
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};
388
432class ChannelRole : public TypedEnum<ChannelRole> {
433 public:
434 PROMEKI_REGISTER_ENUM_TYPE_DISPLAY("ChannelRole", "Audio Channel Role", 0,
435 {"Unused", 0, "Unused / Unassigned"},
436 {"Mono", 1, "Mono"},
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)"});
469
470 using TypedEnum<ChannelRole>::TypedEnum;
471
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;
514};
515
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};
550
570class OpusApplication : public TypedEnum<OpusApplication> {
571 public:
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"}); // default: Audio
576
577 using TypedEnum<OpusApplication>::TypedEnum;
578
579 static const OpusApplication Voip;
580 static const OpusApplication Audio;
581 static const OpusApplication LowDelay;
582};
583
584inline const OpusApplication OpusApplication::Voip{0};
585inline const OpusApplication OpusApplication::Audio{1};
586inline const OpusApplication OpusApplication::LowDelay{2};
587
590PROMEKI_NAMESPACE_END
591
600template <> struct std::hash<promeki::ChannelRole> {
601 size_t operator()(const promeki::ChannelRole &v) const noexcept { return std::hash<int>()(v.value()); }
602};
603
604#endif // PROMEKI_ENABLE_CORE