1712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi/*
2712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project
3712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi *
4712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
5712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi * you may not use this file except in compliance with the License.
6712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi * You may obtain a copy of the License at
7712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi *
8712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
9712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi *
10712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
11712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
12712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi * See the License for the specific language governing permissions and
14712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi * limitations under the License.
15712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi */
16712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi
17172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi#include "math.h"
18712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi
1910a3840407ac3ed61e7873ee7b86d664ccc6149fDima Zavin#include <system/audio.h>
20ca39f4b4dbeb920a5b97bd65be73f2f7cac77431Dima Zavin
21712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi//-----------------------------------------------------------------------------
22712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi// Android to OpenSL ES
23712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi//----------------------
24712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivistatic inline SLuint32 android_to_sles_streamType(int type) {
25712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi    return (SLuint32) type;
26712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi}
27712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi
28712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi
29712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivistatic inline SLuint32 android_to_sles_sampleRate(uint32_t srHz) {
30712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi    // convert to milliHertz
31712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi    return (SLuint32) srHz*1000;
32712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi}
33712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi
34712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi
35712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi//-----------------------------------------------------------------------------
36712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi// OpenSL ES to Android
37712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi//----------------------
38712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivistatic inline int sles_to_android_streamType(SLuint32 type) {
39712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi    return (int)type;
40712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi}
41712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi
42712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi
43712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivistatic inline uint32_t sles_to_android_sampleRate(SLuint32 sampleRateMilliHertz) {
44712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi    return (uint32_t)(sampleRateMilliHertz / 1000);
45712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi}
46712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi
4718a0d51a7d8fc7387f40e0c0ca16a93062fb4c6fGlenn Kastenstatic inline audio_format_t sles_to_android_sampleFormat(SLuint32 pcmFormat) {
48712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi    switch (pcmFormat) {
49712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi        case SL_PCMSAMPLEFORMAT_FIXED_16:
50ca39f4b4dbeb920a5b97bd65be73f2f7cac77431Dima Zavin            return AUDIO_FORMAT_PCM_16_BIT;
51712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi            break;
52712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi        case SL_PCMSAMPLEFORMAT_FIXED_8:
53ca39f4b4dbeb920a5b97bd65be73f2f7cac77431Dima Zavin            return AUDIO_FORMAT_PCM_8_BIT;
54712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi            break;
55712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi        case SL_PCMSAMPLEFORMAT_FIXED_20:
56712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi        case SL_PCMSAMPLEFORMAT_FIXED_24:
57712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi        case SL_PCMSAMPLEFORMAT_FIXED_28:
58712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi        case SL_PCMSAMPLEFORMAT_FIXED_32:
59712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi        default:
60ca39f4b4dbeb920a5b97bd65be73f2f7cac77431Dima Zavin            return AUDIO_FORMAT_INVALID;
61712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi    }
62712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi}
63712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi
64712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi
6572721a95943c68ea0d75eb5c1ff2ab7380e4dc6fGlenn Kastenstatic inline audio_channel_mask_t sles_to_android_channelMaskIn(SLuint32 nbChannels, SLuint32 channelMask) {
661d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten    // FIXME handle channel mask mapping between SL ES and Android
675cb9343d2739da755186f8dcdf1da307671e7353Glenn Kasten    return audio_channel_in_mask_from_count(nbChannels);
681d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten}
691d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten
701d081e49a10543018e1ae33792bd3d30504719baGlenn Kasten
7172721a95943c68ea0d75eb5c1ff2ab7380e4dc6fGlenn Kastenstatic inline audio_channel_mask_t sles_to_android_channelMaskOut(SLuint32 nbChannels, SLuint32 channelMask) {
72712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi    // FIXME handle channel mask mapping between SL ES and Android
735cb9343d2739da755186f8dcdf1da307671e7353Glenn Kasten    return audio_channel_out_mask_from_count(nbChannels);
74712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi}
75172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi
76172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi
77172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivistatic inline float sles_to_android_amplification(SLmillibel level) {
78172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    // FIXME use the FX Framework conversions
79172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    return pow(10, (float)level/2000);
80172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi}
8120d9a1229c7647dd2c6f1bece715080ec6202ecaGlenn Kasten
8220d9a1229c7647dd2c6f1bece715080ec6202ecaGlenn Kasten
8320d9a1229c7647dd2c6f1bece715080ec6202ecaGlenn Kastenstatic inline uint32_t channelCountToMask(uint32_t channelCount)
8420d9a1229c7647dd2c6f1bece715080ec6202ecaGlenn Kasten{
8520d9a1229c7647dd2c6f1bece715080ec6202ecaGlenn Kasten    // FIXME channel mask is not yet implemented by Stagefright, so use a reasonable default
8620d9a1229c7647dd2c6f1bece715080ec6202ecaGlenn Kasten    //       that is computed from the channel count
8720d9a1229c7647dd2c6f1bece715080ec6202ecaGlenn Kasten    uint32_t channelMask;
8820d9a1229c7647dd2c6f1bece715080ec6202ecaGlenn Kasten    switch (channelCount) {
8920d9a1229c7647dd2c6f1bece715080ec6202ecaGlenn Kasten    case 1:
9020d9a1229c7647dd2c6f1bece715080ec6202ecaGlenn Kasten        // see explanation in data.c re: default channel mask for mono
9120d9a1229c7647dd2c6f1bece715080ec6202ecaGlenn Kasten        return SL_SPEAKER_FRONT_LEFT;
9220d9a1229c7647dd2c6f1bece715080ec6202ecaGlenn Kasten    case 2:
9320d9a1229c7647dd2c6f1bece715080ec6202ecaGlenn Kasten        return SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;
9420d9a1229c7647dd2c6f1bece715080ec6202ecaGlenn Kasten    default:
9520d9a1229c7647dd2c6f1bece715080ec6202ecaGlenn Kasten        return UNKNOWN_CHANNELMASK;
9620d9a1229c7647dd2c6f1bece715080ec6202ecaGlenn Kasten    }
9720d9a1229c7647dd2c6f1bece715080ec6202ecaGlenn Kasten}
98