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

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

AudioFlinger: Extract DeviceEffectManager 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
Merged-In: Ica9b4df3dc148310d1dc03d0dab86db56c20475d
Change-Id: Ica9b4df3dc148310d1dc03d0dab86db56c20475d
parent c8904850
Loading
Loading
Loading
Loading
+3 −6
Original line number Diff line number Diff line
@@ -130,6 +130,7 @@

// Classes that depend on IAf* interfaces but are not cross-dependent.
#include "PatchCommandThread.h"
#include "DeviceEffectManager.h"

namespace android {

@@ -162,6 +163,8 @@ class AudioFlinger : public AudioFlingerServerAdapter::Delegate
{
    friend class sp<AudioFlinger>;
    friend class Client; // removeClient_l();
    friend class DeviceEffectManager;
    friend class DeviceEffectManagerCallback;
    friend class PatchPanel;
    // TODO(b/291012167) replace the Thread friends with an interface.
    friend class DirectOutputThread;
@@ -578,18 +581,12 @@ private:
    void requestLogMerge();

    // TODO(b/288339104) replace these forward declaration classes with interfaces.
    class DeviceEffectManager;
    // TODO(b/288339104) these should be separate files
public:
    class DeviceEffectManagerCallback;
private:
    struct TeePatch;
public:
    using TeePatches = std::vector<TeePatch>;
private:

#include "DeviceEffectManager.h"

#include "MelReporter.h"

    // Find io handle by session id.
+36 −11
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@
*/


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

#include <utils/Log.h>
@@ -34,7 +34,25 @@ namespace android {
using detail::AudioHalVersionInfo;
using media::IEffectClient;

void AudioFlinger::DeviceEffectManager::onCreateAudioPatch(audio_patch_handle_t handle,
DeviceEffectManager::DeviceEffectManager(AudioFlinger& audioFlinger)
    : mAudioFlinger(audioFlinger),
      mMyCallback(new DeviceEffectManagerCallback(*this)) {}

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

status_t DeviceEffectManager::addEffectToHal(const struct audio_port_config* device,
        const sp<EffectHalInterface>& effect) {
    return mAudioFlinger.addEffectToHal(device, effect);
};

status_t DeviceEffectManager::removeEffectFromHal(const struct audio_port_config* device,
        const sp<EffectHalInterface>& effect) {
    return mAudioFlinger.removeEffectFromHal(device, effect);
};

void DeviceEffectManager::onCreateAudioPatch(audio_patch_handle_t handle,
        const IAfPatchPanel::Patch& patch) {
    ALOGV("%s handle %d mHalHandle %d device sink %08x",
            __func__, handle, patch.mHalHandle,
@@ -47,7 +65,7 @@ void AudioFlinger::DeviceEffectManager::onCreateAudioPatch(audio_patch_handle_t
    }
}

void AudioFlinger::DeviceEffectManager::onReleaseAudioPatch(audio_patch_handle_t handle) {
void DeviceEffectManager::onReleaseAudioPatch(audio_patch_handle_t handle) {
    ALOGV("%s", __func__);
    Mutex::Autolock _l(mLock);
    for (auto& effect : mDeviceEffects) {
@@ -56,7 +74,7 @@ void AudioFlinger::DeviceEffectManager::onReleaseAudioPatch(audio_patch_handle_t
}

// DeviceEffectManager::createEffect_l() must be called with AudioFlinger::mLock held
sp<IAfEffectHandle> AudioFlinger::DeviceEffectManager::createEffect_l(
sp<IAfEffectHandle> DeviceEffectManager::createEffect_l(
        effect_descriptor_t *descriptor,
        const AudioDeviceTypeAddr& device,
        const sp<Client>& client,
@@ -110,7 +128,7 @@ sp<IAfEffectHandle> AudioFlinger::DeviceEffectManager::createEffect_l(
    return handle;
}

status_t AudioFlinger::DeviceEffectManager::checkEffectCompatibility(
status_t DeviceEffectManager::checkEffectCompatibility(
        const effect_descriptor_t *desc) {
    const sp<EffectsFactoryHalInterface> effectsFactory =
            audioflinger::EffectConfiguration::getEffectsFactoryHal();
@@ -136,7 +154,7 @@ status_t AudioFlinger::DeviceEffectManager::checkEffectCompatibility(
    return NO_ERROR;
}

status_t AudioFlinger::DeviceEffectManager::createEffectHal(
status_t DeviceEffectManager::createEffectHal(
        const effect_uuid_t *pEffectUuid, int32_t sessionId, int32_t deviceId,
        sp<EffectHalInterface> *effect) {
    status_t status = NO_INIT;
@@ -149,10 +167,10 @@ status_t AudioFlinger::DeviceEffectManager::createEffectHal(
    return status;
}

void AudioFlinger::DeviceEffectManager::dump(int fd)
void DeviceEffectManager::dump(int fd)
NO_THREAD_SAFETY_ANALYSIS  // conditional try lock
{
    const bool locked = dumpTryLock(mLock);
    const bool locked = AudioFlinger::dumpTryLock(mLock);
    if (!locked) {
        String8 result("DeviceEffectManager may be deadlocked\n");
        write(fd, result.c_str(), result.size());
@@ -173,15 +191,14 @@ NO_THREAD_SAFETY_ANALYSIS // conditional try lock
    }
}


size_t AudioFlinger::DeviceEffectManager::removeEffect(const sp<IAfDeviceEffectProxy>& effect)
size_t DeviceEffectManager::removeEffect(const sp<IAfDeviceEffectProxy>& effect)
{
    Mutex::Autolock _l(mLock);
    mDeviceEffects.erase(effect->device());
    return mDeviceEffects.size();
}

bool AudioFlinger::DeviceEffectManagerCallback::disconnectEffectHandle(
bool DeviceEffectManagerCallback::disconnectEffectHandle(
        IAfEffectHandle *handle, bool unpinIfLast) {
    sp<IAfEffectBase> effectBase = handle->effect().promote();
    if (effectBase == nullptr) {
@@ -203,4 +220,12 @@ bool AudioFlinger::DeviceEffectManagerCallback::disconnectEffectHandle(
    return true;
}

bool DeviceEffectManagerCallback::isAudioPolicyReady() const {
    return mManager.audioFlinger().isAudioPolicyReady();
}

int DeviceEffectManagerCallback::newEffectId() const {
    return mManager.audioFlinger().nextUniqueId(AUDIO_UNIQUE_ID_USE_EFFECT);
}

} // namespace android
+15 −23
Original line number Diff line number Diff line
@@ -15,20 +15,18 @@
** limitations under the License.
*/

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

namespace android {

class DeviceEffectManagerCallback;

// DeviceEffectManager is concealed within AudioFlinger, their lifetimes are the same.
class DeviceEffectManager : public PatchCommandThread::PatchCommandListener {
public:
    explicit DeviceEffectManager(AudioFlinger& audioFlinger)
        : mAudioFlinger(audioFlinger),
          mMyCallback(new DeviceEffectManagerCallback(*this)) {}
    explicit DeviceEffectManager(AudioFlinger& audioFlinger);

    void onFirstRef() override {
        mAudioFlinger.mPatchCommandThread->addListener(this);
    }
    void onFirstRef() override;

    sp<IAfEffectHandle> createEffect_l(effect_descriptor_t *descriptor,
                const AudioDeviceTypeAddr& device,
@@ -45,13 +43,9 @@ public:
           int32_t sessionId, int32_t deviceId,
           sp<EffectHalInterface> *effect);
    status_t addEffectToHal(const struct audio_port_config *device,
            const sp<EffectHalInterface>& effect) {
        return mAudioFlinger.addEffectToHal(device, effect);
    };
            const sp<EffectHalInterface>& effect);
    status_t removeEffectFromHal(const struct audio_port_config *device,
            const sp<EffectHalInterface>& effect) {
        return mAudioFlinger.removeEffectFromHal(device, effect);
    };
            const sp<EffectHalInterface>& effect);

    AudioFlinger& audioFlinger() const { return mAudioFlinger; }

@@ -60,8 +54,8 @@ public:
    // PatchCommandThread::PatchCommandListener implementation

    void onCreateAudioPatch(audio_patch_handle_t handle,
            const IAfPatchPanel::Patch& patch) override;
    void onReleaseAudioPatch(audio_patch_handle_t handle) override;
            const IAfPatchPanel::Patch& patch) final;
    void onReleaseAudioPatch(audio_patch_handle_t handle) final;

private:
    status_t checkEffectCompatibility(const effect_descriptor_t *desc);
@@ -72,7 +66,6 @@ private:
    std::map<AudioDeviceTypeAddr, sp<IAfDeviceEffectProxy>> mDeviceEffects;
};

public: // TODO(b/288339104) extract inner class.
class DeviceEffectManagerCallback : public EffectCallbackInterface {
public:
    explicit DeviceEffectManagerCallback(DeviceEffectManager& manager)
@@ -129,11 +122,9 @@ public:

    wp<IAfEffectChain> chain() const override { return nullptr; }

    bool isAudioPolicyReady() const override {
        return mManager.audioFlinger().isAudioPolicyReady();
    }
    bool isAudioPolicyReady() const final;

    int newEffectId() { return mManager.audioFlinger().nextUniqueId(AUDIO_UNIQUE_ID_USE_EFFECT); }
    int newEffectId() const;

    status_t addEffectToHal(const struct audio_port_config *device,
            const sp<EffectHalInterface>& effect) {
@@ -146,4 +137,5 @@ public:
private:
    DeviceEffectManager& mManager;
};
private:

}  // namespace android
+2 −2
Original line number Diff line number Diff line
@@ -3271,11 +3271,11 @@ int32_t EffectChain::EffectCallback::activeTrackCnt() const {
/* static */
sp<IAfDeviceEffectProxy> IAfDeviceEffectProxy::create(
        const AudioDeviceTypeAddr& device,
        const sp</* DeviceEffectManagerCallback */ RefBase>& callback,  // TODO(b/288339104) type
        const sp<DeviceEffectManagerCallback>& callback,
        effect_descriptor_t *desc, int id, bool notifyFramesProcessed)
{
    return sp<DeviceEffectProxy>::make(device,
            sp<AudioFlinger::DeviceEffectManagerCallback>::cast(callback),
            callback,
            desc, id, notifyFramesProcessed);
}

+4 −4
Original line number Diff line number Diff line
@@ -649,7 +649,7 @@ private:
class DeviceEffectProxy : public IAfDeviceEffectProxy, public EffectBase {
public:
    DeviceEffectProxy(const AudioDeviceTypeAddr& device,
                const sp<AudioFlinger::DeviceEffectManagerCallback>& callback,
            const sp<DeviceEffectManagerCallback>& callback,
                effect_descriptor_t *desc, int id, bool notifyFramesProcessed)
            : EffectBase(callback, desc, id, AUDIO_SESSION_DEVICE, false),
                mDevice(device), mManagerCallback(callback),
@@ -687,7 +687,7 @@ private:
        // Note: ctors taking a weak pointer to their owner must not promote it
        // during construction (but may keep a reference for later promotion).
        ProxyCallback(const wp<DeviceEffectProxy>& owner,
                const sp<AudioFlinger::DeviceEffectManagerCallback>& callback)
                const sp<DeviceEffectManagerCallback>& callback)
            : mProxy(owner), mManagerCallback(callback) {}

        status_t createEffectHal(const effect_uuid_t *pEffectUuid,
@@ -738,14 +738,14 @@ private:

    private:
        const wp<DeviceEffectProxy> mProxy;
        const sp<AudioFlinger::DeviceEffectManagerCallback> mManagerCallback;
        const sp<DeviceEffectManagerCallback> mManagerCallback;
    };

    status_t checkPort(const IAfPatchPanel::Patch& patch,
            const struct audio_port_config *port, sp<IAfEffectHandle> *handle);

    const AudioDeviceTypeAddr mDevice;
    const sp<AudioFlinger::DeviceEffectManagerCallback> mManagerCallback;
    const sp<DeviceEffectManagerCallback> mManagerCallback;
    const sp<ProxyCallback> mMyCallback;

    mutable Mutex mProxyLock;
Loading