xref: /aosp_15_r20/frameworks/av/services/audioflinger/sounddose/SoundDoseManager.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker **
3*ec779b8eSAndroid Build Coastguard Worker ** Copyright 2022, The Android Open Source Project
4*ec779b8eSAndroid Build Coastguard Worker **
5*ec779b8eSAndroid Build Coastguard Worker ** Licensed under the Apache License, Version 2.0 (the "License");
6*ec779b8eSAndroid Build Coastguard Worker ** you may not use this file except in compliance with the License.
7*ec779b8eSAndroid Build Coastguard Worker ** You may obtain a copy of the License at
8*ec779b8eSAndroid Build Coastguard Worker **
9*ec779b8eSAndroid Build Coastguard Worker **     http://www.apache.org/licenses/LICENSE-2.0
10*ec779b8eSAndroid Build Coastguard Worker **
11*ec779b8eSAndroid Build Coastguard Worker ** Unless required by applicable law or agreed to in writing, software
12*ec779b8eSAndroid Build Coastguard Worker ** distributed under the License is distributed on an "AS IS" BASIS,
13*ec779b8eSAndroid Build Coastguard Worker ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*ec779b8eSAndroid Build Coastguard Worker ** See the License for the specific language governing permissions and
15*ec779b8eSAndroid Build Coastguard Worker ** limitations under the License.
16*ec779b8eSAndroid Build Coastguard Worker */
17*ec779b8eSAndroid Build Coastguard Worker 
18*ec779b8eSAndroid Build Coastguard Worker #pragma once
19*ec779b8eSAndroid Build Coastguard Worker 
20*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/hardware/audio/core/sounddose/ISoundDose.h>
21*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/media/audio/common/AudioDevice.h>
22*ec779b8eSAndroid Build Coastguard Worker #include <android/media/BnSoundDose.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <android/media/ISoundDoseCallback.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioDeviceTypeAddr.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <audio_utils/MelAggregator.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <audio_utils/MelProcessor.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <binder/Status.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <mutex>
29*ec779b8eSAndroid Build Coastguard Worker #include <unordered_map>
30*ec779b8eSAndroid Build Coastguard Worker 
31*ec779b8eSAndroid Build Coastguard Worker namespace android {
32*ec779b8eSAndroid Build Coastguard Worker 
33*ec779b8eSAndroid Build Coastguard Worker using aidl::android::hardware::audio::core::sounddose::ISoundDose;
34*ec779b8eSAndroid Build Coastguard Worker 
35*ec779b8eSAndroid Build Coastguard Worker class IMelReporterCallback : public virtual RefBase {
36*ec779b8eSAndroid Build Coastguard Worker public:
IMelReporterCallback()37*ec779b8eSAndroid Build Coastguard Worker     IMelReporterCallback() {};
~IMelReporterCallback()38*ec779b8eSAndroid Build Coastguard Worker     virtual ~IMelReporterCallback() {};
39*ec779b8eSAndroid Build Coastguard Worker 
40*ec779b8eSAndroid Build Coastguard Worker     virtual void stopMelComputationForDeviceId(audio_port_handle_t deviceId) = 0;
41*ec779b8eSAndroid Build Coastguard Worker     virtual void startMelComputationForDeviceId(audio_port_handle_t deviceId) = 0;
42*ec779b8eSAndroid Build Coastguard Worker 
43*ec779b8eSAndroid Build Coastguard Worker     virtual void applyAllAudioPatches() = 0;
44*ec779b8eSAndroid Build Coastguard Worker };
45*ec779b8eSAndroid Build Coastguard Worker 
46*ec779b8eSAndroid Build Coastguard Worker class SoundDoseManager : public audio_utils::MelProcessor::MelCallback {
47*ec779b8eSAndroid Build Coastguard Worker public:
48*ec779b8eSAndroid Build Coastguard Worker     /** CSD is computed with a rolling window of 7 days. */
49*ec779b8eSAndroid Build Coastguard Worker     static constexpr int64_t kCsdWindowSeconds = 604800;  // 60s * 60m * 24h * 7d
50*ec779b8eSAndroid Build Coastguard Worker     /** Default RS2 upper bound in dBA as defined in IEC 62368-1 3rd edition. */
51*ec779b8eSAndroid Build Coastguard Worker     static constexpr float kDefaultRs2UpperBound = 100.f;
52*ec779b8eSAndroid Build Coastguard Worker 
SoundDoseManager(const sp<IMelReporterCallback> & melReporterCallback)53*ec779b8eSAndroid Build Coastguard Worker     explicit SoundDoseManager(const sp<IMelReporterCallback>& melReporterCallback)
54*ec779b8eSAndroid Build Coastguard Worker         : mMelReporterCallback(melReporterCallback),
55*ec779b8eSAndroid Build Coastguard Worker           mMelAggregator(sp<audio_utils::MelAggregator>::make(kCsdWindowSeconds)),
56*ec779b8eSAndroid Build Coastguard Worker           mRs2UpperBound(kDefaultRs2UpperBound) {};
57*ec779b8eSAndroid Build Coastguard Worker 
58*ec779b8eSAndroid Build Coastguard Worker     // Used only for testing
SoundDoseManager(const sp<IMelReporterCallback> & melReporterCallback,const sp<audio_utils::MelAggregator> & melAggregator)59*ec779b8eSAndroid Build Coastguard Worker     SoundDoseManager(const sp<IMelReporterCallback>& melReporterCallback,
60*ec779b8eSAndroid Build Coastguard Worker                      const sp<audio_utils::MelAggregator>& melAggregator)
61*ec779b8eSAndroid Build Coastguard Worker             : mMelReporterCallback(melReporterCallback),
62*ec779b8eSAndroid Build Coastguard Worker               mMelAggregator(melAggregator),
63*ec779b8eSAndroid Build Coastguard Worker               mRs2UpperBound(kDefaultRs2UpperBound) {};
64*ec779b8eSAndroid Build Coastguard Worker 
65*ec779b8eSAndroid Build Coastguard Worker     /**
66*ec779b8eSAndroid Build Coastguard Worker      * \brief Creates or gets the MelProcessor assigned to the streamHandle
67*ec779b8eSAndroid Build Coastguard Worker      *
68*ec779b8eSAndroid Build Coastguard Worker      * \param deviceId          id for the devices where the stream is active.
69*ec779b8eSAndroid Build Coastguard Worker      * \param streamHandle      handle to the stream
70*ec779b8eSAndroid Build Coastguard Worker      * \param sampleRate        sample rate for the processor
71*ec779b8eSAndroid Build Coastguard Worker      * \param channelCount      number of channels to be processed.
72*ec779b8eSAndroid Build Coastguard Worker      * \param format            format of the input samples.
73*ec779b8eSAndroid Build Coastguard Worker      *
74*ec779b8eSAndroid Build Coastguard Worker      * \return MelProcessor assigned to the stream and device id.
75*ec779b8eSAndroid Build Coastguard Worker      */
76*ec779b8eSAndroid Build Coastguard Worker     sp<audio_utils::MelProcessor> getOrCreateProcessorForDevice(audio_port_handle_t deviceId,
77*ec779b8eSAndroid Build Coastguard Worker                                                                 audio_io_handle_t streamHandle,
78*ec779b8eSAndroid Build Coastguard Worker                                                                 uint32_t sampleRate,
79*ec779b8eSAndroid Build Coastguard Worker                                                                 size_t channelCount,
80*ec779b8eSAndroid Build Coastguard Worker                                                                 audio_format_t format);
81*ec779b8eSAndroid Build Coastguard Worker 
82*ec779b8eSAndroid Build Coastguard Worker     /**
83*ec779b8eSAndroid Build Coastguard Worker      * \brief Removes stream processor when MEL computation is not needed anymore
84*ec779b8eSAndroid Build Coastguard Worker      *
85*ec779b8eSAndroid Build Coastguard Worker      * \param streamHandle      handle to the stream
86*ec779b8eSAndroid Build Coastguard Worker      */
87*ec779b8eSAndroid Build Coastguard Worker     void removeStreamProcessor(audio_io_handle_t streamHandle);
88*ec779b8eSAndroid Build Coastguard Worker 
89*ec779b8eSAndroid Build Coastguard Worker     /**
90*ec779b8eSAndroid Build Coastguard Worker      * Sets the output RS2 upper bound for momentary exposure warnings. Must not be
91*ec779b8eSAndroid Build Coastguard Worker      * higher than 100dBA and not lower than 80dBA.
92*ec779b8eSAndroid Build Coastguard Worker      *
93*ec779b8eSAndroid Build Coastguard Worker      * \param rs2Value value to use for momentary exposure
94*ec779b8eSAndroid Build Coastguard Worker      */
95*ec779b8eSAndroid Build Coastguard Worker     void setOutputRs2UpperBound(float rs2Value);
96*ec779b8eSAndroid Build Coastguard Worker 
97*ec779b8eSAndroid Build Coastguard Worker     /**
98*ec779b8eSAndroid Build Coastguard Worker      * \brief Registers the interface for passing callbacks to the AudioService and gets
99*ec779b8eSAndroid Build Coastguard Worker      * the ISoundDose interface.
100*ec779b8eSAndroid Build Coastguard Worker      *
101*ec779b8eSAndroid Build Coastguard Worker      * \returns the sound dose binder to send commands to the SoundDoseManager
102*ec779b8eSAndroid Build Coastguard Worker      **/
103*ec779b8eSAndroid Build Coastguard Worker     sp<media::ISoundDose> getSoundDoseInterface(const sp<media::ISoundDoseCallback>& callback);
104*ec779b8eSAndroid Build Coastguard Worker 
105*ec779b8eSAndroid Build Coastguard Worker     /**
106*ec779b8eSAndroid Build Coastguard Worker      * Sets the HAL sound dose interface for a specific module to use for the MEL computation.
107*ec779b8eSAndroid Build Coastguard Worker      *
108*ec779b8eSAndroid Build Coastguard Worker      * @return true if setting the HAL sound dose value was successful, false otherwise.
109*ec779b8eSAndroid Build Coastguard Worker      */
110*ec779b8eSAndroid Build Coastguard Worker     bool setHalSoundDoseInterface(const std::string &module,
111*ec779b8eSAndroid Build Coastguard Worker                                   const std::shared_ptr<ISoundDose> &halSoundDose);
112*ec779b8eSAndroid Build Coastguard Worker 
113*ec779b8eSAndroid Build Coastguard Worker     /** Reset all the stored HAL sound dose interface. */
114*ec779b8eSAndroid Build Coastguard Worker     void resetHalSoundDoseInterfaces();
115*ec779b8eSAndroid Build Coastguard Worker 
116*ec779b8eSAndroid Build Coastguard Worker     /** Returns the cached audio port id from the active devices. */
117*ec779b8eSAndroid Build Coastguard Worker     audio_port_handle_t getIdForAudioDevice(
118*ec779b8eSAndroid Build Coastguard Worker             const aidl::android::media::audio::common::AudioDevice& audioDevice) const;
119*ec779b8eSAndroid Build Coastguard Worker 
120*ec779b8eSAndroid Build Coastguard Worker     /** Caches mapping between address, device port id and device type. */
121*ec779b8eSAndroid Build Coastguard Worker     void mapAddressToDeviceId(const AudioDeviceTypeAddr& adt, const audio_port_handle_t deviceId);
122*ec779b8eSAndroid Build Coastguard Worker 
123*ec779b8eSAndroid Build Coastguard Worker     /** Clear all map entries with passed audio_port_handle_t. */
124*ec779b8eSAndroid Build Coastguard Worker     void clearMapDeviceIdEntries(audio_port_handle_t deviceId);
125*ec779b8eSAndroid Build Coastguard Worker 
126*ec779b8eSAndroid Build Coastguard Worker     /** Returns true if CSD is enabled. */
127*ec779b8eSAndroid Build Coastguard Worker     bool isCsdEnabled();
128*ec779b8eSAndroid Build Coastguard Worker 
129*ec779b8eSAndroid Build Coastguard Worker     void initCachedAudioDeviceCategories(
130*ec779b8eSAndroid Build Coastguard Worker             const std::vector<media::ISoundDose::AudioDeviceCategory>& deviceCategories);
131*ec779b8eSAndroid Build Coastguard Worker 
132*ec779b8eSAndroid Build Coastguard Worker     void setAudioDeviceCategory(
133*ec779b8eSAndroid Build Coastguard Worker             const media::ISoundDose::AudioDeviceCategory& audioDevice);
134*ec779b8eSAndroid Build Coastguard Worker 
135*ec779b8eSAndroid Build Coastguard Worker     /**
136*ec779b8eSAndroid Build Coastguard Worker      * Returns true if the type can compute CSD. For bluetooth devices we rely on whether we
137*ec779b8eSAndroid Build Coastguard Worker      * categorized the address as headphones/headsets, only in this case we return true.
138*ec779b8eSAndroid Build Coastguard Worker      */
139*ec779b8eSAndroid Build Coastguard Worker     bool shouldComputeCsdForDeviceWithAddress(const audio_devices_t type,
140*ec779b8eSAndroid Build Coastguard Worker                                               const std::string& deviceAddress);
141*ec779b8eSAndroid Build Coastguard Worker     /** Returns true for all device types which could support CSD computation. */
142*ec779b8eSAndroid Build Coastguard Worker     bool shouldComputeCsdForDeviceType(audio_devices_t device);
143*ec779b8eSAndroid Build Coastguard Worker 
144*ec779b8eSAndroid Build Coastguard Worker     std::string dump() const;
145*ec779b8eSAndroid Build Coastguard Worker 
146*ec779b8eSAndroid Build Coastguard Worker     // used for testing only
147*ec779b8eSAndroid Build Coastguard Worker     size_t getCachedMelRecordsSize() const;
148*ec779b8eSAndroid Build Coastguard Worker     bool isFrameworkMelForced() const;
149*ec779b8eSAndroid Build Coastguard Worker     bool isComputeCsdForcedOnAllDevices() const;
150*ec779b8eSAndroid Build Coastguard Worker 
151*ec779b8eSAndroid Build Coastguard Worker     /** Method for converting from audio_utils::CsdRecord to media::SoundDoseRecord. */
152*ec779b8eSAndroid Build Coastguard Worker     static media::SoundDoseRecord csdRecordToSoundDoseRecord(const audio_utils::CsdRecord& legacy);
153*ec779b8eSAndroid Build Coastguard Worker 
154*ec779b8eSAndroid Build Coastguard Worker     // ------ Override audio_utils::MelProcessor::MelCallback ------
155*ec779b8eSAndroid Build Coastguard Worker     void onNewMelValues(const std::vector<float>& mels, size_t offset, size_t length,
156*ec779b8eSAndroid Build Coastguard Worker                         audio_port_handle_t deviceId, bool attenuated) const override;
157*ec779b8eSAndroid Build Coastguard Worker 
158*ec779b8eSAndroid Build Coastguard Worker     void onMomentaryExposure(float currentMel, audio_port_handle_t deviceId) const override;
159*ec779b8eSAndroid Build Coastguard Worker 
160*ec779b8eSAndroid Build Coastguard Worker     void resetReferencesForTest();
161*ec779b8eSAndroid Build Coastguard Worker 
162*ec779b8eSAndroid Build Coastguard Worker private:
163*ec779b8eSAndroid Build Coastguard Worker     class SoundDose : public media::BnSoundDose,
164*ec779b8eSAndroid Build Coastguard Worker                       public IBinder::DeathRecipient {
165*ec779b8eSAndroid Build Coastguard Worker     public:
SoundDose(SoundDoseManager * manager,const sp<media::ISoundDoseCallback> & callback)166*ec779b8eSAndroid Build Coastguard Worker         SoundDose(SoundDoseManager* manager, const sp<media::ISoundDoseCallback>& callback)
167*ec779b8eSAndroid Build Coastguard Worker             : mSoundDoseManager(manager),
168*ec779b8eSAndroid Build Coastguard Worker               mSoundDoseCallback(callback) {}
169*ec779b8eSAndroid Build Coastguard Worker 
170*ec779b8eSAndroid Build Coastguard Worker         /** IBinder::DeathRecipient. Listen to the death of ISoundDoseCallback. */
171*ec779b8eSAndroid Build Coastguard Worker         void binderDied(const wp<IBinder>& who) override;
172*ec779b8eSAndroid Build Coastguard Worker 
173*ec779b8eSAndroid Build Coastguard Worker         /** BnSoundDose override */
174*ec779b8eSAndroid Build Coastguard Worker         binder::Status setOutputRs2UpperBound(float value) override;
175*ec779b8eSAndroid Build Coastguard Worker         binder::Status resetCsd(float currentCsd,
176*ec779b8eSAndroid Build Coastguard Worker                                 const std::vector<media::SoundDoseRecord>& records) override;
177*ec779b8eSAndroid Build Coastguard Worker         binder::Status updateAttenuation(float attenuationDB, int device) override;
178*ec779b8eSAndroid Build Coastguard Worker         binder::Status getOutputRs2UpperBound(float* value) override;
179*ec779b8eSAndroid Build Coastguard Worker         binder::Status setCsdEnabled(bool enabled) override;
180*ec779b8eSAndroid Build Coastguard Worker 
181*ec779b8eSAndroid Build Coastguard Worker         binder::Status initCachedAudioDeviceCategories(
182*ec779b8eSAndroid Build Coastguard Worker                 const std::vector<media::ISoundDose::AudioDeviceCategory> &btDeviceCategories)
183*ec779b8eSAndroid Build Coastguard Worker                 override;
184*ec779b8eSAndroid Build Coastguard Worker 
185*ec779b8eSAndroid Build Coastguard Worker         binder::Status setAudioDeviceCategory(
186*ec779b8eSAndroid Build Coastguard Worker                 const media::ISoundDose::AudioDeviceCategory& btAudioDevice) override;
187*ec779b8eSAndroid Build Coastguard Worker 
188*ec779b8eSAndroid Build Coastguard Worker         binder::Status getCsd(float* value) override;
189*ec779b8eSAndroid Build Coastguard Worker         binder::Status forceUseFrameworkMel(bool useFrameworkMel) override;
190*ec779b8eSAndroid Build Coastguard Worker         binder::Status forceComputeCsdOnAllDevices(bool computeCsdOnAllDevices) override;
191*ec779b8eSAndroid Build Coastguard Worker         binder::Status isSoundDoseHalSupported(bool* value) override;
192*ec779b8eSAndroid Build Coastguard Worker 
193*ec779b8eSAndroid Build Coastguard Worker         wp<SoundDoseManager> mSoundDoseManager;
194*ec779b8eSAndroid Build Coastguard Worker         const sp<media::ISoundDoseCallback> mSoundDoseCallback;
195*ec779b8eSAndroid Build Coastguard Worker     };
196*ec779b8eSAndroid Build Coastguard Worker 
197*ec779b8eSAndroid Build Coastguard Worker     class HalSoundDoseCallback : public ISoundDose::BnHalSoundDoseCallback {
198*ec779b8eSAndroid Build Coastguard Worker     public:
HalSoundDoseCallback(SoundDoseManager * manager)199*ec779b8eSAndroid Build Coastguard Worker         explicit HalSoundDoseCallback(SoundDoseManager* manager)
200*ec779b8eSAndroid Build Coastguard Worker             : mSoundDoseManager(manager) {}
201*ec779b8eSAndroid Build Coastguard Worker 
202*ec779b8eSAndroid Build Coastguard Worker         ndk::ScopedAStatus onMomentaryExposureWarning(
203*ec779b8eSAndroid Build Coastguard Worker                 float in_currentDbA,
204*ec779b8eSAndroid Build Coastguard Worker                 const aidl::android::media::audio::common::AudioDevice& in_audioDevice) override;
205*ec779b8eSAndroid Build Coastguard Worker         ndk::ScopedAStatus onNewMelValues(
206*ec779b8eSAndroid Build Coastguard Worker                 const ISoundDose::IHalSoundDoseCallback::MelRecord& in_melRecord,
207*ec779b8eSAndroid Build Coastguard Worker                 const aidl::android::media::audio::common::AudioDevice& in_audioDevice) override;
208*ec779b8eSAndroid Build Coastguard Worker 
209*ec779b8eSAndroid Build Coastguard Worker         wp<SoundDoseManager> mSoundDoseManager;
210*ec779b8eSAndroid Build Coastguard Worker         std::mutex mCbLock;
211*ec779b8eSAndroid Build Coastguard Worker     };
212*ec779b8eSAndroid Build Coastguard Worker 
213*ec779b8eSAndroid Build Coastguard Worker     void resetSoundDose();
214*ec779b8eSAndroid Build Coastguard Worker 
215*ec779b8eSAndroid Build Coastguard Worker     void resetCsd(float currentCsd, const std::vector<media::SoundDoseRecord>& records);
216*ec779b8eSAndroid Build Coastguard Worker 
217*ec779b8eSAndroid Build Coastguard Worker     sp<media::ISoundDoseCallback> getSoundDoseCallback() const;
218*ec779b8eSAndroid Build Coastguard Worker 
219*ec779b8eSAndroid Build Coastguard Worker     float getAttenuationForDeviceId(audio_port_handle_t id) const;
220*ec779b8eSAndroid Build Coastguard Worker 
221*ec779b8eSAndroid Build Coastguard Worker     void updateAttenuation(float attenuationDB, audio_devices_t deviceType);
222*ec779b8eSAndroid Build Coastguard Worker     void setCsdEnabled(bool enabled);
223*ec779b8eSAndroid Build Coastguard Worker     void setUseFrameworkMel(bool useFrameworkMel);
224*ec779b8eSAndroid Build Coastguard Worker     void setComputeCsdOnAllDevices(bool computeCsdOnAllDevices);
225*ec779b8eSAndroid Build Coastguard Worker     bool isSoundDoseHalSupported() const;
226*ec779b8eSAndroid Build Coastguard Worker     /**
227*ec779b8eSAndroid Build Coastguard Worker      * Returns true if there is one active HAL sound dose interface or null if internal MEL
228*ec779b8eSAndroid Build Coastguard Worker      * computation is used.
229*ec779b8eSAndroid Build Coastguard Worker      **/
230*ec779b8eSAndroid Build Coastguard Worker     bool useHalSoundDose() const;
231*ec779b8eSAndroid Build Coastguard Worker 
232*ec779b8eSAndroid Build Coastguard Worker     mutable std::mutex mLock;
233*ec779b8eSAndroid Build Coastguard Worker 
234*ec779b8eSAndroid Build Coastguard Worker     sp<IMelReporterCallback> mMelReporterCallback;
235*ec779b8eSAndroid Build Coastguard Worker 
236*ec779b8eSAndroid Build Coastguard Worker     // no need for lock since MelAggregator is thread-safe
237*ec779b8eSAndroid Build Coastguard Worker     const sp<audio_utils::MelAggregator> mMelAggregator;
238*ec779b8eSAndroid Build Coastguard Worker 
239*ec779b8eSAndroid Build Coastguard Worker     std::unordered_map<audio_io_handle_t, wp<audio_utils::MelProcessor>> mActiveProcessors
240*ec779b8eSAndroid Build Coastguard Worker             GUARDED_BY(mLock);
241*ec779b8eSAndroid Build Coastguard Worker 
242*ec779b8eSAndroid Build Coastguard Worker     // map active device address and type to device id, used also for managing the pause/resume
243*ec779b8eSAndroid Build Coastguard Worker     // logic for deviceId's that should not report MEL values (e.g.: do not have an active MUSIC
244*ec779b8eSAndroid Build Coastguard Worker     // or GAME stream).
245*ec779b8eSAndroid Build Coastguard Worker     std::map<AudioDeviceTypeAddr, audio_port_handle_t> mActiveDevices GUARDED_BY(mLock);
246*ec779b8eSAndroid Build Coastguard Worker     std::unordered_map<audio_port_handle_t, audio_devices_t> mActiveDeviceTypes GUARDED_BY(mLock);
247*ec779b8eSAndroid Build Coastguard Worker 
248*ec779b8eSAndroid Build Coastguard Worker     struct bt_device_type_hash {
operatorbt_device_type_hash249*ec779b8eSAndroid Build Coastguard Worker         std::size_t operator() (const std::pair<std::string, audio_devices_t> &deviceType) const {
250*ec779b8eSAndroid Build Coastguard Worker             return std::hash<std::string>()(deviceType.first) ^
251*ec779b8eSAndroid Build Coastguard Worker                    std::hash<audio_devices_t>()(deviceType.second);
252*ec779b8eSAndroid Build Coastguard Worker         }
253*ec779b8eSAndroid Build Coastguard Worker     };
254*ec779b8eSAndroid Build Coastguard Worker     // storing the BT cached information as received from the java side
255*ec779b8eSAndroid Build Coastguard Worker     // see SoundDoseManager::setCachedAudioDeviceCategories
256*ec779b8eSAndroid Build Coastguard Worker     std::unordered_map<std::pair<std::string, audio_devices_t>, bool, bt_device_type_hash>
257*ec779b8eSAndroid Build Coastguard Worker             mBluetoothDevicesWithCsd GUARDED_BY(mLock);
258*ec779b8eSAndroid Build Coastguard Worker 
259*ec779b8eSAndroid Build Coastguard Worker     float mRs2UpperBound GUARDED_BY(mLock);
260*ec779b8eSAndroid Build Coastguard Worker     std::unordered_map<audio_devices_t, float> mMelAttenuationDB GUARDED_BY(mLock);
261*ec779b8eSAndroid Build Coastguard Worker 
262*ec779b8eSAndroid Build Coastguard Worker     sp<SoundDose> mSoundDose GUARDED_BY(mLock);
263*ec779b8eSAndroid Build Coastguard Worker 
264*ec779b8eSAndroid Build Coastguard Worker     std::unordered_map<std::string, std::shared_ptr<ISoundDose>> mHalSoundDose GUARDED_BY(mLock);
265*ec779b8eSAndroid Build Coastguard Worker     std::shared_ptr<HalSoundDoseCallback> mHalSoundDoseCallback GUARDED_BY(mLock);
266*ec779b8eSAndroid Build Coastguard Worker 
267*ec779b8eSAndroid Build Coastguard Worker     bool mUseFrameworkMel GUARDED_BY(mLock) = false;
268*ec779b8eSAndroid Build Coastguard Worker     bool mComputeCsdOnAllDevices GUARDED_BY(mLock) = false;
269*ec779b8eSAndroid Build Coastguard Worker 
270*ec779b8eSAndroid Build Coastguard Worker     bool mEnabledCsd GUARDED_BY(mLock) = true;
271*ec779b8eSAndroid Build Coastguard Worker };
272*ec779b8eSAndroid Build Coastguard Worker 
273*ec779b8eSAndroid Build Coastguard Worker }  // namespace android
274