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

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

AudioFlinger: Create MelReporter callback

Test: atest AudioTrackTest AudioRecordTest
Test: Camera YouTube
Bug: 291319167
Merged-In: Icd73c1e4d47f6a8eac85001771fc356d161b4f08
Change-Id: Icd73c1e4d47f6a8eac85001771fc356d161b4f08
parent 13e99b3d
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -329,7 +329,6 @@ AudioFlinger::AudioFlinger()
      mClientSharedHeapSize(kMinimumClientSharedHeapSizeBytes),
      mGlobalEffectEnableTime(0),
      mPatchCommandThread(sp<PatchCommandThread>::make()),
      mMelReporter(sp<MelReporter>::make(*this)),
      mSystemReady(false),
      mBluetoothLatencyModesEnabled(true)
{
@@ -412,6 +411,8 @@ void AudioFlinger::onFirstRef()
        mAAudioBurstsPerBuffer = getAAudioMixerBurstCountFromSystemProperty();
        mAAudioHwBurstMinMicros = getAAudioHardwareBurstMinUsecFromSystemProperty();
    }

    mMelReporter = sp<MelReporter>::make(sp<IAfMelReporterCallback>::fromExisting(this));
}

status_t AudioFlinger::setAudioHalPids(const std::vector<pid_t>& pids) {
+10 −3
Original line number Diff line number Diff line
@@ -166,10 +166,10 @@ class AudioFlinger
    : public AudioFlingerServerAdapter::Delegate  // IAudioFlinger client interface
    , public IAfClientCallback
    , public IAfDeviceEffectManagerCallback
    , public IAfMelReporterCallback
{
    friend class sp<AudioFlinger>;
    // TODO(b/291319167) Create interface and remove friends.
    friend class MelReporter;
    friend class PatchPanel;
    // TODO(b/291012167) replace the Thread friends with an interface.
    friend class DirectOutputThread;
@@ -375,6 +375,7 @@ public:
    // ---- begin IAfDeviceEffectManagerCallback interface

    bool isAudioPolicyReady() const final { return mAudioPolicyReady.load(); }
    // below also used by IAfMelReporterCallback
    const sp<PatchCommandThread>& getPatchCommandThread() final { return mPatchCommandThread; }
    status_t addEffectToHal(
            const struct audio_port_config* device, const sp<EffectHalInterface>& effect) final;
@@ -383,6 +384,13 @@ public:

    // ---- end of IAfDeviceEffectManagerCallback interface

    // ---- begin IAfMelReporterCallback interface

    Mutex& mutex() const final { return mLock; }
    sp<IAfThreadBase> checkOutputThread_l(audio_io_handle_t ioHandle) const final REQUIRES(mLock);

    // ---- end of IAfMelReporterCallback interface

    /* List available audio ports and their attributes */
    status_t listAudioPorts(unsigned int* num_ports, struct audio_port* ports) const;

@@ -620,7 +628,6 @@ private:
    }

    IAfThreadBase* checkThread_l(audio_io_handle_t ioHandle) const;
    sp<IAfThreadBase> checkOutputThread_l(audio_io_handle_t ioHandle) const REQUIRES(mLock);
    IAfPlaybackThread* checkPlaybackThread_l(audio_io_handle_t output) const;
    IAfPlaybackThread* checkMixerThread_l(audio_io_handle_t output) const;
    IAfRecordThread* checkRecordThread_l(audio_io_handle_t input) const;
@@ -876,7 +883,7 @@ private:

    const sp<PatchCommandThread> mPatchCommandThread;
    /* const */ sp<DeviceEffectManager> mDeviceEffectManager;  // set onFirstRef
    sp<MelReporter> mMelReporter;
    /* const */ sp<MelReporter> mMelReporter;  // set onFirstRef

    bool       mSystemReady;
    std::atomic_bool mAudioPolicyReady{};
+8 −8
Original line number Diff line number Diff line
@@ -77,7 +77,7 @@ void MelReporter::activateInternalSoundDoseComputation() {
}

void MelReporter::onFirstRef() {
    mAudioFlinger.mPatchCommandThread->addListener(this);
    mAfMelReporterCallback->getPatchCommandThread()->addListener(this);

    mSoundDoseManager = sp<SoundDoseManager>::make(sp<IMelReporterCallback>::fromExisting(this));
}
@@ -89,7 +89,7 @@ void MelReporter::updateMetadataForCsd(audio_io_handle_t streamHandle,
        return;
    }

    std::lock_guard _laf(mAudioFlinger.mLock);
    std::lock_guard _laf(mAfMelReporterCallback->mutex());
    std::lock_guard _l(mLock);
    auto activeMelPatchId = activePatchStreamHandle_l(streamHandle);
    if (!activeMelPatchId) {
@@ -156,7 +156,7 @@ void MelReporter::onCreateAudioPatch(audio_patch_handle_t handle,
    }

    if (!newPatch.deviceStates.empty() && newPatch.csdActive) {
        std::lock_guard _afl(mAudioFlinger.mLock);
        std::lock_guard _afl(mAfMelReporterCallback->mutex());
        std::lock_guard _l(mLock);
        ALOGV("%s add patch handle %d to active devices", __func__, handle);
        startMelComputationForActivePatch_l(newPatch);
@@ -167,7 +167,7 @@ void MelReporter::onCreateAudioPatch(audio_patch_handle_t handle,
void MelReporter::startMelComputationForActivePatch_l(const ActiveMelPatch& patch)
NO_THREAD_SAFETY_ANALYSIS  // access of AudioFlinger::checkOutputThread_l
{
    auto outputThread = mAudioFlinger.checkOutputThread_l(patch.streamHandle);
    auto outputThread = mAfMelReporterCallback->checkOutputThread_l(patch.streamHandle);
    if (outputThread == nullptr) {
        ALOGE("%s cannot find thread for stream handle %d", __func__, patch.streamHandle);
        return;
@@ -194,7 +194,7 @@ NO_THREAD_SAFETY_ANALYSIS // access of AudioFlinger::checkOutputThread_l

void MelReporter::startMelComputationForDeviceId(audio_port_handle_t deviceId) {
    ALOGV("%s(%d)", __func__, deviceId);
    std::lock_guard _laf(mAudioFlinger.mLock);
    std::lock_guard _laf(mAfMelReporterCallback->mutex());
    std::lock_guard _l(mLock);

    for (auto& activeMelPatch : mActiveMelPatches) {
@@ -233,7 +233,7 @@ void MelReporter::onReleaseAudioPatch(audio_patch_handle_t handle) {
        mActiveMelPatches.erase(patchIt);
    }

    std::lock_guard _afl(mAudioFlinger.mLock);
    std::lock_guard _afl(mAfMelReporterCallback->mutex());
    std::lock_guard _l(mLock);
    stopMelComputationForPatch_l(melPatch);
}
@@ -254,7 +254,7 @@ void MelReporter::stopInternalMelComputation() {
void MelReporter::stopMelComputationForPatch_l(const ActiveMelPatch& patch)
NO_THREAD_SAFETY_ANALYSIS  // access of AudioFlinger::checkOutputThread_l
{
    auto outputThread = mAudioFlinger.checkOutputThread_l(patch.streamHandle);
    auto outputThread = mAfMelReporterCallback->checkOutputThread_l(patch.streamHandle);

    ALOGV("%s: stop MEL for stream id: %d", __func__, patch.streamHandle);
    for (const auto& device : patch.deviceStates) {
@@ -276,7 +276,7 @@ NO_THREAD_SAFETY_ANALYSIS // access of AudioFlinger::checkOutputThread_l

void MelReporter::stopMelComputationForDeviceId(audio_port_handle_t deviceId) {
    ALOGV("%s(%d)", __func__, deviceId);
    std::lock_guard _laf(mAudioFlinger.mLock);
    std::lock_guard _laf(mAfMelReporterCallback->mutex());
    std::lock_guard _l(mLock);

    for (auto& activeMelPatch : mActiveMelPatches) {
+10 −3
Original line number Diff line number Diff line
@@ -25,6 +25,13 @@ namespace android {

constexpr static int kMaxTimestampDeltaInSec = 120;

class IAfMelReporterCallback : public virtual RefBase {
public:
    virtual Mutex& mutex() const = 0;
    virtual const sp<PatchCommandThread>& getPatchCommandThread() = 0;
    virtual sp<IAfThreadBase> checkOutputThread_l(audio_io_handle_t ioHandle) const = 0;
};

/**
 * Class for listening to new patches and starting the MEL computation. MelReporter is
 * concealed within AudioFlinger, their lifetimes are the same.
@@ -32,8 +39,8 @@ constexpr static int kMaxTimestampDeltaInSec = 120;
class MelReporter : public PatchCommandThread::PatchCommandListener,
                    public IMelReporterCallback {
public:
    explicit MelReporter(AudioFlinger& audioFlinger)
        : mAudioFlinger(audioFlinger) {}
    explicit MelReporter(const sp<IAfMelReporterCallback>& afMelReporterCallback)
        : mAfMelReporterCallback(afMelReporterCallback) {}

    void onFirstRef() override;

@@ -106,7 +113,7 @@ private:

    bool useHalSoundDoseInterface_l() REQUIRES(mLock);

    AudioFlinger& mAudioFlinger;  // does not own the object
    const sp<IAfMelReporterCallback> mAfMelReporterCallback;

    sp<SoundDoseManager> mSoundDoseManager;