AudioGain.h revision 56ec4ffcbae8aeac6c5245fc7b825d02e2e6cefd
156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi/* 256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * Copyright (C) 2015 The Android Open Source Project 356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * 456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * you may not use this file except in compliance with the License. 656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * You may obtain a copy of the License at 756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * 856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * 1056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 1156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 1256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * See the License for the specific language governing permissions and 1456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * limitations under the License. 1556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi */ 1656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 1756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivinamespace android { 1856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 1956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Triviclass VolumeCurvePoint 2056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi{ 2156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivipublic: 2256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi int mIndex; 2356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi float mDBAttenuation; 2456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi}; 2556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 2656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Triviclass StreamDescriptor; 2756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 2856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Triviclass ApmGains 2956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi{ 3056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivipublic : 3156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi // 4 points to define the volume attenuation curve, each characterized by the volume 3256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi // index (from 0 to 100) at which they apply, and the attenuation in dB at that index. 3356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi // we use 100 steps to avoid rounding errors when computing the volume in volIndexToAmpl() 3456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi enum { VOLMIN = 0, VOLKNEE1 = 1, VOLKNEE2 = 2, VOLMAX = 3, VOLCNT = 4}; 3556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 3656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi // device categories used for volume curve management. 3756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi enum device_category { 3856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi DEVICE_CATEGORY_HEADSET, 3956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi DEVICE_CATEGORY_SPEAKER, 4056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi DEVICE_CATEGORY_EARPIECE, 4156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi DEVICE_CATEGORY_EXT_MEDIA, 4256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi DEVICE_CATEGORY_CNT 4356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi }; 4456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 4556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi // returns the category the device belongs to with regard to volume curve management 4656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi static ApmGains::device_category getDeviceCategory(audio_devices_t device); 4756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 4856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi // extract one device relevant for volume control from multiple device selection 4956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi static audio_devices_t getDeviceForVolume(audio_devices_t device); 5056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 5156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi static float volIndexToAmpl(audio_devices_t device, const StreamDescriptor& streamDesc, 5256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi int indexInUi); 5356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 5456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi // default volume curve 5556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi static const VolumeCurvePoint sDefaultVolumeCurve[ApmGains::VOLCNT]; 5656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi // default volume curve for media strategy 5756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi static const VolumeCurvePoint sDefaultMediaVolumeCurve[ApmGains::VOLCNT]; 5856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi // volume curve for non-media audio on ext media outputs (HDMI, Line, etc) 5956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi static const VolumeCurvePoint sExtMediaSystemVolumeCurve[ApmGains::VOLCNT]; 6056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi // volume curve for media strategy on speakers 6156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi static const VolumeCurvePoint sSpeakerMediaVolumeCurve[ApmGains::VOLCNT]; 6256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi static const VolumeCurvePoint sSpeakerMediaVolumeCurveDrc[ApmGains::VOLCNT]; 6356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi // volume curve for sonification strategy on speakers 6456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi static const VolumeCurvePoint sSpeakerSonificationVolumeCurve[ApmGains::VOLCNT]; 6556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi static const VolumeCurvePoint sSpeakerSonificationVolumeCurveDrc[ApmGains::VOLCNT]; 6656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi static const VolumeCurvePoint sDefaultSystemVolumeCurve[ApmGains::VOLCNT]; 6756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi static const VolumeCurvePoint sDefaultSystemVolumeCurveDrc[ApmGains::VOLCNT]; 6856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi static const VolumeCurvePoint sHeadsetSystemVolumeCurve[ApmGains::VOLCNT]; 6956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi static const VolumeCurvePoint sDefaultVoiceVolumeCurve[ApmGains::VOLCNT]; 7056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi static const VolumeCurvePoint sSpeakerVoiceVolumeCurve[ApmGains::VOLCNT]; 7156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi static const VolumeCurvePoint sLinearVolumeCurve[ApmGains::VOLCNT]; 7256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi static const VolumeCurvePoint sSilentVolumeCurve[ApmGains::VOLCNT]; 7356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi static const VolumeCurvePoint sFullScaleVolumeCurve[ApmGains::VOLCNT]; 7456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi // default volume curves per stream and device category. See initializeVolumeCurves() 7556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi static const VolumeCurvePoint *sVolumeProfiles[AUDIO_STREAM_CNT][ApmGains::DEVICE_CATEGORY_CNT]; 7656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi}; 7756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 7856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 7956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Triviclass AudioGain: public RefBase 8056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi{ 8156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivipublic: 8256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi AudioGain(int index, bool useInChannelMask); 8356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi virtual ~AudioGain() {} 8456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 8556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi void dump(int fd, int spaces, int index) const; 8656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 8756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi void getDefaultConfig(struct audio_gain_config *config); 8856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi status_t checkConfig(const struct audio_gain_config *config); 8956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi int mIndex; 9056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi struct audio_gain mGain; 9156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi bool mUseInChannelMask; 9256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi}; 9356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 9456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 9556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi// stream descriptor used for volume control 9656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Triviclass StreamDescriptor 9756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi{ 9856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivipublic: 9956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi StreamDescriptor(); 10056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 10156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi int getVolumeIndex(audio_devices_t device); 10256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi void dump(int fd); 10356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 10456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi int mIndexMin; // min volume index 10556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi int mIndexMax; // max volume index 10656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi KeyedVector<audio_devices_t, int> mIndexCur; // current volume index per device 10756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi bool mCanBeMuted; // true is the stream can be muted 10856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 10956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi const VolumeCurvePoint *mVolumeCurve[ApmGains::DEVICE_CATEGORY_CNT]; 11056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi}; 11156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 11256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi}; // namespace android 113