Loading services/audioflinger/AudioFlinger.cpp +23 −24 Original line number Diff line number Diff line Loading @@ -751,12 +751,12 @@ 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(); for (const auto& [ _, client ] : mNotificationClients) { const uid_t uid = client->getUid(); const std::shared_ptr<const mediautils::UidInfo::Info> info = mediautils::UidInfo::getInfo(uid); result.appendFormat("%6d %6u %s\n", pid, uid, info->package.c_str()); result.appendFormat("%6d %6u %s\n", client->getPid(), uid, info->package.c_str()); } result.append("Global session refs:\n"); Loading Loading @@ -2164,24 +2164,22 @@ 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); if (mNotificationClients.count(pid) == 0) { auto notificationClient = sp<NotificationClient>::make( this, client, pid, uid); ALOGV("registerClient() client %p, pid %d, uid %u", notificationClient.get(), pid, uid); mNotificationClients.add(pid, notificationClient); mNotificationClients[pid] = notificationClient; sp<IBinder> binder = IInterface::asBinder(client); binder->linkToDeath(notificationClient); } Loading @@ -2208,7 +2206,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); Loading Loading @@ -2249,11 +2247,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); } } } Loading @@ -2267,9 +2267,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); } } Loading Loading @@ -2337,7 +2336,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); } Loading Loading @@ -3604,7 +3603,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; } Loading services/audioflinger/AudioFlinger.h +1 −2 Original line number Diff line number Diff line Loading @@ -698,8 +698,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 Loading Loading
services/audioflinger/AudioFlinger.cpp +23 −24 Original line number Diff line number Diff line Loading @@ -751,12 +751,12 @@ 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(); for (const auto& [ _, client ] : mNotificationClients) { const uid_t uid = client->getUid(); const std::shared_ptr<const mediautils::UidInfo::Info> info = mediautils::UidInfo::getInfo(uid); result.appendFormat("%6d %6u %s\n", pid, uid, info->package.c_str()); result.appendFormat("%6d %6u %s\n", client->getPid(), uid, info->package.c_str()); } result.append("Global session refs:\n"); Loading Loading @@ -2164,24 +2164,22 @@ 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); if (mNotificationClients.count(pid) == 0) { auto notificationClient = sp<NotificationClient>::make( this, client, pid, uid); ALOGV("registerClient() client %p, pid %d, uid %u", notificationClient.get(), pid, uid); mNotificationClients.add(pid, notificationClient); mNotificationClients[pid] = notificationClient; sp<IBinder> binder = IInterface::asBinder(client); binder->linkToDeath(notificationClient); } Loading @@ -2208,7 +2206,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); Loading Loading @@ -2249,11 +2247,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); } } } Loading @@ -2267,9 +2267,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); } } Loading Loading @@ -2337,7 +2336,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); } Loading Loading @@ -3604,7 +3603,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; } Loading
services/audioflinger/AudioFlinger.h +1 −2 Original line number Diff line number Diff line Loading @@ -698,8 +698,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 Loading