From 734d186db7ec3d1f877001d71c71de6562ead7f7 Mon Sep 17 00:00:00 2001 From: Ray Essick Date: Tue, 9 Jan 2018 10:42:14 -0800 Subject: [PATCH] Metrics for AudioRecord Collect media metrics for audiorecord. Basic framework and initial set of metrics. Bug: 70569777 Test: recordings, observe stats Change-Id: I66fce1eec46cc13a93b106c2be34d23c138920de --- media/libaudioclient/AudioRecord.cpp | 32 +++++++++++++++++++ .../include/media/AudioRecord.h | 19 +++++++++++ 2 files changed, 51 insertions(+) diff --git a/media/libaudioclient/AudioRecord.cpp b/media/libaudioclient/AudioRecord.cpp index 0d4b4623a7..bc294c590c 100644 --- a/media/libaudioclient/AudioRecord.cpp +++ b/media/libaudioclient/AudioRecord.cpp @@ -26,6 +26,8 @@ #include #include #include +#include +#include #define WAIT_PERIOD_MS 10 @@ -65,6 +67,34 @@ status_t AudioRecord::getMinFrameCount( // --------------------------------------------------------------------------- +static std::string audioFormatTypeString(audio_format_t value) { + std::string formatType; + if (FormatConverter::toString(value, formatType)) { + return formatType; + } + char rawbuffer[16]; // room for "%d" + snprintf(rawbuffer, sizeof(rawbuffer), "%d", value); + return rawbuffer; +} + +void AudioRecord::MediaMetrics::gather(const AudioRecord *record) +{ + // key for media statistics is defined in the header + // attrs for media statistics + static constexpr char kAudioRecordChannelCount[] = "android.media.audiorecord.channels"; + static constexpr char kAudioRecordFormat[] = "android.media.audiorecord.format"; + static constexpr char kAudioRecordLatency[] = "android.media.audiorecord.latency"; + static constexpr char kAudioRecordSampleRate[] = "android.media.audiorecord.samplerate"; + + // constructor guarantees mAnalyticsItem is valid + + mAnalyticsItem->setInt32(kAudioRecordLatency, record->mLatency); + mAnalyticsItem->setInt32(kAudioRecordSampleRate, record->mSampleRate); + mAnalyticsItem->setInt32(kAudioRecordChannelCount, record->mChannelCount); + mAnalyticsItem->setCString(kAudioRecordFormat, + audioFormatTypeString(record->mFormat).c_str()); +} + AudioRecord::AudioRecord(const String16 &opPackageName) : mActive(false), mStatus(NO_INIT), mOpPackageName(opPackageName), mSessionId(AUDIO_SESSION_ALLOCATE), @@ -105,6 +135,8 @@ AudioRecord::AudioRecord( AudioRecord::~AudioRecord() { + mMediaMetrics.gather(this); + if (mStatus == NO_ERROR) { // Make sure that callback function exits in the case where // it is looping on buffer empty condition in obtainBuffer(). diff --git a/media/libaudioclient/include/media/AudioRecord.h b/media/libaudioclient/include/media/AudioRecord.h index 074e5470dd..fea973ab36 100644 --- a/media/libaudioclient/include/media/AudioRecord.h +++ b/media/libaudioclient/include/media/AudioRecord.h @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -688,6 +689,24 @@ private: // activity and connected devices wp mDeviceCallback; +private: + class MediaMetrics { + public: + MediaMetrics() : mAnalyticsItem(new MediaAnalyticsItem("audiorecord")) { + } + ~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 AudioRecord *record); + private: + std::unique_ptr mAnalyticsItem; + }; + MediaMetrics mMediaMetrics; }; }; // namespace android