1 /*
2  *  Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef API_AUDIO_CHANNEL_LAYOUT_H_
12 #define API_AUDIO_CHANNEL_LAYOUT_H_
13 
14 namespace webrtc {
15 
16 // This file is derived from Chromium's base/channel_layout.h.
17 
18 // Enumerates the various representations of the ordering of audio channels.
19 // Logged to UMA, so never reuse a value, always add new/greater ones!
20 enum ChannelLayout {
21   CHANNEL_LAYOUT_NONE = 0,
22   CHANNEL_LAYOUT_UNSUPPORTED = 1,
23 
24   // Front C
25   CHANNEL_LAYOUT_MONO = 2,
26 
27   // Front L, Front R
28   CHANNEL_LAYOUT_STEREO = 3,
29 
30   // Front L, Front R, Back C
31   CHANNEL_LAYOUT_2_1 = 4,
32 
33   // Front L, Front R, Front C
34   CHANNEL_LAYOUT_SURROUND = 5,
35 
36   // Front L, Front R, Front C, Back C
37   CHANNEL_LAYOUT_4_0 = 6,
38 
39   // Front L, Front R, Side L, Side R
40   CHANNEL_LAYOUT_2_2 = 7,
41 
42   // Front L, Front R, Back L, Back R
43   CHANNEL_LAYOUT_QUAD = 8,
44 
45   // Front L, Front R, Front C, Side L, Side R
46   CHANNEL_LAYOUT_5_0 = 9,
47 
48   // Front L, Front R, Front C, LFE, Side L, Side R
49   CHANNEL_LAYOUT_5_1 = 10,
50 
51   // Front L, Front R, Front C, Back L, Back R
52   CHANNEL_LAYOUT_5_0_BACK = 11,
53 
54   // Front L, Front R, Front C, LFE, Back L, Back R
55   CHANNEL_LAYOUT_5_1_BACK = 12,
56 
57   // Front L, Front R, Front C, Side L, Side R, Back L, Back R
58   CHANNEL_LAYOUT_7_0 = 13,
59 
60   // Front L, Front R, Front C, LFE, Side L, Side R, Back L, Back R
61   CHANNEL_LAYOUT_7_1 = 14,
62 
63   // Front L, Front R, Front C, LFE, Side L, Side R, Front LofC, Front RofC
64   CHANNEL_LAYOUT_7_1_WIDE = 15,
65 
66   // Stereo L, Stereo R
67   CHANNEL_LAYOUT_STEREO_DOWNMIX = 16,
68 
69   // Stereo L, Stereo R, LFE
70   CHANNEL_LAYOUT_2POINT1 = 17,
71 
72   // Stereo L, Stereo R, Front C, LFE
73   CHANNEL_LAYOUT_3_1 = 18,
74 
75   // Stereo L, Stereo R, Front C, Rear C, LFE
76   CHANNEL_LAYOUT_4_1 = 19,
77 
78   // Stereo L, Stereo R, Front C, Side L, Side R, Back C
79   CHANNEL_LAYOUT_6_0 = 20,
80 
81   // Stereo L, Stereo R, Side L, Side R, Front LofC, Front RofC
82   CHANNEL_LAYOUT_6_0_FRONT = 21,
83 
84   // Stereo L, Stereo R, Front C, Rear L, Rear R, Rear C
85   CHANNEL_LAYOUT_HEXAGONAL = 22,
86 
87   // Stereo L, Stereo R, Front C, LFE, Side L, Side R, Rear Center
88   CHANNEL_LAYOUT_6_1 = 23,
89 
90   // Stereo L, Stereo R, Front C, LFE, Back L, Back R, Rear Center
91   CHANNEL_LAYOUT_6_1_BACK = 24,
92 
93   // Stereo L, Stereo R, Side L, Side R, Front LofC, Front RofC, LFE
94   CHANNEL_LAYOUT_6_1_FRONT = 25,
95 
96   // Front L, Front R, Front C, Side L, Side R, Front LofC, Front RofC
97   CHANNEL_LAYOUT_7_0_FRONT = 26,
98 
99   // Front L, Front R, Front C, LFE, Back L, Back R, Front LofC, Front RofC
100   CHANNEL_LAYOUT_7_1_WIDE_BACK = 27,
101 
102   // Front L, Front R, Front C, Side L, Side R, Rear L, Back R, Back C.
103   CHANNEL_LAYOUT_OCTAGONAL = 28,
104 
105   // Channels are not explicitly mapped to speakers.
106   CHANNEL_LAYOUT_DISCRETE = 29,
107 
108   // Front L, Front R, Front C. Front C contains the keyboard mic audio. This
109   // layout is only intended for input for WebRTC. The Front C channel
110   // is stripped away in the WebRTC audio input pipeline and never seen outside
111   // of that.
112   CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC = 30,
113 
114   // Front L, Front R, Side L, Side R, LFE
115   CHANNEL_LAYOUT_4_1_QUAD_SIDE = 31,
116 
117   // Actual channel layout is specified in the bitstream and the actual channel
118   // count is unknown at Chromium media pipeline level (useful for audio
119   // pass-through mode).
120   CHANNEL_LAYOUT_BITSTREAM = 32,
121 
122   // Max value, must always equal the largest entry ever logged.
123   CHANNEL_LAYOUT_MAX = CHANNEL_LAYOUT_BITSTREAM
124 };
125 
126 // Note: Do not reorder or reassign these values; other code depends on their
127 // ordering to operate correctly. E.g., CoreAudio channel layout computations.
128 enum Channels {
129   LEFT = 0,
130   RIGHT,
131   CENTER,
132   LFE,
133   BACK_LEFT,
134   BACK_RIGHT,
135   LEFT_OF_CENTER,
136   RIGHT_OF_CENTER,
137   BACK_CENTER,
138   SIDE_LEFT,
139   SIDE_RIGHT,
140   CHANNELS_MAX =
141       SIDE_RIGHT,  // Must always equal the largest value ever logged.
142 };
143 
144 // The maximum number of concurrently active channels for all possible layouts.
145 // ChannelLayoutToChannelCount() will never return a value higher than this.
146 constexpr int kMaxConcurrentChannels = 8;
147 
148 // Returns the expected channel position in an interleaved stream.  Values of -1
149 // mean the channel at that index is not used for that layout.  Values range
150 // from 0 to ChannelLayoutToChannelCount(layout) - 1.
151 int ChannelOrder(ChannelLayout layout, Channels channel);
152 
153 // Returns the number of channels in a given ChannelLayout.
154 int ChannelLayoutToChannelCount(ChannelLayout layout);
155 
156 // Given the number of channels, return the best layout,
157 // or return CHANNEL_LAYOUT_UNSUPPORTED if there is no good match.
158 ChannelLayout GuessChannelLayout(int channels);
159 
160 // Returns a string representation of the channel layout.
161 const char* ChannelLayoutToString(ChannelLayout layout);
162 
163 }  // namespace webrtc
164 
165 #endif  // API_AUDIO_CHANNEL_LAYOUT_H_
166