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

Commit 2261bcd8 authored by Kunal Malhotra's avatar Kunal Malhotra Committed by Android (Google) Code Review
Browse files

Merge "Adding in AIDL calls to log API start and stop in audioflinger code" into udc-dev

parents 103b556f 3be68904
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();