|  | /* | 
|  | *  Copyright (c) 2019 The WebRTC project authors. All Rights Reserved. | 
|  | * | 
|  | *  Use of this source code is governed by a BSD-style license | 
|  | *  that can be found in the LICENSE file in the root of the source | 
|  | *  tree. An additional intellectual property rights grant can be found | 
|  | *  in the file PATENTS.  All contributing project authors may | 
|  | *  be found in the AUTHORS file in the root of the source tree. | 
|  | */ | 
|  |  | 
|  | #ifndef API_AUDIO_CHANNEL_LAYOUT_H_ | 
|  | #define API_AUDIO_CHANNEL_LAYOUT_H_ | 
|  |  | 
|  | namespace webrtc { | 
|  |  | 
|  | // This file is derived from Chromium's base/channel_layout.h. | 
|  |  | 
|  | // Enumerates the various representations of the ordering of audio channels. | 
|  | // Logged to UMA, so never reuse a value, always add new/greater ones! | 
|  | enum ChannelLayout { | 
|  | CHANNEL_LAYOUT_NONE = 0, | 
|  | CHANNEL_LAYOUT_UNSUPPORTED = 1, | 
|  |  | 
|  | // Front C | 
|  | CHANNEL_LAYOUT_MONO = 2, | 
|  |  | 
|  | // Front L, Front R | 
|  | CHANNEL_LAYOUT_STEREO = 3, | 
|  |  | 
|  | // Front L, Front R, Back C | 
|  | CHANNEL_LAYOUT_2_1 = 4, | 
|  |  | 
|  | // Front L, Front R, Front C | 
|  | CHANNEL_LAYOUT_SURROUND = 5, | 
|  |  | 
|  | // Front L, Front R, Front C, Back C | 
|  | CHANNEL_LAYOUT_4_0 = 6, | 
|  |  | 
|  | // Front L, Front R, Side L, Side R | 
|  | CHANNEL_LAYOUT_2_2 = 7, | 
|  |  | 
|  | // Front L, Front R, Back L, Back R | 
|  | CHANNEL_LAYOUT_QUAD = 8, | 
|  |  | 
|  | // Front L, Front R, Front C, Side L, Side R | 
|  | CHANNEL_LAYOUT_5_0 = 9, | 
|  |  | 
|  | // Front L, Front R, Front C, LFE, Side L, Side R | 
|  | CHANNEL_LAYOUT_5_1 = 10, | 
|  |  | 
|  | // Front L, Front R, Front C, Back L, Back R | 
|  | CHANNEL_LAYOUT_5_0_BACK = 11, | 
|  |  | 
|  | // Front L, Front R, Front C, LFE, Back L, Back R | 
|  | CHANNEL_LAYOUT_5_1_BACK = 12, | 
|  |  | 
|  | // Front L, Front R, Front C, Side L, Side R, Back L, Back R | 
|  | CHANNEL_LAYOUT_7_0 = 13, | 
|  |  | 
|  | // Front L, Front R, Front C, LFE, Side L, Side R, Back L, Back R | 
|  | CHANNEL_LAYOUT_7_1 = 14, | 
|  |  | 
|  | // Front L, Front R, Front C, LFE, Side L, Side R, Front LofC, Front RofC | 
|  | CHANNEL_LAYOUT_7_1_WIDE = 15, | 
|  |  | 
|  | // Stereo L, Stereo R | 
|  | CHANNEL_LAYOUT_STEREO_DOWNMIX = 16, | 
|  |  | 
|  | // Stereo L, Stereo R, LFE | 
|  | CHANNEL_LAYOUT_2POINT1 = 17, | 
|  |  | 
|  | // Stereo L, Stereo R, Front C, LFE | 
|  | CHANNEL_LAYOUT_3_1 = 18, | 
|  |  | 
|  | // Stereo L, Stereo R, Front C, Rear C, LFE | 
|  | CHANNEL_LAYOUT_4_1 = 19, | 
|  |  | 
|  | // Stereo L, Stereo R, Front C, Side L, Side R, Back C | 
|  | CHANNEL_LAYOUT_6_0 = 20, | 
|  |  | 
|  | // Stereo L, Stereo R, Side L, Side R, Front LofC, Front RofC | 
|  | CHANNEL_LAYOUT_6_0_FRONT = 21, | 
|  |  | 
|  | // Stereo L, Stereo R, Front C, Rear L, Rear R, Rear C | 
|  | CHANNEL_LAYOUT_HEXAGONAL = 22, | 
|  |  | 
|  | // Stereo L, Stereo R, Front C, LFE, Side L, Side R, Rear Center | 
|  | CHANNEL_LAYOUT_6_1 = 23, | 
|  |  | 
|  | // Stereo L, Stereo R, Front C, LFE, Back L, Back R, Rear Center | 
|  | CHANNEL_LAYOUT_6_1_BACK = 24, | 
|  |  | 
|  | // Stereo L, Stereo R, Side L, Side R, Front LofC, Front RofC, LFE | 
|  | CHANNEL_LAYOUT_6_1_FRONT = 25, | 
|  |  | 
|  | // Front L, Front R, Front C, Side L, Side R, Front LofC, Front RofC | 
|  | CHANNEL_LAYOUT_7_0_FRONT = 26, | 
|  |  | 
|  | // Front L, Front R, Front C, LFE, Back L, Back R, Front LofC, Front RofC | 
|  | CHANNEL_LAYOUT_7_1_WIDE_BACK = 27, | 
|  |  | 
|  | // Front L, Front R, Front C, Side L, Side R, Rear L, Back R, Back C. | 
|  | CHANNEL_LAYOUT_OCTAGONAL = 28, | 
|  |  | 
|  | // Channels are not explicitly mapped to speakers. | 
|  | CHANNEL_LAYOUT_DISCRETE = 29, | 
|  |  | 
|  | // Front L, Front R, Front C. Front C contains the keyboard mic audio. This | 
|  | // layout is only intended for input for WebRTC. The Front C channel | 
|  | // is stripped away in the WebRTC audio input pipeline and never seen outside | 
|  | // of that. | 
|  | CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC = 30, | 
|  |  | 
|  | // Front L, Front R, Side L, Side R, LFE | 
|  | CHANNEL_LAYOUT_4_1_QUAD_SIDE = 31, | 
|  |  | 
|  | // Actual channel layout is specified in the bitstream and the actual channel | 
|  | // count is unknown at Chromium media pipeline level (useful for audio | 
|  | // pass-through mode). | 
|  | CHANNEL_LAYOUT_BITSTREAM = 32, | 
|  |  | 
|  | // Max value, must always equal the largest entry ever logged. | 
|  | CHANNEL_LAYOUT_MAX = CHANNEL_LAYOUT_BITSTREAM | 
|  | }; | 
|  |  | 
|  | // Note: Do not reorder or reassign these values; other code depends on their | 
|  | // ordering to operate correctly. E.g., CoreAudio channel layout computations. | 
|  | enum Channels { | 
|  | LEFT = 0, | 
|  | RIGHT, | 
|  | CENTER, | 
|  | LFE, | 
|  | BACK_LEFT, | 
|  | BACK_RIGHT, | 
|  | LEFT_OF_CENTER, | 
|  | RIGHT_OF_CENTER, | 
|  | BACK_CENTER, | 
|  | SIDE_LEFT, | 
|  | SIDE_RIGHT, | 
|  | CHANNELS_MAX = | 
|  | SIDE_RIGHT,  // Must always equal the largest value ever logged. | 
|  | }; | 
|  |  | 
|  | // The maximum number of concurrently active channels for all possible layouts. | 
|  | // ChannelLayoutToChannelCount() will never return a value higher than this. | 
|  | constexpr int kMaxConcurrentChannels = 8; | 
|  |  | 
|  | // Returns the expected channel position in an interleaved stream.  Values of -1 | 
|  | // mean the channel at that index is not used for that layout.  Values range | 
|  | // from 0 to ChannelLayoutToChannelCount(layout) - 1. | 
|  | int ChannelOrder(ChannelLayout layout, Channels channel); | 
|  |  | 
|  | // Returns the number of channels in a given ChannelLayout. | 
|  | int ChannelLayoutToChannelCount(ChannelLayout layout); | 
|  |  | 
|  | // Given the number of channels, return the best layout, | 
|  | // or return CHANNEL_LAYOUT_UNSUPPORTED if there is no good match. | 
|  | ChannelLayout GuessChannelLayout(int channels); | 
|  |  | 
|  | // Returns a string representation of the channel layout. | 
|  | const char* ChannelLayoutToString(ChannelLayout layout); | 
|  |  | 
|  | }  // namespace webrtc | 
|  |  | 
|  | #endif  // API_AUDIO_CHANNEL_LAYOUT_H_ |