blob: f73b3d6ba50164b77076bb5c43117fc0ae9bba89 [file] [log] [blame]
/*
**
** Copyright 2022, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
#ifndef INCLUDING_FROM_AUDIOFLINGER_H
#error This header file should only be included from AudioFlinger.h
#endif
#include <mutex>
#include <sounddose/SoundDoseManager.h>
#include <unordered_map>
constexpr static int kMaxTimestampDeltaInSec = 120;
/**
* Class for listening to new patches and starting the MEL computation. MelReporter is
* concealed within AudioFlinger, their lifetimes are the same.
*/
class MelReporter : public PatchCommandThread::PatchCommandListener {
public:
explicit MelReporter(AudioFlinger& audioFlinger)
: mAudioFlinger(audioFlinger) {}
void onFirstRef() override {
mAudioFlinger.mPatchCommandThread->addListener(this);
}
/** Returns true if we should compute MEL for the given device. */
static bool shouldComputeMelForDeviceType(audio_devices_t device);
// For now only support internal MelReporting
[[nodiscard]] bool isHalReportingEnabled() const { return false; }
sp<media::ISoundDose> getSoundDoseInterface(const sp<media::ISoundDoseCallback>& callback);
std::string dump();
// PatchCommandListener methods
void onCreateAudioPatch(audio_patch_handle_t handle,
const PatchPanel::Patch& patch) override;
void onReleaseAudioPatch(audio_patch_handle_t handle) override;
private:
AudioFlinger& mAudioFlinger; // does not own the object
SoundDoseManager mSoundDoseManager;
struct ActiveMelPatch {
audio_io_handle_t streamHandle{AUDIO_IO_HANDLE_NONE};
std::vector<audio_port_handle_t> deviceHandles;
};
/**
* Lock for protecting the active mel patches. Do not mix with the AudioFlinger lock.
* Locking order AudioFlinger::mLock -> PatchCommandThread::mLock -> MelReporter::mLock.
*/
std::mutex mLock;
std::unordered_map<audio_patch_handle_t, ActiveMelPatch>
mActiveMelPatches GUARDED_BY(AudioFlinger::MelReporter::mLock);
};