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