android_sles_conversions.h revision c323fec2a2639c0cf7463016d592d0eb0539657c
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 2010 The Android Open Source Project
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License");
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * you may not use this file except in compliance with the License.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * You may obtain a copy of the License at
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      http://www.apache.org/licenses/LICENSE-2.0
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Unless required by applicable law or agreed to in writing, software
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS,
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See the License for the specific language governing permissions and
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * limitations under the License.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "math.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <system/audio.h>
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//-----------------------------------------------------------------------------
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Android to OpenSL ES
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//----------------------
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline SLuint32 android_to_sles_streamType(int type) {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (SLuint32) type;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline SLuint32 android_to_sles_sampleRate(uint32_t srHz) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // convert to milliHertz
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (SLuint32) srHz*1000;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//-----------------------------------------------------------------------------
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OpenSL ES to Android
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//----------------------
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline int sles_to_android_streamType(SLuint32 type) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (int)type;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline uint32_t sles_to_android_sampleRate(SLuint32 sampleRateMilliHertz) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (uint32_t)(sampleRateMilliHertz / 1000);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline audio_format_t sles_to_android_sampleFormat(SLuint32 formatType,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SLuint32 containerSize) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (formatType) {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SL_DATAFORMAT_PCM:
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        switch (containerSize) {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case 8:
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return AUDIO_FORMAT_PCM_8_BIT;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case 16:
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return AUDIO_FORMAT_PCM_16_BIT;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case 24:
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return AUDIO_FORMAT_PCM_24_BIT_PACKED;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case 32:
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return AUDIO_FORMAT_PCM_32_BIT;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            default:
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return AUDIO_FORMAT_INVALID;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return AUDIO_FORMAT_INVALID;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline audio_channel_mask_t sles_to_android_channelMaskIn(SLuint32 nbChannels,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SLuint32 channelMask) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // FIXME handle channel mask mapping between SL ES and Android
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return audio_channel_in_mask_from_count(nbChannels);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline audio_channel_mask_t sles_to_android_channelMaskOut(SLuint32 nbChannels,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SLuint32 channelMask) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // FIXME handle channel mask mapping between SL ES and Android
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return audio_channel_out_mask_from_count(nbChannels);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline float sles_to_android_amplification(SLmillibel level) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // FIXME use the FX Framework conversions
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return pow(10, (float)level/2000);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline uint32_t channelCountToMask(uint32_t channelCount)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // FIXME channel mask is not yet implemented by Stagefright, so use a reasonable default
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //       that is computed from the channel count
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32_t channelMask;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (channelCount) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 1:
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // see explanation in data.c re: default channel mask for mono
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return SL_SPEAKER_FRONT_LEFT;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 2:
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Android-specific
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 4:
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               | SL_SPEAKER_BACK_LEFT | SL_SPEAKER_BACK_RIGHT;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 6:
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT| SL_SPEAKER_FRONT_CENTER
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               | SL_SPEAKER_LOW_FREQUENCY
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               | SL_SPEAKER_BACK_LEFT | SL_SPEAKER_BACK_RIGHT;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 8:
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT | SL_SPEAKER_FRONT_CENTER
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               | SL_SPEAKER_LOW_FREQUENCY
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               | SL_SPEAKER_BACK_LEFT | SL_SPEAKER_BACK_RIGHT
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               | SL_SPEAKER_SIDE_LEFT |SL_SPEAKER_SIDE_RIGHT;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return UNKNOWN_CHANNELMASK;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)