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

Commit 442868f0 authored by Eric Tan's avatar Eric Tan Committed by Android (Google) Code Review
Browse files

Merge "Audioflinger dumpsys: Use libjsoncpp for json dump"

parents 4455af94 1882f16c
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -21,6 +21,9 @@ LOCAL_SHARED_LIBRARIES := \
	libsoundtriggerservice \
	libutils

LOCAL_STATIC_LIBRARIES := \
	libjsoncpp

# TODO oboeservice is the old folder name for aaudioservice. It will be changed.
LOCAL_C_INCLUDES := \
	frameworks/av/services/audioflinger \
+1 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ LOCAL_SHARED_LIBRARIES := \

LOCAL_STATIC_LIBRARIES := \
    libcpustats \
    libjsoncpp \
    libsndfile \

LOCAL_MULTILIB := $(AUDIOSERVER_MULTILIB)
+14 −13
Original line number Diff line number Diff line
@@ -58,6 +58,8 @@

#include <audio_utils/primitives.h>

#include <json/json.h>

#include <powermanager/PowerManager.h>

#include <media/IMediaLogService.h>
@@ -440,8 +442,11 @@ status_t AudioFlinger::dump(int fd, const Vector<String16>& args)
        const bool formatJson = std::any_of(args.begin(), args.end(),
                [](const String16 &arg) { return arg == String16("--json"); });
        if (formatJson) {
            Json::Value root = getJsonDump();
            Json::FastWriter writer;
            std::string rootStr = writer.write(root);
            // XXX consider buffering if the string happens to be too long.
            dprintf(fd, "%s", getJsonString().c_str());
            dprintf(fd, "%s", rootStr.c_str());
            return NO_ERROR;
        }

@@ -556,34 +561,30 @@ status_t AudioFlinger::dump(int fd, const Vector<String16>& args)
    return NO_ERROR;
}

std::string AudioFlinger::getJsonString()
Json::Value AudioFlinger::getJsonDump()
{
    std::string jsonStr = "{\n";
    Json::Value root(Json::objectValue);
    const bool locked = dumpTryLock(mLock);

    // failed to lock - AudioFlinger is probably deadlocked
    if (!locked) {
        jsonStr += "    \"deadlock_message\": ";
        jsonStr += kDeadlockedString;
        jsonStr += ",\n";
        root["deadlock_message"] = kDeadlockedString;
    }
    // FIXME risky to access data structures without a lock held?

    jsonStr += "  \"Playback_Threads\": [\n";
    Json::Value playbackThreads = Json::arrayValue;
    // dump playback threads
    for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
        if (i != 0) {
            jsonStr += ",\n";
        }
        jsonStr += mPlaybackThreads.valueAt(i)->getJsonString();
        playbackThreads.append(mPlaybackThreads.valueAt(i)->getJsonDump());
    }
    jsonStr += "\n  ]\n}\n";

    if (locked) {
        mLock.unlock();
    }

    return jsonStr;
    root["playback_threads"] = playbackThreads;

    return root;
}

sp<AudioFlinger::Client> AudioFlinger::registerPid(pid_t pid)
+2 −1
Original line number Diff line number Diff line
@@ -79,6 +79,7 @@

#include <powermanager/IPowerManager.h>

#include <json/json.h>
#include <media/nblog/NBLog.h>
#include <private/media/AudioEffectShared.h>
#include <private/media/AudioTrackShared.h>
@@ -114,7 +115,7 @@ public:
    static const char* getServiceName() ANDROID_API { return "media.audio_flinger"; }

    virtual     status_t    dump(int fd, const Vector<String16>& args);
                std::string getJsonString();
                Json::Value getJsonDump();

    // IAudioFlinger interface, in binder opcode order
    virtual sp<IAudioTrack> createTrack(const CreateTrackInput& input,
+14 −20
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@
#include <cpustats/ThreadCpuUsage.h>
#endif
#endif
#include <json/json.h>
#include <string>
#include <utils/Debug.h>
#include <utils/Log.h>
@@ -205,14 +206,13 @@ void FastMixerDumpState::dump(int fd) const
    }
}

// TODO get rid of extraneous lines and use better key names.
// TODO may go back to using a library to do the json formatting.
std::string FastMixerDumpState::getJsonString() const
Json::Value FastMixerDumpState::getJsonDump() const
{
    Json::Value root(Json::objectValue);
    if (mCommand == FastMixerState::INITIAL) {
        return "    {\n      \"status\": \"uninitialized\"\n    }";
        root["status"] = "uninitialized";
        return root;
    }
    std::string jsonStr = "    {\n";
#ifdef FAST_THREAD_STATISTICS
    // find the interval of valid samples
    const uint32_t bounds = mBounds;
@@ -230,31 +230,25 @@ std::string FastMixerDumpState::getJsonString() const
    }
    // statistics for monotonic (wall clock) time, thread raw CPU load in time, CPU clock frequency,
    // and adjusted CPU load in MHz normalized for CPU clock frequency
    std::string jsonWallStr = "      \"wall_clock_time\":[";
    std::string jsonLoadNsStr = "      \"raw_cpu_load\":[";
    Json::Value jsonWall(Json::arrayValue);
    Json::Value jsonLoadNs(Json::arrayValue);
    // loop over all the samples
    for (uint32_t j = 0; j < n; ++j) {
        size_t i = oldestClosed++ & (mSamplingN - 1);
        uint32_t wallNs = mMonotonicNs[i];
        if (j != 0) {
            jsonWallStr += ',';
            jsonLoadNsStr += ',';
        }
        /* jsonObject["wall"].append(wallNs); */
        jsonWallStr += std::to_string(wallNs);
        jsonWall.append(wallNs);
        uint32_t sampleLoadNs = mLoadNs[i];
        jsonLoadNsStr += std::to_string(sampleLoadNs);
        jsonLoadNs.append(sampleLoadNs);
    }
    jsonWallStr += ']';
    jsonLoadNsStr += ']';
    if (n) {
        jsonStr += jsonWallStr + ",\n" + jsonLoadNsStr + "\n";
        root["wall_clock_time_ns"] = jsonWall;
        root["raw_cpu_load_ns"] = jsonLoadNs;
        root["status"] = "ok";
    } else {
        //dprintf(fd, "  No FastMixer statistics available currently\n");
        root["status"] = "unavailable";
    }
#endif
    jsonStr += "    }";
    return jsonStr;
    return root;
}

}   // android
Loading