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

Commit 3be68904 authored by Kunal Malhotra's avatar Kunal Malhotra
Browse files

Adding in AIDL calls to log API start and stop in audioflinger code

Test: manual testing on device
Bug: b/263304156
Change-Id: If12e12755036b4b0ca182632ceb68dc3a3522a97
parent 101375ea
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -67,6 +67,7 @@ cc_library_shared {
        "av-types-aidl-cpp",
        "effect-aidl-cpp",
        "libaudioclient_aidl_conversion",
        "libactivitymanager_aidl",
        "libaudioflinger_timing",
        "libaudiofoundation",
        "libaudiohal",
+34 −1
Original line number Diff line number Diff line
@@ -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 {
@@ -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() {
@@ -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,
@@ -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 {
@@ -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.
+1 −1
Original line number Diff line number Diff line
@@ -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();