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