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

Commit 950c9e7b authored by Andy Hung's avatar Andy Hung
Browse files

AudioFlinger: Clean up NotificationClients

Use std::map to modernize an ordered map.
Save package name.

Test: atest AudioTrackTest
Flag: EXEMPT refactor
Bug: 350114693
Change-Id: Ia05c8d1875372ee592a80c2c194a4e76e37cb42f
parent 3c954364
Loading
Loading
Loading
Loading
+30 −30
Original line number Diff line number Diff line
@@ -748,11 +748,9 @@ void AudioFlinger::dumpClients_ll(int fd, const Vector<String16>& args __unused)

    result.append("Notification Clients:\n");
    result.append("   pid    uid  name\n");
    for (size_t i = 0; i < mNotificationClients.size(); ++i) {
        const pid_t pid = mNotificationClients[i]->getPid();
        const uid_t uid = mNotificationClients[i]->getUid();
        const mediautils::UidInfo::Info info = mUidInfo.getInfo(uid);
        result.appendFormat("%6d %6u  %s\n", pid, uid, info.package.c_str());
    for (const auto& [ _, client ] : mNotificationClients) {
        result.appendFormat("%6d %6u  %s\n",
                client->getPid(), client->getUid(), client->getPackageName().c_str());
    }

    result.append("Global session refs:\n");
@@ -2131,24 +2129,23 @@ status_t AudioFlinger::getRenderPosition(uint32_t *halFrames, uint32_t *dspFrame

void AudioFlinger::registerClient(const sp<media::IAudioFlingerClient>& client)
{
    audio_utils::lock_guard _l(mutex());
    if (client == 0) {
        return;
    }
    pid_t pid = IPCThreadState::self()->getCallingPid();
    const pid_t pid = IPCThreadState::self()->getCallingPid();
    const uid_t uid = IPCThreadState::self()->getCallingUid();

    audio_utils::lock_guard _l(mutex());
    {
        audio_utils::lock_guard _cl(clientMutex());
        if (mNotificationClients.indexOfKey(pid) < 0) {
            sp<NotificationClient> notificationClient = new NotificationClient(this,
                                                                                client,
                                                                                pid,
                                                                                uid);
            ALOGV("registerClient() client %p, pid %d, uid %u",
                    notificationClient.get(), pid, uid);

            mNotificationClients.add(pid, notificationClient);
        if (mNotificationClients.count(pid) == 0) {
            const mediautils::UidInfo::Info info = mUidInfo.getInfo(uid);
            sp<NotificationClient> notificationClient = sp<NotificationClient>::make(
                    this, client, pid, uid, info.package);
            ALOGV("registerClient() pid %d, uid %u, package %s",
                    pid, uid, info.package.c_str());

            mNotificationClients[pid] = notificationClient;
            sp<IBinder> binder = IInterface::asBinder(client);
            binder->linkToDeath(notificationClient);
        }
@@ -2175,7 +2172,7 @@ void AudioFlinger::removeNotificationClient(pid_t pid)
        audio_utils::lock_guard _l(mutex());
        {
            audio_utils::lock_guard _cl(clientMutex());
            mNotificationClients.removeItem(pid);
            mNotificationClients.erase(pid);
        }

        ALOGV("%d died, releasing its sessions", pid);
@@ -2216,11 +2213,13 @@ void AudioFlinger::ioConfigChanged_l(audio_io_config_event_t event,
            legacy2aidl_AudioIoDescriptor_AudioIoDescriptor(ioDesc));

    audio_utils::lock_guard _l(clientMutex());
    size_t size = mNotificationClients.size();
    for (size_t i = 0; i < size; i++) {
        if ((pid == 0) || (mNotificationClients.keyAt(i) == pid)) {
            mNotificationClients.valueAt(i)->audioFlingerClient()->ioConfigChanged(eventAidl,
                                                                                   descAidl);
    if (pid != 0) {
        if (auto it = mNotificationClients.find(pid); it != mNotificationClients.end()) {
            it->second->audioFlingerClient()->ioConfigChanged(eventAidl, descAidl);
        }
    } else {
        for (const auto& [ client_pid, client] : mNotificationClients) {
            client->audioFlingerClient()->ioConfigChanged(eventAidl, descAidl);
        }
    }
}
@@ -2234,9 +2233,8 @@ void AudioFlinger::onSupportedLatencyModesChanged(

    audio_utils::lock_guard _l(clientMutex());
    size_t size = mNotificationClients.size();
    for (size_t i = 0; i < size; i++) {
        mNotificationClients.valueAt(i)->audioFlingerClient()
                ->onSupportedLatencyModesChanged(outputAidl, modesAidl);
    for (const auto& [_, client] : mNotificationClients) {
        client->audioFlingerClient()->onSupportedLatencyModesChanged(outputAidl, modesAidl);
    }
}

@@ -2293,8 +2291,10 @@ sp<IAfThreadBase> AudioFlinger::getEffectThread_l(audio_session_t sessionId,
AudioFlinger::NotificationClient::NotificationClient(const sp<AudioFlinger>& audioFlinger,
                                                     const sp<media::IAudioFlingerClient>& client,
                                                     pid_t pid,
                                                     uid_t uid)
    : mAudioFlinger(audioFlinger), mPid(pid), mUid(uid), mAudioFlingerClient(client)
        uid_t uid,
        std::string_view packageName)
    : mAudioFlinger(audioFlinger), mPid(pid), mUid(uid)
    , mPackageName(packageName), mAudioFlingerClient(client)
{
}

@@ -2304,7 +2304,7 @@ AudioFlinger::NotificationClient::~NotificationClient()

void AudioFlinger::NotificationClient::binderDied(const wp<IBinder>& who __unused)
{
    sp<NotificationClient> keep(this);
    const auto keep = sp<NotificationClient>::fromExisting(this);
    mAudioFlinger->removeNotificationClient(mPid);
}

@@ -3571,7 +3571,7 @@ void AudioFlinger::acquireAudioSessionId(
        // is likely proxied by mediaserver (e.g CameraService) and releaseAudioSessionId() can be
        // called from a different pid leaving a stale session reference.  Also we don't know how
        // to clear this reference if the client process dies.
        if (mNotificationClients.indexOfKey(caller) < 0) {
        if (mNotificationClients.count(caller) == 0) {
            ALOGW("acquireAudioSessionId() unknown client %d for session %d", caller, audioSession);
            return;
        }
+5 −3
Original line number Diff line number Diff line
@@ -479,12 +479,14 @@ private:
                            NotificationClient(const sp<AudioFlinger>& audioFlinger,
                                                const sp<media::IAudioFlingerClient>& client,
                                                pid_t pid,
                                                uid_t uid);
                uid_t uid,
                std::string_view packageName);
        virtual             ~NotificationClient();

                sp<media::IAudioFlingerClient> audioFlingerClient() const { return mAudioFlingerClient; }
                pid_t getPid() const { return mPid; }
                uid_t getUid() const { return mUid; }
                const std::string& getPackageName() const { return mPackageName; }

                // IBinder::DeathRecipient
                virtual     void        binderDied(const wp<IBinder>& who);
@@ -495,6 +497,7 @@ private:
        const sp<AudioFlinger>  mAudioFlinger;
        const pid_t             mPid;
        const uid_t             mUid;
        const std::string mPackageName;
        const sp<media::IAudioFlingerClient> mAudioFlingerClient;
    };

@@ -694,8 +697,7 @@ private:

    DefaultKeyedVector<audio_io_handle_t, sp<IAfRecordThread>> mRecordThreads GUARDED_BY(mutex());

    DefaultKeyedVector<pid_t, sp<NotificationClient>> mNotificationClients
            GUARDED_BY(clientMutex());
    std::map<pid_t, sp<NotificationClient>> mNotificationClients GUARDED_BY(clientMutex());

                // updated by atomic_fetch_add_explicit
    volatile atomic_uint_fast32_t mNextUniqueIds[AUDIO_UNIQUE_ID_USE_MAX];  // ctor init