Gains.cpp revision 2110e04cdfbf9ad85ce154ce5f778ee5ccfc95eb
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] 1172110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie [Volume::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 1742110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sSilentVolumeCurve, // DEVICE_CATEGORY_HEADSET 1752110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sLinearVolumeCurve, // DEVICE_CATEGORY_SPEAKER 1762110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Gains::sSilentVolumeCurve, // DEVICE_CATEGORY_EARPIECE 1772110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 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 2002110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffiefloat Gains::volIndexToAmpl(audio_devices_t device, const StreamDescriptor& streamDesc, 2012110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie int indexInUi) 2022110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie{ 2032110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie Volume::device_category deviceCategory = Volume::getDeviceCategory(device); 2042110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie const VolumeCurvePoint *curve = streamDesc.getVolumeCurvePoint(deviceCategory); 2052110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 2062110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie // the volume index in the UI is relative to the min and max volume indices for this stream type 2072110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie int nbSteps = 1 + curve[Volume::VOLMAX].mIndex - 2082110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie curve[Volume::VOLMIN].mIndex; 2092110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie int volIdx = (nbSteps * (indexInUi - streamDesc.getVolumeIndexMin())) / 2102110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie (streamDesc.getVolumeIndexMax() - streamDesc.getVolumeIndexMin()); 2112110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 2122110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie // find what part of the curve this index volume belongs to, or if it's out of bounds 2132110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie int segment = 0; 2142110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie if (volIdx < curve[Volume::VOLMIN].mIndex) { // out of bounds 2152110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie return 0.0f; 2162110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie } else if (volIdx < curve[Volume::VOLKNEE1].mIndex) { 2172110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie segment = 0; 2182110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie } else if (volIdx < curve[Volume::VOLKNEE2].mIndex) { 2192110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie segment = 1; 2202110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie } else if (volIdx <= curve[Volume::VOLMAX].mIndex) { 2212110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie segment = 2; 2222110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie } else { // out of bounds 2232110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie return 1.0f; 2242110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie } 2252110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 2262110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie // linear interpolation in the attenuation table in dB 2272110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie float decibels = curve[segment].mDBAttenuation + 2282110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie ((float)(volIdx - curve[segment].mIndex)) * 2292110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie ( (curve[segment+1].mDBAttenuation - 2302110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie curve[segment].mDBAttenuation) / 2312110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie ((float)(curve[segment+1].mIndex - 2322110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie curve[segment].mIndex)) ); 2332110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 2342110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie float amplification = exp( decibels * 0.115129f); // exp( dB * ln(10) / 20 ) 2352110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 2362110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie ALOGVV("VOLUME vol index=[%d %d %d], dB=[%.1f %.1f %.1f] ampl=%.5f", 2372110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie curve[segment].mIndex, volIdx, 2382110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie curve[segment+1].mIndex, 2392110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie curve[segment].mDBAttenuation, 2402110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie decibels, 2412110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie curve[segment+1].mDBAttenuation, 2422110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie amplification); 2432110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 2442110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie return amplification; 2452110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie} 2462110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie 2472110e04cdfbf9ad85ce154ce5f778ee5ccfc95ebFrançois Gaffie}; // namespace android 248