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