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