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

Commit ed30470c authored by Ray Essick's avatar Ray Essick
Browse files

collect media.metrics from audiotrack

initial pass at collecting metrics information from audiotrack.

Bug: 70569777
Test: manual via dumpsys media.metrics
Change-Id: Ia6ed6d93bd487e4323b86dd4ffabae232f79f94b
parent 21f6d6cb
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -47,6 +47,9 @@ cc_library_shared {
        "libdl",
        "libaudioutils",
        "libaudiomanager",
        "libmedia_helper",
        "libmediametrics",
        "libstagefright_foundation",
    ],
    export_shared_lib_headers: ["libbinder"],

+64 −0
Original line number Diff line number Diff line
@@ -31,6 +31,8 @@
#include <media/IAudioFlinger.h>
#include <media/AudioPolicyHelper.h>
#include <media/AudioResamplerPublic.h>
#include <media/MediaAnalyticsItem.h>
#include <media/TypeConverter.h>

#define WAIT_PERIOD_MS                  10
#define WAIT_STREAM_END_TIMEOUT_SEC     120
@@ -157,6 +159,65 @@ status_t AudioTrack::getMinFrameCount(

// ---------------------------------------------------------------------------

static std::string audioContentTypeString(audio_content_type_t value) {
    std::string contentType;
    if (AudioContentTypeConverter::toString(value, contentType)) {
        return contentType;
    }
    char rawbuffer[16];  // room for "%d"
    snprintf(rawbuffer, sizeof(rawbuffer), "%d", value);
    return rawbuffer;
}

static std::string audioUsageString(audio_usage_t value) {
    std::string usage;
    if (UsageTypeConverter::toString(value, usage)) {
        return usage;
    }
    char rawbuffer[16];  // room for "%d"
    snprintf(rawbuffer, sizeof(rawbuffer), "%d", value);
    return rawbuffer;
}

void AudioTrack::MediaMetrics::gather(const AudioTrack *track)
{

    // key for media statistics is defined in the header
    // attrs for media statistics
    static constexpr char kAudioTrackStreamType[] = "android.media.audiotrack.streamtype";
    static constexpr char kAudioTrackContentType[] = "android.media.audiotrack.type";
    static constexpr char kAudioTrackUsage[] = "android.media.audiotrack.usage";
    static constexpr char kAudioTrackSampleRate[] = "android.media.audiotrack.samplerate";
    static constexpr char kAudioTrackChannelMask[] = "android.media.audiotrack.channelmask";
    static constexpr char kAudioTrackUnderrunFrames[] = "android.media.audiotrack.underrunframes";
    static constexpr char kAudioTrackStartupGlitch[] = "android.media.audiotrack.glitch.startup";

    // constructor guarantees mAnalyticsItem is valid

    // must gather underrun info before cleaning mProxy information.
    const int32_t underrunFrames = track->getUnderrunFrames();
    if (underrunFrames != 0) {
        mAnalyticsItem->setInt32(kAudioTrackUnderrunFrames, underrunFrames);
    }

    if (track->mTimestampStartupGlitchReported) {
        mAnalyticsItem->setInt32(kAudioTrackStartupGlitch, 1);
    }

    if (track->mStreamType != -1) {
        // deprecated, but this will tell us who still uses it.
        mAnalyticsItem->setInt32(kAudioTrackStreamType, track->mStreamType);
    }
    // XXX: consider including from mAttributes: source type
    mAnalyticsItem->setCString(kAudioTrackContentType,
                               audioContentTypeString(track->mAttributes.content_type).c_str());
    mAnalyticsItem->setCString(kAudioTrackUsage,
                               audioUsageString(track->mAttributes.usage).c_str());
    mAnalyticsItem->setInt32(kAudioTrackSampleRate, track->mSampleRate);
    mAnalyticsItem->setInt64(kAudioTrackChannelMask, track->mChannelMask);
}


AudioTrack::AudioTrack()
    : mStatus(NO_INIT),
      mState(STATE_STOPPED),
@@ -236,6 +297,9 @@ AudioTrack::AudioTrack(

AudioTrack::~AudioTrack()
{
    // pull together the numbers, before we clean up our structures
    mMediaMetrics.gather(this);

    if (mStatus == NO_ERROR) {
        // Make sure that callback function exits in the case where
        // it is looping on buffer full condition in obtainBuffer().
+20 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
#include <media/AudioTimestamp.h>
#include <media/IAudioTrack.h>
#include <media/AudioResamplerPublic.h>
#include <media/MediaAnalyticsItem.h>
#include <media/Modulo.h>
#include <utils/threads.h>

@@ -1182,6 +1183,25 @@ private:
    pid_t                   mClientPid;

    wp<AudioSystem::AudioDeviceCallback> mDeviceCallback;

private:
    class MediaMetrics {
      public:
        MediaMetrics() : mAnalyticsItem(new MediaAnalyticsItem("audiotrack")) {
        }
        ~MediaMetrics() {
            // mAnalyticsItem alloc failure will be flagged in the constructor
            // don't log empty records
            if (mAnalyticsItem->count() > 0) {
                mAnalyticsItem->setFinalized(true);
                mAnalyticsItem->selfrecord();
            }
        }
        void gather(const AudioTrack *track);
      private:
        std::unique_ptr<MediaAnalyticsItem> mAnalyticsItem;
    };
    MediaMetrics mMediaMetrics;
};

}; // namespace android
+10 −0
Original line number Diff line number Diff line
@@ -277,6 +277,16 @@ const AudioModeConverter::Table AudioModeConverter::mTable[] = {
    TERMINATOR
};

template<>
const AudioContentTypeConverter::Table AudioContentTypeConverter::mTable[] = {
    MAKE_STRING_FROM_ENUM(AUDIO_CONTENT_TYPE_UNKNOWN),
    MAKE_STRING_FROM_ENUM(AUDIO_CONTENT_TYPE_SPEECH),
    MAKE_STRING_FROM_ENUM(AUDIO_CONTENT_TYPE_MUSIC),
    MAKE_STRING_FROM_ENUM(AUDIO_CONTENT_TYPE_MOVIE),
    MAKE_STRING_FROM_ENUM(AUDIO_CONTENT_TYPE_SONIFICATION),
    TERMINATOR
};

template <>
const UsageTypeConverter::Table UsageTypeConverter::mTable[] = {
    MAKE_STRING_FROM_ENUM(AUDIO_USAGE_UNKNOWN),
+7 −0
Original line number Diff line number Diff line
@@ -80,6 +80,11 @@ struct AudioModeTraits
    typedef audio_mode_t Type;
    typedef Vector<Type> Collection;
};
struct AudioContentTraits
{
    typedef audio_content_type_t Type;
    typedef Vector<Type> Collection;
};
struct UsageTraits
{
    typedef audio_usage_t Type;
@@ -226,6 +231,7 @@ typedef TypeConverter<ChannelIndexTraits> ChannelIndexConverter;
typedef TypeConverter<GainModeTraits> GainModeConverter;
typedef TypeConverter<StreamTraits> StreamTypeConverter;
typedef TypeConverter<AudioModeTraits> AudioModeConverter;
typedef TypeConverter<AudioContentTraits> AudioContentTypeConverter;
typedef TypeConverter<UsageTraits> UsageTypeConverter;
typedef TypeConverter<SourceTraits> SourceTypeConverter;

@@ -240,6 +246,7 @@ template<> const ChannelIndexConverter::Table ChannelIndexConverter::mTable[];
template<> const GainModeConverter::Table GainModeConverter::mTable[];
template<> const StreamTypeConverter::Table StreamTypeConverter::mTable[];
template<> const AudioModeConverter::Table AudioModeConverter::mTable[];
template<> const AudioContentTypeConverter::Table AudioContentTypeConverter::mTable[];
template<> const UsageTypeConverter::Table UsageTypeConverter::mTable[];
template<> const SourceTypeConverter::Table SourceTypeConverter::mTable[];