annotate foosdk/sdk/foobar2000/SDK/audio_chunk_channel_config.cpp @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "foobar2000-sdk-pch.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "audio_chunk.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include <ks.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #include <ksmedia.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 #if 0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 #define SPEAKER_FRONT_LEFT 0x1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 #define SPEAKER_FRONT_RIGHT 0x2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 #define SPEAKER_FRONT_CENTER 0x4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 #define SPEAKER_LOW_FREQUENCY 0x8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 #define SPEAKER_BACK_LEFT 0x10
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 #define SPEAKER_BACK_RIGHT 0x20
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 #define SPEAKER_FRONT_LEFT_OF_CENTER 0x40
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 #define SPEAKER_FRONT_RIGHT_OF_CENTER 0x80
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 #define SPEAKER_BACK_CENTER 0x100
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 #define SPEAKER_SIDE_LEFT 0x200
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 #define SPEAKER_SIDE_RIGHT 0x400
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 #define SPEAKER_TOP_CENTER 0x800
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 #define SPEAKER_TOP_FRONT_LEFT 0x1000
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 #define SPEAKER_TOP_FRONT_CENTER 0x2000
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 #define SPEAKER_TOP_FRONT_RIGHT 0x4000
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 #define SPEAKER_TOP_BACK_LEFT 0x8000
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 #define SPEAKER_TOP_BACK_CENTER 0x10000
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 #define SPEAKER_TOP_BACK_RIGHT 0x20000
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 static struct {DWORD m_wfx; unsigned m_native; } const g_translation_table[] =
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 {SPEAKER_FRONT_LEFT, audio_chunk::channel_front_left},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 {SPEAKER_FRONT_RIGHT, audio_chunk::channel_front_right},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 {SPEAKER_FRONT_CENTER, audio_chunk::channel_front_center},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 {SPEAKER_LOW_FREQUENCY, audio_chunk::channel_lfe},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 {SPEAKER_BACK_LEFT, audio_chunk::channel_back_left},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 {SPEAKER_BACK_RIGHT, audio_chunk::channel_back_right},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 {SPEAKER_FRONT_LEFT_OF_CENTER, audio_chunk::channel_front_center_left},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 {SPEAKER_FRONT_RIGHT_OF_CENTER, audio_chunk::channel_front_center_right},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 {SPEAKER_BACK_CENTER, audio_chunk::channel_back_center},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 {SPEAKER_SIDE_LEFT, audio_chunk::channel_side_left},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 {SPEAKER_SIDE_RIGHT, audio_chunk::channel_side_right},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 {SPEAKER_TOP_CENTER, audio_chunk::channel_top_center},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 {SPEAKER_TOP_FRONT_LEFT, audio_chunk::channel_top_front_left},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 {SPEAKER_TOP_FRONT_CENTER, audio_chunk::channel_top_front_center},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 {SPEAKER_TOP_FRONT_RIGHT, audio_chunk::channel_top_front_right},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 {SPEAKER_TOP_BACK_LEFT, audio_chunk::channel_top_back_left},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 {SPEAKER_TOP_BACK_CENTER, audio_chunk::channel_top_back_center},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 {SPEAKER_TOP_BACK_RIGHT, audio_chunk::channel_top_back_right},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 static constexpr unsigned g_audio_channel_config_table[] =
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 audio_chunk::channel_config_mono,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 audio_chunk::channel_config_stereo,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 audio_chunk::channel_front_left | audio_chunk::channel_front_right | audio_chunk::channel_lfe,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 audio_chunk::channel_front_left | audio_chunk::channel_front_right | audio_chunk::channel_back_left | audio_chunk::channel_back_right,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 audio_chunk::channel_front_left | audio_chunk::channel_front_right | audio_chunk::channel_back_left | audio_chunk::channel_back_right | audio_chunk::channel_lfe,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 audio_chunk::channel_config_5point1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 audio_chunk::channel_config_5point1_side | audio_chunk::channel_back_center,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 audio_chunk::channel_config_7point1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 audio_chunk::channel_config_7point1 | audio_chunk::channel_front_center_right | audio_chunk::channel_front_center_left,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 unsigned audio_chunk::g_guess_channel_config(unsigned count)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 if (count == 0) return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 if (count > 32) throw exception_io_data();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 unsigned ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 if (count < PFC_TABSIZE(g_audio_channel_config_table)) ret = g_audio_channel_config_table[count];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 if (ret == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 // Warning: 1u<<32u behaves stupidly
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 ret = (unsigned)( (1ull << count) - 1 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 PFC_ASSERT(g_count_channels(ret) == count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 unsigned audio_chunk::g_guess_channel_config_xiph(unsigned count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 switch (count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 case 3:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 return audio_chunk::channel_front_left | audio_chunk::channel_front_center | audio_chunk::channel_front_right;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 case 5:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 return audio_chunk::channel_front_left | audio_chunk::channel_front_center | audio_chunk::channel_front_right | audio_chunk::channel_back_left | audio_chunk::channel_back_right;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 case 7:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 return audio_chunk::channel_config_5point1 | audio_chunk::channel_back_center;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 return g_guess_channel_config(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 unsigned audio_chunk::g_channel_index_from_flag(unsigned p_config,unsigned p_flag) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 if (p_config & p_flag) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 unsigned index = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 for (unsigned walk = 0; walk < 32; walk++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 unsigned query = 1 << walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 if (p_flag & query) return index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 if (p_config & query) index++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 return (unsigned)(-1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 unsigned audio_chunk::g_extract_channel_flag(unsigned p_config,unsigned p_index)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 unsigned toskip = p_index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 unsigned flag = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 while(flag)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 if (p_config & flag)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 if (toskip == 0) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 toskip--;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 flag <<= 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 return flag;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 static const char * const chanNames[] = {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 "FL", //channel_front_left = 1<<0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 "FR", //channel_front_right = 1<<1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 "FC", //channel_front_center = 1<<2,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 "LFE", //channel_lfe = 1<<3,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 "BL", //channel_back_left = 1<<4,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 "BR", //channel_back_right = 1<<5,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 "FCL", //channel_front_center_left = 1<<6,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 "FCR", //channel_front_center_right = 1<<7,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 "BC", //channel_back_center = 1<<8,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 "SL", //channel_side_left = 1<<9,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 "SR", //channel_side_right = 1<<10,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 "TC", //channel_top_center = 1<<11,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 "TFL", //channel_top_front_left = 1<<12,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 "TFC", //channel_top_front_center = 1<<13,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 "TFR", //channel_top_front_right = 1<<14,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 "TBL", //channel_top_back_left = 1<<15,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 "TBC", //channel_top_back_center = 1<<16,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 "TBR", //channel_top_back_right = 1<<17,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 unsigned audio_chunk::g_find_channel_idx(unsigned p_flag) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 unsigned rv = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 if ((p_flag & 0xFFFF) == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 rv += 16; p_flag >>= 16;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 if ((p_flag & 0xFF) == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 rv += 8; p_flag >>= 8;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 if ((p_flag & 0xF) == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 rv += 4; p_flag >>= 4;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 if ((p_flag & 0x3) == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 rv += 2; p_flag >>= 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 if ((p_flag & 0x1) == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 rv += 1; p_flag >>= 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 PFC_ASSERT( p_flag & 1 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 return rv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 const char * audio_chunk::g_channel_name(unsigned p_flag) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 return g_channel_name_byidx(g_find_channel_idx(p_flag));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 const char * audio_chunk::g_channel_name_byidx(unsigned p_index) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 if (p_index < PFC_TABSIZE(chanNames)) return chanNames[p_index];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 else return "?";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 pfc::string8 audio_chunk::g_formatChannelMaskDesc(unsigned flags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 pfc::string8 temp; g_formatChannelMaskDesc(flags, temp); return temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 void audio_chunk::g_formatChannelMaskDesc(unsigned flags, pfc::string_base & out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 out.reset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 unsigned idx = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 while(flags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 if (flags & 1) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 if (!out.is_empty()) out << " ";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 out << g_channel_name_byidx(idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 flags >>= 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 ++idx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 struct maskDesc_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 const char* name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 unsigned mask;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 static constexpr maskDesc_t maskDesc[] = {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 {"mono", audio_chunk::channel_config_mono},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 {"stereo", audio_chunk::channel_config_stereo},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 {"stereo (rear)", audio_chunk::channel_back_left | audio_chunk::channel_back_right},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 {"stereo (side)", audio_chunk::channel_side_left | audio_chunk::channel_side_right},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 {"2.1", audio_chunk::channel_config_2point1},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 {"3.0", audio_chunk::channel_config_3point0},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 {"4.0", audio_chunk::channel_config_4point0},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 {"4.1", audio_chunk::channel_config_4point1},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 {"5.0", audio_chunk::channel_config_5point0},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 {"5.1", audio_chunk::channel_config_5point1},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 {"5.1 (side)", audio_chunk::channel_config_5point1_side},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 {"6.1", audio_chunk::channel_config_5point1 | audio_chunk::channel_back_center},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 {"6.1 (side)", audio_chunk::channel_config_5point1_side | audio_chunk::channel_back_center},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 {"7.1", audio_chunk::channel_config_7point1},
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 const char* audio_chunk::g_channelMaskName(unsigned flags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 for (auto& walk : maskDesc) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 if (flags == walk.mask) return walk.name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 return nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 static_assert( pfc::countBits32(audio_chunk::channel_config_mono) == 1 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 static_assert( pfc::countBits32(audio_chunk::channel_config_stereo) == 2 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 static_assert( pfc::countBits32(audio_chunk::channel_config_4point0) == 4 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 static_assert( pfc::countBits32(audio_chunk::channel_config_4point0_side) == 4 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 static_assert( pfc::countBits32(audio_chunk::channel_config_4point1) == 5 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 static_assert( pfc::countBits32(audio_chunk::channel_config_5point0) == 5 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 static_assert( pfc::countBits32(audio_chunk::channel_config_5point1) == 6 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 static_assert( pfc::countBits32(audio_chunk::channel_config_5point1_side) == 6 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 static_assert( pfc::countBits32(audio_chunk::channel_config_6point0) == 6);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 static_assert( pfc::countBits32(audio_chunk::channel_config_7point1) == 8 );