Loading services/audioflinger/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,7 @@ cc_library_shared { "av-types-aidl-cpp", "effect-aidl-cpp", "libaudioclient_aidl_conversion", "libactivitymanager_aidl", "libaudioflinger_timing", "libaudiofoundation", "libaudiohal", Loading services/audioflinger/TrackMetrics.h +34 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,9 @@ #ifndef ANDROID_AUDIO_TRACKMETRICS_H #define ANDROID_AUDIO_TRACKMETRICS_H #include <binder/IActivityManager.h> #include <binder/IPCThreadState.h> #include <binder/IServiceManager.h> #include <mutex> namespace android { Loading @@ -38,10 +41,13 @@ namespace android { * We currently deliver metrics based on an AudioIntervalGroup. */ class TrackMetrics final { public: TrackMetrics(std::string metricsId, bool isOut) TrackMetrics(std::string metricsId, bool isOut, int clientUid) : mMetricsId(std::move(metricsId)) , mIsOut(isOut) , mUid(clientUid) {} // we don't log a constructor item, we wait for more info in logConstructor(). ~TrackMetrics() { Loading @@ -64,6 +70,12 @@ public: AMEDIAMETRICS_PROP_EVENT_VALUE_BEGINAUDIOINTERVALGROUP, devices.c_str()); } ++mIntervalCount; const auto& mActivityManager = getActivityManager(); if (mActivityManager) { mActivityManager->logFgsApiBegin(AUDIO_API, mUid, IPCThreadState::self() -> getCallingPid()); } } void logConstructor(pid_t creatorPid, uid_t creatorUid, int32_t internalTrackId, Loading Loading @@ -93,6 +105,12 @@ public: logVolume_l(mVolume); // flush out the last volume. mLastVolumeChangeTimeNs = 0; } const auto& mActivityManager = getActivityManager(); if (mActivityManager) { mActivityManager->logFgsApiEnd(AUDIO_API, mUid, IPCThreadState::self() -> getCallingPid()); } } void logInvalidate() const { Loading Loading @@ -221,9 +239,24 @@ private: // do not reset mUnderrunCount - it keeps continuously running for tracks. } // Meyer's singleton is thread-safe. static const sp<IActivityManager>& getActivityManager() { static const auto activityManager = []() -> sp<IActivityManager> { const sp<IServiceManager> sm(defaultServiceManager()); if (sm != nullptr) { return interface_cast<IActivityManager>(sm->checkService(String16("activity"))); } return nullptr; }(); return activityManager; } const std::string mMetricsId; const bool mIsOut; // if true, than a playback track, otherwise used for record. static constexpr int AUDIO_API = 5; const int mUid; mutable std::mutex mLock; // Devices in the interval group. Loading services/audioflinger/Tracks.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -118,7 +118,7 @@ AudioFlinger::ThreadBase::TrackBase::TrackBase( mThreadIoHandle(thread ? thread->id() : AUDIO_IO_HANDLE_NONE), mPortId(portId), mIsInvalid(false), mTrackMetrics(std::move(metricsId), isOut), mTrackMetrics(std::move(metricsId), isOut, clientUid), mCreatorPid(creatorPid) { const uid_t callingUid = IPCThreadState::self()->getCallingUid(); Loading Loading
services/audioflinger/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,7 @@ cc_library_shared { "av-types-aidl-cpp", "effect-aidl-cpp", "libaudioclient_aidl_conversion", "libactivitymanager_aidl", "libaudioflinger_timing", "libaudiofoundation", "libaudiohal", Loading
services/audioflinger/TrackMetrics.h +34 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,9 @@ #ifndef ANDROID_AUDIO_TRACKMETRICS_H #define ANDROID_AUDIO_TRACKMETRICS_H #include <binder/IActivityManager.h> #include <binder/IPCThreadState.h> #include <binder/IServiceManager.h> #include <mutex> namespace android { Loading @@ -38,10 +41,13 @@ namespace android { * We currently deliver metrics based on an AudioIntervalGroup. */ class TrackMetrics final { public: TrackMetrics(std::string metricsId, bool isOut) TrackMetrics(std::string metricsId, bool isOut, int clientUid) : mMetricsId(std::move(metricsId)) , mIsOut(isOut) , mUid(clientUid) {} // we don't log a constructor item, we wait for more info in logConstructor(). ~TrackMetrics() { Loading @@ -64,6 +70,12 @@ public: AMEDIAMETRICS_PROP_EVENT_VALUE_BEGINAUDIOINTERVALGROUP, devices.c_str()); } ++mIntervalCount; const auto& mActivityManager = getActivityManager(); if (mActivityManager) { mActivityManager->logFgsApiBegin(AUDIO_API, mUid, IPCThreadState::self() -> getCallingPid()); } } void logConstructor(pid_t creatorPid, uid_t creatorUid, int32_t internalTrackId, Loading Loading @@ -93,6 +105,12 @@ public: logVolume_l(mVolume); // flush out the last volume. mLastVolumeChangeTimeNs = 0; } const auto& mActivityManager = getActivityManager(); if (mActivityManager) { mActivityManager->logFgsApiEnd(AUDIO_API, mUid, IPCThreadState::self() -> getCallingPid()); } } void logInvalidate() const { Loading Loading @@ -221,9 +239,24 @@ private: // do not reset mUnderrunCount - it keeps continuously running for tracks. } // Meyer's singleton is thread-safe. static const sp<IActivityManager>& getActivityManager() { static const auto activityManager = []() -> sp<IActivityManager> { const sp<IServiceManager> sm(defaultServiceManager()); if (sm != nullptr) { return interface_cast<IActivityManager>(sm->checkService(String16("activity"))); } return nullptr; }(); return activityManager; } const std::string mMetricsId; const bool mIsOut; // if true, than a playback track, otherwise used for record. static constexpr int AUDIO_API = 5; const int mUid; mutable std::mutex mLock; // Devices in the interval group. Loading
services/audioflinger/Tracks.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -118,7 +118,7 @@ AudioFlinger::ThreadBase::TrackBase::TrackBase( mThreadIoHandle(thread ? thread->id() : AUDIO_IO_HANDLE_NONE), mPortId(portId), mIsInvalid(false), mTrackMetrics(std::move(metricsId), isOut), mTrackMetrics(std::move(metricsId), isOut, clientUid), mCreatorPid(creatorPid) { const uid_t callingUid = IPCThreadState::self()->getCallingUid(); Loading