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