channels.c revision 680943a4c349712f641b7577e5b0a3fdf49e39d9
1ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten/*
2ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten * Copyright (C) 2015 The Android Open Source Project
3ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten *
4ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
5ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten * you may not use this file except in compliance with the License.
6ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten * You may obtain a copy of the License at
7ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten *
8ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
9ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten *
10ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten * Unless required by applicable law or agreed to in writing, software
11ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
12ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten * See the License for the specific language governing permissions and
14ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten * limitations under the License.
15ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten */
16ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten
17ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten#include <SLES/OpenSLES.h>
18680943a4c349712f641b7577e5b0a3fdf49e39d9Glenn Kasten#include <system/audio.h>
19ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten#include "channels.h"
20ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten
21ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten// Return an OpenSL ES channel mask, as used in SLDataFormat_PCM.channelMask
22ff25010cb77455a46357d6dd012631a2599d7bf4Glenn KastenSLuint32 channelCountToMask(unsigned channelCount)
23ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten{
24ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten    // FIXME channel mask is not yet implemented by Stagefright, so use a reasonable default
25ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten    //       that is computed from the channel count
26680943a4c349712f641b7577e5b0a3fdf49e39d9Glenn Kasten    if (channelCount > FCC_8) {
27680943a4c349712f641b7577e5b0a3fdf49e39d9Glenn Kasten        return UNKNOWN_CHANNELMASK;
28680943a4c349712f641b7577e5b0a3fdf49e39d9Glenn Kasten    }
29ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten    switch (channelCount) {
30ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten    case 1:
31ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten        // see explanation in data.c re: default channel mask for mono
32ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten        return SL_SPEAKER_FRONT_LEFT;
33ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten    case 2:
34ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten        return SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;
35ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten    // Android-specific
3684bbadf848f606ff28273baf26fc246cf967059aAndy Hung    case 3:
3784bbadf848f606ff28273baf26fc246cf967059aAndy Hung        return SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT | SL_SPEAKER_FRONT_CENTER;
38ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten    case 4:
39ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten        return SL_ANDROID_SPEAKER_QUAD;
4084bbadf848f606ff28273baf26fc246cf967059aAndy Hung    case 5:
4184bbadf848f606ff28273baf26fc246cf967059aAndy Hung        return SL_ANDROID_SPEAKER_QUAD | SL_SPEAKER_FRONT_CENTER;
42ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten    case 6:
43ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten        return SL_ANDROID_SPEAKER_5DOT1;
4484bbadf848f606ff28273baf26fc246cf967059aAndy Hung    case 7:
4584bbadf848f606ff28273baf26fc246cf967059aAndy Hung        return SL_ANDROID_SPEAKER_5DOT1 | SL_SPEAKER_BACK_CENTER;
46ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten    case 8:
47ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten        return SL_ANDROID_SPEAKER_7DOT1;
48ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten    default:
49ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten        return UNKNOWN_CHANNELMASK;
50ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten    }
51ff25010cb77455a46357d6dd012631a2599d7bf4Glenn Kasten}
52