1 /* Simple Plugin API
2  *
3  * Copyright © 2018 Wim Taymans
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice (including the next
13  * paragraph) shall be included in all copies or substantial portions of the
14  * Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22  * DEALINGS IN THE SOFTWARE.
23  */
24 
25 #ifndef SPA_AUDIO_LAYOUT_H
26 #define SPA_AUDIO_LAYOUT_H
27 
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
31 
32 #ifndef __FreeBSD__
33 #include <endian.h>
34 #endif
35 
36 #include <spa/param/audio/raw.h>
37 
38 struct spa_audio_layout_info {
39 	uint32_t n_channels;
40 	uint32_t position[SPA_AUDIO_MAX_CHANNELS];
41 };
42 
43 #define SPA_AUDIO_LAYOUT_Mono		1, { SPA_AUDIO_CHANNEL_MONO, }
44 #define SPA_AUDIO_LAYOUT_Stereo		2, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, }
45 #define SPA_AUDIO_LAYOUT_Quad		4, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
46 					     SPA_AUDIO_CHANNEL_RL, SPA_AUDIO_CHANNEL_RR, }
47 #define SPA_AUDIO_LAYOUT_Pentagonal	5, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
48 					     SPA_AUDIO_CHANNEL_RL, SPA_AUDIO_CHANNEL_RR, \
49 					     SPA_AUDIO_CHANNEL_FC, }
50 #define SPA_AUDIO_LAYOUT_Hexagonal	6, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
51 					     SPA_AUDIO_CHANNEL_RL, SPA_AUDIO_CHANNEL_RR, \
52 					     SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_RC, }
53 #define SPA_AUDIO_LAYOUT_Octagonal	8, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
54 					     SPA_AUDIO_CHANNEL_RL, SPA_AUDIO_CHANNEL_RR, \
55 					     SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_RC, \
56 					     SPA_AUDIO_CHANNEL_SL, SPA_AUDIO_CHANNEL_SR, }
57 #define SPA_AUDIO_LAYOUT_Cube		8, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR }, \
58 					     SPA_AUDIO_CHANNEL_RL, SPA_AUDIO_CHANNEL_RR, \
59 					     SPA_AUDIO_CHANNEL_TFL, SPA_AUDIO_CHANNEL_TFR, \
60 					     SPA_AUDIO_CHANNEL_TRL, SPA_AUDIO_CHANNEL_TRR, }
61 
62 
63 #define SPA_AUDIO_LAYOUT_MPEG_1_0	SPA_AUDIO_LAYOUT_MONO
64 #define SPA_AUDIO_LAYOUT_MPEG_2_0	SPA_AUDIO_LAYOUT_STEREO
65 #define SPA_AUDIO_LAYOUT_MPEG_3_0A	3, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
66 					     SPA_AUDIO_CHANNEL_FC, }
67 #define SPA_AUDIO_LAYOUT_MPEG_3_0B	3, { SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_FL, \
68 					     SPA_AUDIO_CHANNEL_FR, }
69 #define SPA_AUDIO_LAYOUT_MPEG_4_0A	4, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
70 					     SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_RC, }
71 #define SPA_AUDIO_LAYOUT_MPEG_4_0B	4, { SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_FL, \
72 					     SPA_AUDIO_CHANNEL_FR, SPA_AUDIO_CHANNEL_RC, }
73 #define SPA_AUDIO_LAYOUT_MPEG_5_0A	5, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
74 					     SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_SL, \
75 					     SPA_AUDIO_CHANNEL_SR, }
76 #define SPA_AUDIO_LAYOUT_MPEG_5_0B	5, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
77 					     SPA_AUDIO_CHANNEL_SL, SPA_AUDIO_CHANNEL_SR, \
78 					     SPA_AUDIO_CHANNEL_FC, }
79 #define SPA_AUDIO_LAYOUT_MPEG_5_0C	5, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FC, \
80 					     SPA_AUDIO_CHANNEL_FR, SPA_AUDIO_CHANNEL_SL, \
81 					     SPA_AUDIO_CHANNEL_SR, }
82 #define SPA_AUDIO_LAYOUT_MPEG_5_0D	5, { SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_FL, \
83 					     SPA_AUDIO_CHANNEL_FR, SPA_AUDIO_CHANNEL_SL, \
84 					     SPA_AUDIO_CHANNEL_SR, }
85 #define SPA_AUDIO_LAYOUT_MPEG_5_1A	6, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
86 					     SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE, \
87 					     SPA_AUDIO_CHANNEL_SL, SPA_AUDIO_CHANNEL_SR, }
88 #define SPA_AUDIO_LAYOUT_MPEG_5_1B	6, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
89 					     SPA_AUDIO_CHANNEL_SL, SPA_AUDIO_CHANNEL_SR, \
90 					     SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE, }
91 #define SPA_AUDIO_LAYOUT_MPEG_5_1C	6, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FC, \
92 					     SPA_AUDIO_CHANNEL_FR, SPA_AUDIO_CHANNEL_SL, \
93 					     SPA_AUDIO_CHANNEL_SR, SPA_AUDIO_CHANNEL_LFE, }
94 #define SPA_AUDIO_LAYOUT_MPEG_5_1D	6, { SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_FL, \
95 					     SPA_AUDIO_CHANNEL_FR, SPA_AUDIO_CHANNEL_SL, \
96 					     SPA_AUDIO_CHANNEL_SR, SPA_AUDIO_CHANNEL_LFE, }
97 #define SPA_AUDIO_LAYOUT_MPEG_6_1A	7, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
98 					     SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE, \
99 					     SPA_AUDIO_CHANNEL_SL, SPA_AUDIO_CHANNEL_SR, \
100 					     SPA_AUDIO_CHANNEL_RC, }
101 #define SPA_AUDIO_LAYOUT_MPEG_7_1A	8, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
102 					     SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE, \
103 					     SPA_AUDIO_CHANNEL_RL, SPA_AUDIO_CHANNEL_RR, \
104 					     SPA_AUDIO_CHANNEL_SL, SPA_AUDIO_CHANNEL_SR, }
105 #define SPA_AUDIO_LAYOUT_MPEG_7_1B	8, { SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_SL, \
106 					     SPA_AUDIO_CHANNEL_SR, SPA_AUDIO_CHANNEL_FL, \
107 					     SPA_AUDIO_CHANNEL_FR, SPA_AUDIO_CHANNEL_RL, \
108 					     SPA_AUDIO_CHANNEL_RR, SPA_AUDIO_CHANNEL_LFE, }
109 #define SPA_AUDIO_LAYOUT_MPEG_7_1C	8, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
110 					     SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE, \
111 					     SPA_AUDIO_CHANNEL_SL, SPA_AUDIO_CHANNEL_SR, \
112 					     SPA_AUDIO_CHANNEL_RL, SPA_AUDIO_CHANNEL_RR, }
113 
114 
115 #define SPA_AUDIO_LAYOUT_2_1		3, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
116 					     SPA_AUDIO_CHANNEL_LFE, }
117 
118 #define SPA_AUDIO_LAYOUT_2RC		3, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
119 					     SPA_AUDIO_CHANNEL_RC, }
120 #define SPA_AUDIO_LAYOUT_2FC		3, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
121 					     SPA_AUDIO_CHANNEL_FC, }
122 
123 #define SPA_AUDIO_LAYOUT_3_1		4, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
124 					     SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE, }
125 #define SPA_AUDIO_LAYOUT_4_0		4, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
126 					     SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_RC, }
127 #define SPA_AUDIO_LAYOUT_2_2		4, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
128 					     SPA_AUDIO_CHANNEL_SL, SPA_AUDIO_CHANNEL_SR, }
129 
130 #define SPA_AUDIO_LAYOUT_4_1		5, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
131 					     SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE, \
132 					     SPA_AUDIO_CHANNEL_RC, }
133 #define SPA_AUDIO_LAYOUT_5_0		5, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
134 					     SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_SL, \
135 					     SPA_AUDIO_CHANNEL_SR, }
136 #define SPA_AUDIO_LAYOUT_5_0R		5, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
137 					     SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_RL, \
138 					     SPA_AUDIO_CHANNEL_RR, }
139 #define SPA_AUDIO_LAYOUT_5_1		6, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
140 					     SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE, \
141 					     SPA_AUDIO_CHANNEL_SL, SPA_AUDIO_CHANNEL_SR, }
142 #define SPA_AUDIO_LAYOUT_5_1R		6, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
143 					     SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE, \
144 					     SPA_AUDIO_CHANNEL_RL, SPA_AUDIO_CHANNEL_RR, }
145 #define SPA_AUDIO_LAYOUT_6_0		6, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
146 					     SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_RC, \
147 					     SPA_AUDIO_CHANNEL_SL, SPA_AUDIO_CHANNEL_SR, }
148 #define SPA_AUDIO_LAYOUT_6_0F		6, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
149 					     SPA_AUDIO_CHANNEL_FLC, SPA_AUDIO_CHANNEL_FRC, \
150 					     SPA_AUDIO_CHANNEL_SL, SPA_AUDIO_CHANNEL_SR, }
151 #define SPA_AUDIO_LAYOUT_6_1		7, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
152 					     SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE, \
153 					     SPA_AUDIO_CHANNEL_RC, SPA_AUDIO_CHANNEL_SL, \
154 					     SPA_AUDIO_CHANNEL_SR, }
155 #define SPA_AUDIO_LAYOUT_6_1F		7, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
156 					     SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE, \
157 					     SPA_AUDIO_CHANNEL_RL, SPA_AUDIO_CHANNEL_RR, \
158 					     SPA_AUDIO_CHANNEL_RC, }
159 #define SPA_AUDIO_LAYOUT_7_0		7, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
160 					     SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_RL, \
161 					     SPA_AUDIO_CHANNEL_RR, SPA_AUDIO_CHANNEL_SL, \
162 					     SPA_AUDIO_CHANNEL_SR, }
163 #define SPA_AUDIO_LAYOUT_7_0F		7, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
164 					     SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_FLC, \
165 					     SPA_AUDIO_CHANNEL_FRC, SPA_AUDIO_CHANNEL_SL, \
166 					     SPA_AUDIO_CHANNEL_SR, }
167 #define SPA_AUDIO_LAYOUT_7_1		8, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
168 					     SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE, \
169 					     SPA_AUDIO_CHANNEL_RL, SPA_AUDIO_CHANNEL_RR, \
170 					     SPA_AUDIO_CHANNEL_SL, SPA_AUDIO_CHANNEL_SR, }
171 #define SPA_AUDIO_LAYOUT_7_1W		8, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
172 					     SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE, \
173 					     SPA_AUDIO_CHANNEL_FLC, SPA_AUDIO_CHANNEL_FRC, \
174 					     SPA_AUDIO_CHANNEL_SL, SPA_AUDIO_CHANNEL_SR, }
175 #define SPA_AUDIO_LAYOUT_7_1WR		8, { SPA_AUDIO_CHANNEL_FL, SPA_AUDIO_CHANNEL_FR, \
176 					     SPA_AUDIO_CHANNEL_FC, SPA_AUDIO_CHANNEL_LFE, \
177 					     SPA_AUDIO_CHANNEL_RL, SPA_AUDIO_CHANNEL_RR, \
178 					     SPA_AUDIO_CHANNEL_FLC, SPA_AUDIO_CHANNEL_FRC, }
179 
180 #ifdef __cplusplus
181 }  /* extern "C" */
182 #endif
183 
184 #endif /* SPA_AUDIO_LAYOUT_H */
185