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

Commit d6c8f4f3 authored by Andy Hung's avatar Andy Hung Committed by Automerger Merge Worker
Browse files

MediaMetrics: Implement AudioTrack status logging am: b64ea8e9

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/av/+/16483861

Change-Id: Ia785da01fb588fff1db1256e0c1cd19ad7c47214
parents b0cc02fe b64ea8e9
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -974,6 +974,7 @@ status_t AudioRecord::createRecord_l(const Modulo<uint32_t> &epoch)
        .set(AMEDIAMETRICS_PROP_SAMPLERATE, (int32_t)mSampleRate)
        // the following are NOT immutable
        .set(AMEDIAMETRICS_PROP_STATE, stateToString(mActive))
        .set(AMEDIAMETRICS_PROP_STATUS, (int32_t)status)
        .set(AMEDIAMETRICS_PROP_SELECTEDMICDIRECTION, (int32_t)mSelectedMicDirection)
        .set(AMEDIAMETRICS_PROP_SELECTEDMICFIELDDIRECTION, (double)mSelectedMicFieldDimension)
        .record();
+3 −2
Original line number Diff line number Diff line
@@ -1976,6 +1976,7 @@ status_t AudioTrack::createTrack_l()
        .set(AMEDIAMETRICS_PROP_VOLUME_LEFT, (double)mVolume[AUDIO_INTERLEAVE_LEFT])
        .set(AMEDIAMETRICS_PROP_VOLUME_RIGHT, (double)mVolume[AUDIO_INTERLEAVE_RIGHT])
        .set(AMEDIAMETRICS_PROP_STATE, stateToString(mState))
        .set(AMEDIAMETRICS_PROP_STATUS, (int32_t)NO_ERROR)
        .set(AMEDIAMETRICS_PROP_AUXEFFECTID, (int32_t)mAuxEffectId)
        .set(AMEDIAMETRICS_PROP_SAMPLERATE, (int32_t)mSampleRate)
        .set(AMEDIAMETRICS_PROP_PLAYBACK_SPEED, (double)mPlaybackRate.mSpeed)
@@ -2018,8 +2019,8 @@ void AudioTrack::reportError(status_t status, const char *event, const char *mes
    // Ensure these variables are initialized in set().
    mediametrics::LogItem(AMEDIAMETRICS_KEY_AUDIO_TRACK_ERROR)
        .set(AMEDIAMETRICS_PROP_EVENT, event)
        .set(AMEDIAMETRICS_PROP_ERROR, mediametrics::statusToErrorString(status))
        .set(AMEDIAMETRICS_PROP_ERRORMESSAGE, message)
        .set(AMEDIAMETRICS_PROP_STATUS, (int32_t)status)
        .set(AMEDIAMETRICS_PROP_STATUSMESSAGE, message)
        .set(AMEDIAMETRICS_PROP_ORIGINALFLAGS, toString(mOrigFlags).c_str())
        .set(AMEDIAMETRICS_PROP_SESSIONID, (int32_t)mSessionId)
        .set(AMEDIAMETRICS_PROP_CONTENTTYPE, toString(mAttributes.content_type).c_str())
+9 −9
Original line number Diff line number Diff line
@@ -57,19 +57,19 @@ static const std::unordered_map<std::string, int32_t>& getErrorStringMap() {
    // This may be found in frameworks/av/media/libmediametrics/include/MediaMetricsConstants.h
    static std::unordered_map<std::string, int32_t> map{
        {"",                                      NO_ERROR},
        {AMEDIAMETRICS_PROP_ERROR_VALUE_OK,       NO_ERROR},
        {AMEDIAMETRICS_PROP_ERROR_VALUE_ARGUMENT, BAD_VALUE},
        {AMEDIAMETRICS_PROP_ERROR_VALUE_IO,       DEAD_OBJECT},
        {AMEDIAMETRICS_PROP_ERROR_VALUE_MEMORY,   NO_MEMORY},
        {AMEDIAMETRICS_PROP_ERROR_VALUE_SECURITY, PERMISSION_DENIED},
        {AMEDIAMETRICS_PROP_ERROR_VALUE_STATE,    INVALID_OPERATION},
        {AMEDIAMETRICS_PROP_ERROR_VALUE_TIMEOUT,  WOULD_BLOCK},
        {AMEDIAMETRICS_PROP_ERROR_VALUE_UNKNOWN,  UNKNOWN_ERROR},
        {AMEDIAMETRICS_PROP_STATUS_VALUE_OK,       NO_ERROR},
        {AMEDIAMETRICS_PROP_STATUS_VALUE_ARGUMENT, BAD_VALUE},
        {AMEDIAMETRICS_PROP_STATUS_VALUE_IO,       DEAD_OBJECT},
        {AMEDIAMETRICS_PROP_STATUS_VALUE_MEMORY,   NO_MEMORY},
        {AMEDIAMETRICS_PROP_STATUS_VALUE_SECURITY, PERMISSION_DENIED},
        {AMEDIAMETRICS_PROP_STATUS_VALUE_STATE,    INVALID_OPERATION},
        {AMEDIAMETRICS_PROP_STATUS_VALUE_TIMEOUT,  WOULD_BLOCK},
        {AMEDIAMETRICS_PROP_STATUS_VALUE_UNKNOWN,  UNKNOWN_ERROR},
    };
    return map;
}

status_t errorStringToStatus(const char *error) {
status_t statusStringToStatus(const char *error) {
    const auto& map = getErrorStringMap();
    if (error == nullptr || error[0] == '\0') return NO_ERROR;
    auto it = map.find(error);
+34 −21
Original line number Diff line number Diff line
@@ -119,18 +119,6 @@
#define AMEDIAMETRICS_PROP_DURATIONNS     "durationNs"     // int64 duration time span
#define AMEDIAMETRICS_PROP_ENCODING       "encoding"       // string value of format

// Error statistics
#define AMEDIAMETRICS_PROP_ERROR          "error#"         // string, empty or one of
                                                           // AMEDIAMETRICS_PROP_ERROR_VALUE_*
                                                           // Used for error categorization.
#define AMEDIAMETRICS_PROP_ERRORSUBCODE   "errorSubCode#"  // int32, specific code for error
                                                           // used in conjunction with error#.
#define AMEDIAMETRICS_PROP_ERRORMESSAGE   "errorMessage#"  // string, supplemental to error.
                                                           // Arbitrary information treated as
                                                           // informational, may be logcat msg,
                                                           // or an exception with stack trace.
                                                           // Treated as "debug" information.

#define AMEDIAMETRICS_PROP_EVENT          "event#"         // string value (often func name)
#define AMEDIAMETRICS_PROP_EXECUTIONTIMENS "executionTimeNs"  // time to execute the event

@@ -162,7 +150,17 @@
#define AMEDIAMETRICS_PROP_STARTUPMS      "startupMs"      // double value
// State is "ACTIVE" or "STOPPED" for AudioRecord
#define AMEDIAMETRICS_PROP_STATE          "state"          // string
#define AMEDIAMETRICS_PROP_STATUS         "status"         // int32 status_t
#define AMEDIAMETRICS_PROP_STATUS         "status#"        // int32 status_t
                                                           // AAudio uses their own status codes
// Supplemental information to the status code.
#define AMEDIAMETRICS_PROP_STATUSSUBCODE  "statusSubCode"  // int32, specific code
                                                           // used in conjunction with status.
#define AMEDIAMETRICS_PROP_STATUSMESSAGE  "statusMessage"  // string, supplemental info.
                                                           // Arbitrary information treated as
                                                           // informational, may be logcat msg,
                                                           // or an exception with stack trace.
                                                           // Treated as "debug" information.

#define AMEDIAMETRICS_PROP_STREAMTYPE     "streamType"     // string (AudioTrack)
#define AMEDIAMETRICS_PROP_THREADID       "threadId"       // int32 value io handle
#define AMEDIAMETRICS_PROP_THROTTLEMS     "throttleMs"     // double
@@ -237,17 +235,20 @@
// https://cs.android.com/android/platform/superproject/+/master:frameworks/native/libs/binder/include/binder/Status.h;drc=88e25c0861499ee3ab885814dddc097ab234cb7b;l=57
// https://cs.android.com/android/platform/superproject/+/master:frameworks/base/media/java/android/media/AudioSystem.java;drc=3ac246c43294d7f7012bdcb0ccb7bae1aa695bd4;l=785
// https://cs.android.com/android/platform/superproject/+/master:frameworks/av/media/libaaudio/include/aaudio/AAudio.h;drc=cfd3a6fa3aaaf712a890dc02452b38ef401083b8;l=120
// https://abseil.io/docs/cpp/guides/status-codes

// Status errors:
// An empty status string or "ok" is interpreted as no error.
#define AMEDIAMETRICS_PROP_ERROR_VALUE_OK                 "ok"
#define AMEDIAMETRICS_PROP_STATUS_VALUE_OK                "ok"

// Error category: argument
//   IllegalArgumentException
//   NullPointerException
//   BAD_VALUE
//   absl::INVALID_ARGUMENT
//   absl::OUT_OF_RANGE
//   Out of range, out of bounds.
#define AMEDIAMETRICS_PROP_ERROR_VALUE_ARGUMENT           "argument"
#define AMEDIAMETRICS_PROP_STATUS_VALUE_ARGUMENT          "argument"

// Error category: io
//   IOException
@@ -258,36 +259,48 @@
//   file or ioctl failure
//   Service, rpc, binder, or socket failure.
//   Hardware or device failure.
#define AMEDIAMETRICS_PROP_ERROR_VALUE_IO                 "io"
#define AMEDIAMETRICS_PROP_STATUS_VALUE_IO                "io"

// Error category: outOfMemory
//   OutOfMemoryException
//   NO_MEMORY
#define AMEDIAMETRICS_PROP_ERROR_VALUE_MEMORY             "memory"
//   absl::RESOURCE_EXHAUSTED
#define AMEDIAMETRICS_PROP_STATUS_VALUE_MEMORY            "memory"

// Error category: security
//   SecurityException
//   PERMISSION_DENIED
#define AMEDIAMETRICS_PROP_ERROR_VALUE_SECURITY           "security"
//   absl::PERMISSION_DENIED
//   absl::UNAUTHENTICATED
#define AMEDIAMETRICS_PROP_STATUS_VALUE_SECURITY          "security"

// Error category: state
//   IllegalStateException
//   UnsupportedOperationException
//   INVALID_OPERATION
//   NO_INIT
//   absl::NOT_FOUND
//   absl::ALREADY_EXISTS
//   absl::FAILED_PRECONDITION
//   absl::UNAVAILABLE
//   absl::UNIMPLEMENTED
//   Functionality not implemented (argument may or may not be correct).
//   Call unexpected or out of order.
#define AMEDIAMETRICS_PROP_ERROR_VALUE_STATE              "state"
#define AMEDIAMETRICS_PROP_STATUS_VALUE_STATE             "state"

// Error category: timeout
//   TimeoutException
//   WOULD_BLOCK
#define AMEDIAMETRICS_PROP_ERROR_VALUE_TIMEOUT            "timeout"
//   absl::DEADLINE_EXCEEDED
//   absl::ABORTED
#define AMEDIAMETRICS_PROP_STATUS_VALUE_TIMEOUT           "timeout"

// Error category: unknown
//   Exception (Java specified not listed above, or custom app/service)
//   UNKNOWN_ERROR
//   absl::INTERNAL
//   absl::DATA_LOSS
//   Catch-all bucket for errors not listed above.
#define AMEDIAMETRICS_PROP_ERROR_VALUE_UNKNOWN            "unknown"
#define AMEDIAMETRICS_PROP_STATUS_VALUE_UNKNOWN           "unknown"

#endif // ANDROID_MEDIA_MEDIAMETRICSCONSTANTS_H
+13 −13
Original line number Diff line number Diff line
@@ -106,34 +106,34 @@ enum Type {
};

/*
 * Helper for error conversions
 * Helper for status conversions
 */

static inline constexpr const char* statusToErrorString(status_t status) {
inline constexpr const char* statusToStatusString(status_t status) {
    switch (status) {
    case NO_ERROR:
        return "";
    case BAD_VALUE:
        return AMEDIAMETRICS_PROP_ERROR_VALUE_ARGUMENT;
        return AMEDIAMETRICS_PROP_STATUS_VALUE_ARGUMENT;
    case DEAD_OBJECT:
    case FAILED_TRANSACTION:
        return AMEDIAMETRICS_PROP_ERROR_VALUE_IO;
        return AMEDIAMETRICS_PROP_STATUS_VALUE_IO;
    case NO_MEMORY:
        return AMEDIAMETRICS_PROP_ERROR_VALUE_MEMORY;
        return AMEDIAMETRICS_PROP_STATUS_VALUE_MEMORY;
    case PERMISSION_DENIED:
        return AMEDIAMETRICS_PROP_ERROR_VALUE_SECURITY;
        return AMEDIAMETRICS_PROP_STATUS_VALUE_SECURITY;
    case NO_INIT:
    case INVALID_OPERATION:
        return AMEDIAMETRICS_PROP_ERROR_VALUE_STATE;
        return AMEDIAMETRICS_PROP_STATUS_VALUE_STATE;
    case WOULD_BLOCK:
        return AMEDIAMETRICS_PROP_ERROR_VALUE_TIMEOUT;
    case UNKNOWN_ERROR:
        return AMEDIAMETRICS_PROP_STATUS_VALUE_TIMEOUT;
    default:
        return AMEDIAMETRICS_PROP_ERROR_VALUE_UNKNOWN;
        if (status >= 0) return AMEDIAMETRICS_PROP_STATUS_VALUE_OK; // non-negative values "OK"
        [[fallthrough]];            // negative values are error.
    case UNKNOWN_ERROR:
        return AMEDIAMETRICS_PROP_STATUS_VALUE_UNKNOWN;
    }
}

status_t errorStringToStatus(const char *error);
status_t statusStringToStatus(const char *error);

/*
 * Time printing
Loading