12110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie/* 22110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie * Copyright (C) 2015 The Android Open Source Project 32110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie * 42110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie * Licensed under the Apache License, Version 2.0 (the "License"); 52110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie * you may not use this file except in compliance with the License. 62110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie * You may obtain a copy of the License at 72110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie * 82110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie * http://www.apache.org/licenses/LICENSE-2.0 92110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie * 102110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie * Unless required by applicable law or agreed to in writing, software 112110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie * distributed under the License is distributed on an "AS IS" BASIS, 122110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie * See the License for the specific language governing permissions and 142110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie * limitations under the License. 152110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie */ 162110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 172110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie#define LOG_TAG "APM::Gains" 182110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie//#define LOG_NDEBUG 0 192110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 202110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie//#define VERY_VERBOSE_LOGGING 212110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie#ifdef VERY_VERBOSE_LOGGING 222110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie#define ALOGVV ALOGV 232110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie#else 242110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie#define ALOGVV(a...) do { } while(0) 252110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie#endif 262110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 272110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie#include "Gains.h" 282110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie#include <Volume.h> 292110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie#include <math.h> 302110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie#include <utils/String8.h> 312110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 322110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffienamespace android { 332110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 342110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie// Enginedefault 352110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffieconst VolumeCurvePoint 362110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois GaffieGains::sDefaultVolumeCurve[Volume::VOLCNT] = { 372110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie {1, -49.5f}, {33, -33.5f}, {66, -17.0f}, {100, 0.0f} 382110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}; 392110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 402110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 412110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffieconst VolumeCurvePoint 422110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois GaffieGains::sDefaultMediaVolumeCurve[Volume::VOLCNT] = { 432110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie {1, -58.0f}, {20, -40.0f}, {60, -17.0f}, {100, 0.0f} 442110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}; 452110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 462110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffieconst VolumeCurvePoint 472110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois GaffieGains::sExtMediaSystemVolumeCurve[Volume::VOLCNT] = { 482110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie {1, -58.0f}, {20, -40.0f}, {60, -21.0f}, {100, -10.0f} 492110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}; 502110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 512110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffieconst VolumeCurvePoint 522110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois GaffieGains::sSpeakerMediaVolumeCurve[Volume::VOLCNT] = { 532110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie {1, -56.0f}, {20, -34.0f}, {60, -11.0f}, {100, 0.0f} 542110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}; 552110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 562110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffieconst VolumeCurvePoint 572110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois GaffieGains::sSpeakerMediaVolumeCurveDrc[Volume::VOLCNT] = { 582110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie {1, -55.0f}, {20, -43.0f}, {86, -12.0f}, {100, 0.0f} 592110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}; 602110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 612110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffieconst VolumeCurvePoint 622110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois GaffieGains::sSpeakerSonificationVolumeCurve[Volume::VOLCNT] = { 632110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie {1, -29.7f}, {33, -20.1f}, {66, -10.2f}, {100, 0.0f} 642110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}; 652110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 662110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffieconst VolumeCurvePoint 672110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois GaffieGains::sSpeakerSonificationVolumeCurveDrc[Volume::VOLCNT] = { 682110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie {1, -35.7f}, {33, -26.1f}, {66, -13.2f}, {100, 0.0f} 692110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}; 702110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 712110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie// AUDIO_STREAM_SYSTEM, AUDIO_STREAM_ENFORCED_AUDIBLE and AUDIO_STREAM_DTMF volume tracks 722110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie// AUDIO_STREAM_RING on phones and AUDIO_STREAM_MUSIC on tablets. 732110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie// AUDIO_STREAM_DTMF tracks AUDIO_STREAM_VOICE_CALL while in call (See AudioService.java). 742110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie// The range is constrained between -24dB and -6dB over speaker and -30dB and -18dB over headset. 752110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 762110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffieconst VolumeCurvePoint 772110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois GaffieGains::sDefaultSystemVolumeCurve[Volume::VOLCNT] = { 782110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie {1, -24.0f}, {33, -18.0f}, {66, -12.0f}, {100, -6.0f} 792110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}; 802110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 812110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffieconst VolumeCurvePoint 822110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois GaffieGains::sDefaultSystemVolumeCurveDrc[Volume::VOLCNT] = { 832110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie {1, -34.0f}, {33, -24.0f}, {66, -15.0f}, {100, -6.0f} 842110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}; 852110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 862110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffieconst VolumeCurvePoint 872110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois GaffieGains::sHeadsetSystemVolumeCurve[Volume::VOLCNT] = { 882110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie {1, -30.0f}, {33, -26.0f}, {66, -22.0f}, {100, -18.0f} 892110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}; 902110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 912110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffieconst VolumeCurvePoint 922110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois GaffieGains::sDefaultVoiceVolumeCurve[Volume::VOLCNT] = { 932110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie {0, -42.0f}, {33, -28.0f}, {66, -14.0f}, {100, 0.0f} 942110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}; 952110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 962110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffieconst VolumeCurvePoint 972110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois GaffieGains::sSpeakerVoiceVolumeCurve[Volume::VOLCNT] = { 982110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie {0, -24.0f}, {33, -16.0f}, {66, -8.0f}, {100, 0.0f} 992110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}; 1002110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 1012110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffieconst VolumeCurvePoint 1022110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois GaffieGains::sLinearVolumeCurve[Volume::VOLCNT] = { 1032110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie {0, -96.0f}, {33, -68.0f}, {66, -34.0f}, {100, 0.0f} 1042110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}; 1052110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 1062110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffieconst VolumeCurvePoint 1072110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois GaffieGains::sSilentVolumeCurve[Volume::VOLCNT] = { 1082110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie {0, -96.0f}, {1, -96.0f}, {2, -96.0f}, {100, -96.0f} 1092110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}; 1102110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 1112110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffieconst VolumeCurvePoint 1122110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois GaffieGains::sFullScaleVolumeCurve[Volume::VOLCNT] = { 1132110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie {0, 0.0f}, {1, 0.0f}, {2, 0.0f}, {100, 0.0f} 1142110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}; 1152110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 1162110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffieconst VolumeCurvePoint *Gains::sVolumeProfiles[AUDIO_STREAM_CNT] 117d0609ad390ff8bb1cafebdf363bf1d15e63b949fFrançois Gaffie [DEVICE_CATEGORY_CNT] = { 1182110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie { // AUDIO_STREAM_VOICE_CALL 1192110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sDefaultVoiceVolumeCurve, // DEVICE_CATEGORY_HEADSET 1202110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sSpeakerVoiceVolumeCurve, // DEVICE_CATEGORY_SPEAKER 1212110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sSpeakerVoiceVolumeCurve, // DEVICE_CATEGORY_EARPIECE 1222110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sDefaultMediaVolumeCurve // DEVICE_CATEGORY_EXT_MEDIA 1232110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie }, 1242110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie { // AUDIO_STREAM_SYSTEM 1252110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sHeadsetSystemVolumeCurve, // DEVICE_CATEGORY_HEADSET 1262110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sDefaultSystemVolumeCurve, // DEVICE_CATEGORY_SPEAKER 1272110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sDefaultSystemVolumeCurve, // DEVICE_CATEGORY_EARPIECE 1282110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sExtMediaSystemVolumeCurve // DEVICE_CATEGORY_EXT_MEDIA 1292110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie }, 1302110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie { // AUDIO_STREAM_RING 1312110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sDefaultVolumeCurve, // DEVICE_CATEGORY_HEADSET 1322110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sSpeakerSonificationVolumeCurve, // DEVICE_CATEGORY_SPEAKER 1332110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sDefaultVolumeCurve, // DEVICE_CATEGORY_EARPIECE 1342110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sExtMediaSystemVolumeCurve // DEVICE_CATEGORY_EXT_MEDIA 1352110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie }, 1362110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie { // AUDIO_STREAM_MUSIC 1372110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sDefaultMediaVolumeCurve, // DEVICE_CATEGORY_HEADSET 1382110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sSpeakerMediaVolumeCurve, // DEVICE_CATEGORY_SPEAKER 1392110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sDefaultMediaVolumeCurve, // DEVICE_CATEGORY_EARPIECE 1402110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sDefaultMediaVolumeCurve // DEVICE_CATEGORY_EXT_MEDIA 1412110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie }, 1422110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie { // AUDIO_STREAM_ALARM 1432110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sDefaultVolumeCurve, // DEVICE_CATEGORY_HEADSET 1442110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sSpeakerSonificationVolumeCurve, // DEVICE_CATEGORY_SPEAKER 1452110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sDefaultVolumeCurve, // DEVICE_CATEGORY_EARPIECE 1462110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sExtMediaSystemVolumeCurve // DEVICE_CATEGORY_EXT_MEDIA 1472110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie }, 1482110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie { // AUDIO_STREAM_NOTIFICATION 1492110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sDefaultVolumeCurve, // DEVICE_CATEGORY_HEADSET 1502110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sSpeakerSonificationVolumeCurve, // DEVICE_CATEGORY_SPEAKER 1512110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sDefaultVolumeCurve, // DEVICE_CATEGORY_EARPIECE 1522110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sExtMediaSystemVolumeCurve // DEVICE_CATEGORY_EXT_MEDIA 1532110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie }, 1542110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie { // AUDIO_STREAM_BLUETOOTH_SCO 1552110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sDefaultVoiceVolumeCurve, // DEVICE_CATEGORY_HEADSET 1562110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sSpeakerVoiceVolumeCurve, // DEVICE_CATEGORY_SPEAKER 1572110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sDefaultVoiceVolumeCurve, // DEVICE_CATEGORY_EARPIECE 1582110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sDefaultMediaVolumeCurve // DEVICE_CATEGORY_EXT_MEDIA 1592110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie }, 1602110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie { // AUDIO_STREAM_ENFORCED_AUDIBLE 1612110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sHeadsetSystemVolumeCurve, // DEVICE_CATEGORY_HEADSET 1622110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sDefaultSystemVolumeCurve, // DEVICE_CATEGORY_SPEAKER 1632110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sDefaultSystemVolumeCurve, // DEVICE_CATEGORY_EARPIECE 1642110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sExtMediaSystemVolumeCurve // DEVICE_CATEGORY_EXT_MEDIA 1652110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie }, 1662110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie { // AUDIO_STREAM_DTMF 1672110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sHeadsetSystemVolumeCurve, // DEVICE_CATEGORY_HEADSET 1682110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sDefaultSystemVolumeCurve, // DEVICE_CATEGORY_SPEAKER 1692110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sDefaultSystemVolumeCurve, // DEVICE_CATEGORY_EARPIECE 1702110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sExtMediaSystemVolumeCurve // DEVICE_CATEGORY_EXT_MEDIA 1712110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie }, 1722110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie { // AUDIO_STREAM_TTS 1732110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie // "Transmitted Through Speaker": always silent except on DEVICE_CATEGORY_SPEAKER 174b9017af21e097ef12867e0d4b72c432579f29674Eric Laurent Gains::sSilentVolumeCurve, // DEVICE_CATEGORY_HEADSET 175b9017af21e097ef12867e0d4b72c432579f29674Eric Laurent Gains::sFullScaleVolumeCurve, // DEVICE_CATEGORY_SPEAKER 176b9017af21e097ef12867e0d4b72c432579f29674Eric Laurent Gains::sSilentVolumeCurve, // DEVICE_CATEGORY_EARPIECE 177b9017af21e097ef12867e0d4b72c432579f29674Eric Laurent Gains::sSilentVolumeCurve // DEVICE_CATEGORY_EXT_MEDIA 1782110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie }, 1792110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie { // AUDIO_STREAM_ACCESSIBILITY 1802110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sDefaultMediaVolumeCurve, // DEVICE_CATEGORY_HEADSET 1812110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sSpeakerMediaVolumeCurve, // DEVICE_CATEGORY_SPEAKER 1822110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sDefaultMediaVolumeCurve, // DEVICE_CATEGORY_EARPIECE 1832110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sDefaultMediaVolumeCurve // DEVICE_CATEGORY_EXT_MEDIA 1842110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie }, 1852110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie { // AUDIO_STREAM_REROUTING 1862110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sFullScaleVolumeCurve, // DEVICE_CATEGORY_HEADSET 1872110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sFullScaleVolumeCurve, // DEVICE_CATEGORY_SPEAKER 1882110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sFullScaleVolumeCurve, // DEVICE_CATEGORY_EARPIECE 1892110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sFullScaleVolumeCurve // DEVICE_CATEGORY_EXT_MEDIA 1902110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie }, 1912110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie { // AUDIO_STREAM_PATCH 1922110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sFullScaleVolumeCurve, // DEVICE_CATEGORY_HEADSET 1932110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sFullScaleVolumeCurve, // DEVICE_CATEGORY_SPEAKER 1942110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sFullScaleVolumeCurve, // DEVICE_CATEGORY_EARPIECE 1952110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sFullScaleVolumeCurve // DEVICE_CATEGORY_EXT_MEDIA 1962110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie }, 1972110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}; 1982110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 1992110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie//static 200d1ab2bd4f1ea166a7e9e81cfd7f3e5dd47135d4dFrançois Gaffiefloat Gains::volIndexToDb(const VolumeCurvePoint *curve, int indexMin, int indexMax, int indexInUi) 2012110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie{ 2022110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie // the volume index in the UI is relative to the min and max volume indices for this stream type 203d1ab2bd4f1ea166a7e9e81cfd7f3e5dd47135d4dFrançois Gaffie int nbSteps = 1 + curve[Volume::VOLMAX].mIndex - curve[Volume::VOLMIN].mIndex; 204d1ab2bd4f1ea166a7e9e81cfd7f3e5dd47135d4dFrançois Gaffie int volIdx = (nbSteps * (indexInUi - indexMin)) / (indexMax - indexMin); 2052110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 2062110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie // find what part of the curve this index volume belongs to, or if it's out of bounds 2072110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie int segment = 0; 2082110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie if (volIdx < curve[Volume::VOLMIN].mIndex) { // out of bounds 209ffbc80f5908eaf67a033c6e93a343c39dd6894ebEric Laurent return VOLUME_MIN_DB; 2102110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie } else if (volIdx < curve[Volume::VOLKNEE1].mIndex) { 2112110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie segment = 0; 2122110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie } else if (volIdx < curve[Volume::VOLKNEE2].mIndex) { 2132110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie segment = 1; 2142110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie } else if (volIdx <= curve[Volume::VOLMAX].mIndex) { 2152110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie segment = 2; 2162110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie } else { // out of bounds 217ffbc80f5908eaf67a033c6e93a343c39dd6894ebEric Laurent return 0.0f; 2182110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie } 2192110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 2202110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie // linear interpolation in the attenuation table in dB 2212110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie float decibels = curve[segment].mDBAttenuation + 2222110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie ((float)(volIdx - curve[segment].mIndex)) * 2232110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie ( (curve[segment+1].mDBAttenuation - 2242110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie curve[segment].mDBAttenuation) / 2252110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie ((float)(curve[segment+1].mIndex - 2262110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie curve[segment].mIndex)) ); 2272110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 228ffbc80f5908eaf67a033c6e93a343c39dd6894ebEric Laurent ALOGVV("VOLUME vol index=[%d %d %d], dB=[%.1f %.1f %.1f]", 2292110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie curve[segment].mIndex, volIdx, 2302110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie curve[segment+1].mIndex, 2312110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie curve[segment].mDBAttenuation, 2322110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie decibels, 233ffbc80f5908eaf67a033c6e93a343c39dd6894ebEric Laurent curve[segment+1].mDBAttenuation); 234ffbc80f5908eaf67a033c6e93a343c39dd6894ebEric Laurent 235ffbc80f5908eaf67a033c6e93a343c39dd6894ebEric Laurent return decibels; 236ffbc80f5908eaf67a033c6e93a343c39dd6894ebEric Laurent} 2372110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 2382110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}; // namespace android 239