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

Commit 66d3fc1f authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "collect media.metrics from audiotrack"

parents e56fc185 ed30470c
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[];