Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ad2faf74 authored by Andy Hung's avatar Andy Hung
Browse files

AudioFlinger: Extract MelReporter class

Test: atest audiorecord_tests audiotrack_tests audiorouting_tests trackplayerbase_tests audiosystem_tests
Test: atest AAudioTests AudioTrackOffloadTest
Test: atest AudioTrackTest AudioRecordTest
Test: YouTube Camera
Bug: 288339104
Change-Id: I4bd74a19d3ca95ea1dc45a80bca6eb242a11fe3c
parent 55a74fd3
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -132,6 +132,7 @@
// Classes that depend on IAf* interfaces but are not cross-dependent.
// Classes that depend on IAf* interfaces but are not cross-dependent.
#include "PatchCommandThread.h"
#include "PatchCommandThread.h"
#include "DeviceEffectManager.h"
#include "DeviceEffectManager.h"
#include "MelReporter.h"


namespace android {
namespace android {


@@ -166,6 +167,7 @@ class AudioFlinger : public AudioFlingerServerAdapter::Delegate
    friend class Client; // removeClient_l();
    friend class Client; // removeClient_l();
    friend class DeviceEffectManager;
    friend class DeviceEffectManager;
    friend class DeviceEffectManagerCallback;
    friend class DeviceEffectManagerCallback;
    friend class MelReporter;
    friend class PatchPanel;
    friend class PatchPanel;
    // TODO(b/291012167) replace the Thread friends with an interface.
    // TODO(b/291012167) replace the Thread friends with an interface.
    friend class DirectOutputThread;
    friend class DirectOutputThread;
@@ -588,8 +590,6 @@ public:
    using TeePatches = std::vector<TeePatch>;
    using TeePatches = std::vector<TeePatch>;
private:
private:


#include "MelReporter.h"

    // Find io handle by session id.
    // Find io handle by session id.
    // Preference is given to an io handle with a matching effect chain to session id.
    // Preference is given to an io handle with a matching effect chain to session id.
    // If none found, AUDIO_IO_HANDLE_NONE is returned.
    // If none found, AUDIO_IO_HANDLE_NONE is returned.
+16 −16
Original line number Original line Diff line number Diff line
@@ -16,7 +16,7 @@
*/
*/


// #define LOG_NDEBUG 0
// #define LOG_NDEBUG 0
#define LOG_TAG "AudioFlinger::MelReporter"
#define LOG_TAG "MelReporter"


#include "AudioFlinger.h"
#include "AudioFlinger.h"


@@ -28,7 +28,7 @@ using aidl::android::hardware::audio::core::sounddose::ISoundDose;


namespace android {
namespace android {


bool AudioFlinger::MelReporter::activateHalSoundDoseComputation(const std::string& module,
bool MelReporter::activateHalSoundDoseComputation(const std::string& module,
        const sp<DeviceHalInterface>& device) {
        const sp<DeviceHalInterface>& device) {
    if (mSoundDoseManager->forceUseFrameworkMel()) {
    if (mSoundDoseManager->forceUseFrameworkMel()) {
        ALOGD("%s: Forcing use of internal MEL computation.", __func__);
        ALOGD("%s: Forcing use of internal MEL computation.", __func__);
@@ -63,7 +63,7 @@ bool AudioFlinger::MelReporter::activateHalSoundDoseComputation(const std::strin
    return true;
    return true;
}
}


void AudioFlinger::MelReporter::activateInternalSoundDoseComputation() {
void MelReporter::activateInternalSoundDoseComputation() {
    {
    {
        std::lock_guard _l(mLock);
        std::lock_guard _l(mLock);
        if (!mUseHalSoundDoseInterface) {
        if (!mUseHalSoundDoseInterface) {
@@ -76,11 +76,11 @@ void AudioFlinger::MelReporter::activateInternalSoundDoseComputation() {
    mSoundDoseManager->setHalSoundDoseInterface(nullptr);
    mSoundDoseManager->setHalSoundDoseInterface(nullptr);
}
}


void AudioFlinger::MelReporter::onFirstRef() {
void MelReporter::onFirstRef() {
    mAudioFlinger.mPatchCommandThread->addListener(this);
    mAudioFlinger.mPatchCommandThread->addListener(this);
}
}


bool AudioFlinger::MelReporter::shouldComputeMelForDeviceType(audio_devices_t device) {
bool MelReporter::shouldComputeMelForDeviceType(audio_devices_t device) {
    if (!mSoundDoseManager->isCsdEnabled()) {
    if (!mSoundDoseManager->isCsdEnabled()) {
        ALOGV("%s csd is disabled", __func__);
        ALOGV("%s csd is disabled", __func__);
        return false;
        return false;
@@ -104,7 +104,7 @@ bool AudioFlinger::MelReporter::shouldComputeMelForDeviceType(audio_devices_t de
    }
    }
}
}


void AudioFlinger::MelReporter::updateMetadataForCsd(audio_io_handle_t streamHandle,
void MelReporter::updateMetadataForCsd(audio_io_handle_t streamHandle,
        const std::vector<playback_track_metadata_v7_t>& metadataVec) {
        const std::vector<playback_track_metadata_v7_t>& metadataVec) {
    if (!mSoundDoseManager->isCsdEnabled()) {
    if (!mSoundDoseManager->isCsdEnabled()) {
        ALOGV("%s csd is disabled", __func__);
        ALOGV("%s csd is disabled", __func__);
@@ -140,7 +140,7 @@ void AudioFlinger::MelReporter::updateMetadataForCsd(audio_io_handle_t streamHan
    }
    }
}
}


void AudioFlinger::MelReporter::onCreateAudioPatch(audio_patch_handle_t handle,
void MelReporter::onCreateAudioPatch(audio_patch_handle_t handle,
        const IAfPatchPanel::Patch& patch) {
        const IAfPatchPanel::Patch& patch) {
    if (!mSoundDoseManager->isCsdEnabled()) {
    if (!mSoundDoseManager->isCsdEnabled()) {
        ALOGV("%s csd is disabled", __func__);
        ALOGV("%s csd is disabled", __func__);
@@ -180,7 +180,7 @@ void AudioFlinger::MelReporter::onCreateAudioPatch(audio_patch_handle_t handle,
    }
    }
}
}


void AudioFlinger::MelReporter::startMelComputationForActivePatch_l(const ActiveMelPatch& patch)
void MelReporter::startMelComputationForActivePatch_l(const ActiveMelPatch& patch)
NO_THREAD_SAFETY_ANALYSIS  // access of AudioFlinger::checkOutputThread_l
NO_THREAD_SAFETY_ANALYSIS  // access of AudioFlinger::checkOutputThread_l
{
{
    auto outputThread = mAudioFlinger.checkOutputThread_l(patch.streamHandle);
    auto outputThread = mAudioFlinger.checkOutputThread_l(patch.streamHandle);
@@ -205,7 +205,7 @@ NO_THREAD_SAFETY_ANALYSIS // access of AudioFlinger::checkOutputThread_l
    }
    }
}
}


void AudioFlinger::MelReporter::onReleaseAudioPatch(audio_patch_handle_t handle) {
void MelReporter::onReleaseAudioPatch(audio_patch_handle_t handle) {
    if (!mSoundDoseManager->isCsdEnabled()) {
    if (!mSoundDoseManager->isCsdEnabled()) {
        ALOGV("%s csd is disabled", __func__);
        ALOGV("%s csd is disabled", __func__);
        return;
        return;
@@ -231,26 +231,26 @@ void AudioFlinger::MelReporter::onReleaseAudioPatch(audio_patch_handle_t handle)
    stopMelComputationForPatch_l(melPatch);
    stopMelComputationForPatch_l(melPatch);
}
}


void AudioFlinger::MelReporter::onUpdateAudioPatch(audio_patch_handle_t oldHandle,
void MelReporter::onUpdateAudioPatch(audio_patch_handle_t oldHandle,
        audio_patch_handle_t newHandle, const IAfPatchPanel::Patch& patch) {
        audio_patch_handle_t newHandle, const IAfPatchPanel::Patch& patch) {
    onReleaseAudioPatch(oldHandle);
    onReleaseAudioPatch(oldHandle);
    onCreateAudioPatch(newHandle, patch);
    onCreateAudioPatch(newHandle, patch);
}
}


sp<media::ISoundDose> AudioFlinger::MelReporter::getSoundDoseInterface(
sp<media::ISoundDose> MelReporter::getSoundDoseInterface(
        const sp<media::ISoundDoseCallback>& callback) {
        const sp<media::ISoundDoseCallback>& callback) {
    // no need to lock since getSoundDoseInterface is synchronized
    // no need to lock since getSoundDoseInterface is synchronized
    return mSoundDoseManager->getSoundDoseInterface(callback);
    return mSoundDoseManager->getSoundDoseInterface(callback);
}
}


void AudioFlinger::MelReporter::stopInternalMelComputation() {
void MelReporter::stopInternalMelComputation() {
    ALOGV("%s", __func__);
    ALOGV("%s", __func__);
    std::lock_guard _l(mLock);
    std::lock_guard _l(mLock);
    mActiveMelPatches.clear();
    mActiveMelPatches.clear();
    mUseHalSoundDoseInterface = true;
    mUseHalSoundDoseInterface = true;
}
}


void AudioFlinger::MelReporter::stopMelComputationForPatch_l(const ActiveMelPatch& patch)
void MelReporter::stopMelComputationForPatch_l(const ActiveMelPatch& patch)
NO_THREAD_SAFETY_ANALYSIS  // access of AudioFlinger::checkOutputThread_l
NO_THREAD_SAFETY_ANALYSIS  // access of AudioFlinger::checkOutputThread_l
{
{
    if (!patch.csdActive) {
    if (!patch.csdActive) {
@@ -278,7 +278,7 @@ NO_THREAD_SAFETY_ANALYSIS // access of AudioFlinger::checkOutputThread_l
}
}




std::optional<audio_patch_handle_t> AudioFlinger::MelReporter::activePatchStreamHandle_l(
std::optional<audio_patch_handle_t> MelReporter::activePatchStreamHandle_l(
        audio_io_handle_t streamHandle) {
        audio_io_handle_t streamHandle) {
    for(const auto& patchIt : mActiveMelPatches) {
    for(const auto& patchIt : mActiveMelPatches) {
        if (patchIt.second.streamHandle == streamHandle) {
        if (patchIt.second.streamHandle == streamHandle) {
@@ -288,11 +288,11 @@ std::optional<audio_patch_handle_t> AudioFlinger::MelReporter::activePatchStream
    return std::nullopt;
    return std::nullopt;
}
}


bool AudioFlinger::MelReporter::useHalSoundDoseInterface_l() {
bool MelReporter::useHalSoundDoseInterface_l() {
    return !mSoundDoseManager->forceUseFrameworkMel() & mUseHalSoundDoseInterface;
    return !mSoundDoseManager->forceUseFrameworkMel() & mUseHalSoundDoseInterface;
}
}


std::string AudioFlinger::MelReporter::dump() {
std::string MelReporter::dump() {
    std::lock_guard _l(mLock);
    std::lock_guard _l(mLock);
    std::string output("\nSound Dose:\n");
    std::string output("\nSound Dose:\n");
    output.append(mSoundDoseManager->dump());
    output.append(mSoundDoseManager->dump());
+8 −8
Original line number Original line Diff line number Diff line
@@ -15,14 +15,14 @@
** limitations under the License.
** limitations under the License.
*/
*/


#ifndef INCLUDING_FROM_AUDIOFLINGER_H
#pragma once
    #error This header file should only be included from AudioFlinger.h
#endif


#include <mutex>
#include <mutex>
#include <sounddose/SoundDoseManager.h>
#include <sounddose/SoundDoseManager.h>
#include <unordered_map>
#include <unordered_map>


namespace android {

constexpr static int kMaxTimestampDeltaInSec = 120;
constexpr static int kMaxTimestampDeltaInSec = 120;


/**
/**
@@ -112,9 +112,9 @@ private:
     * Locking order AudioFlinger::mLock -> PatchCommandThread::mLock -> MelReporter::mLock.
     * Locking order AudioFlinger::mLock -> PatchCommandThread::mLock -> MelReporter::mLock.
     */
     */
    std::mutex mLock;
    std::mutex mLock;
    std::unordered_map<audio_patch_handle_t, ActiveMelPatch>
    std::unordered_map<audio_patch_handle_t, ActiveMelPatch> mActiveMelPatches GUARDED_BY(mLock);
        mActiveMelPatches GUARDED_BY(AudioFlinger::MelReporter::mLock);
    std::unordered_map<audio_port_handle_t, int> mActiveDevices GUARDED_BY(mLock);
    std::unordered_map<audio_port_handle_t, int>
    bool mUseHalSoundDoseInterface GUARDED_BY(mLock) = false;
        mActiveDevices GUARDED_BY(AudioFlinger::MelReporter::mLock);
    bool mUseHalSoundDoseInterface GUARDED_BY(AudioFlinger::MelReporter::mLock) = false;
};
};

}  // namespace android