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

Commit 298c052f authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "aaudio: add MediaMetrics for MMAP streams" into rvc-dev am: cc40c5fa...

Merge "aaudio: add MediaMetrics for MMAP streams" into rvc-dev am: cc40c5fa am: 424369b7 am: 070d9477

Change-Id: I363dcaa3103bddad7da8c80345ac7d97aab4b387
parents eae74bbf 070d9477
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -35,6 +35,9 @@ cc_library {
        "libaaudio_internal",
        "libaudioclient",
        "libaudioutils",
        "libmedia_helper",
        "libmediametrics",
        "libmediautils",
        "liblog",
        "libcutils",
        "libutils",
@@ -75,6 +78,9 @@ cc_library {
    shared_libs: [
        "libaudioclient",
        "libaudioutils",
        "libmedia_helper",
        "libmediametrics",
        "libmediautils",
        "liblog",
        "libcutils",
        "libutils",
+19 −3
Original line number Diff line number Diff line
@@ -14,9 +14,7 @@
 * limitations under the License.
 */

// This file is used in both client and server processes.
// This is needed to make sense of the logs more easily.
#define LOG_TAG (mInService ? "AudioStreamInternal_Service" : "AudioStreamInternal_Client")
#define LOG_TAG "AudioStreamInternal"
//#define LOG_NDEBUG 0
#include <utils/Log.h>

@@ -28,6 +26,8 @@

#include <aaudio/AAudio.h>
#include <cutils/properties.h>

#include <media/MediaMetricsItem.h>
#include <utils/String16.h>
#include <utils/Trace.h>

@@ -36,12 +36,20 @@
#include "binding/AAudioStreamConfiguration.h"
#include "binding/IAAudioService.h"
#include "binding/AAudioServiceMessage.h"
#include "core/AudioGlobal.h"
#include "core/AudioStreamBuilder.h"
#include "fifo/FifoBuffer.h"
#include "utility/AudioClock.h"

#include "AudioStreamInternal.h"

// We do this after the #includes because if a header uses ALOG.
// it would fail on the reference to mInService.
#undef LOG_TAG
// This file is used in both client and server processes.
// This is needed to make sense of the logs more easily.
#define LOG_TAG (mInService ? "AudioStreamInternal_Service" : "AudioStreamInternal_Client")

using android::String16;
using android::Mutex;
using android::WrappingBuffer;
@@ -137,6 +145,11 @@ aaudio_result_t AudioStreamInternal::open(const AudioStreamBuilder &builder) {
        return mServiceStreamHandle;
    }

    // This must match the key generated in oboeservice/AAudioServiceStreamBase.cpp
    // so the client can have permission to log.
    mMetricsId = std::string(AMEDIAMETRICS_KEY_PREFIX_AUDIO_STREAM)
            + std::to_string(mServiceStreamHandle);

    result = configurationOutput.validate();
    if (result != AAUDIO_OK) {
        goto error;
@@ -274,6 +287,9 @@ aaudio_result_t AudioStreamInternal::release_l() {
        if (isActive() || currentState == AAUDIO_STREAM_STATE_DISCONNECTED) {
            requestStop();
        }

        logBufferState();

        setState(AAUDIO_STREAM_STATE_CLOSING);
        aaudio_handle_t serviceStreamHandle = mServiceStreamHandle;
        mServiceStreamHandle = AAUDIO_HANDLE_INVALID;
+37 −2
Original line number Diff line number Diff line
@@ -71,7 +71,42 @@ const char* AudioGlobal_convertResultToText(aaudio_result_t returnCode) {
        AAUDIO_CASE_ENUM(AAUDIO_ERROR_NO_SERVICE);
        AAUDIO_CASE_ENUM(AAUDIO_ERROR_INVALID_RATE);
    }
    return "Unrecognized AAudio error.";
    return "Unrecognized";
}

const char* AudioGlobal_convertFormatToText(aaudio_format_t format) {
      switch (format) {
        AAUDIO_CASE_ENUM(AAUDIO_FORMAT_UNSPECIFIED);
        AAUDIO_CASE_ENUM(AAUDIO_FORMAT_INVALID);
        AAUDIO_CASE_ENUM(AAUDIO_FORMAT_PCM_I16);
        AAUDIO_CASE_ENUM(AAUDIO_FORMAT_PCM_FLOAT);
    }
    return "Unrecognized";
}

const char* AudioGlobal_convertDirectionToText(aaudio_direction_t direction) {
      switch (direction) {
        AAUDIO_CASE_ENUM(AAUDIO_DIRECTION_INPUT);
        AAUDIO_CASE_ENUM(AAUDIO_DIRECTION_OUTPUT);
    }
    return "Unrecognized";
}

const char* AudioGlobal_convertPerformanceModeToText(aaudio_performance_mode_t mode) {
      switch (mode) {
        AAUDIO_CASE_ENUM(AAUDIO_PERFORMANCE_MODE_POWER_SAVING);
        AAUDIO_CASE_ENUM(AAUDIO_PERFORMANCE_MODE_NONE);
        AAUDIO_CASE_ENUM(AAUDIO_PERFORMANCE_MODE_LOW_LATENCY);
    }
    return "Unrecognized";
}

const char* AudioGlobal_convertSharingModeToText(aaudio_sharing_mode_t mode) {
      switch (mode) {
        AAUDIO_CASE_ENUM(AAUDIO_SHARING_MODE_SHARED);
        AAUDIO_CASE_ENUM(AAUDIO_SHARING_MODE_EXCLUSIVE);
    }
    return "Unrecognized";
}

const char* AudioGlobal_convertStreamStateToText(aaudio_stream_state_t state) {
@@ -91,7 +126,7 @@ const char* AudioGlobal_convertStreamStateToText(aaudio_stream_state_t state) {
        AAUDIO_CASE_ENUM(AAUDIO_STREAM_STATE_CLOSED);
        AAUDIO_CASE_ENUM(AAUDIO_STREAM_STATE_DISCONNECTED);
    }
    return "Unrecognized AAudio state.";
    return "Unrecognized";
}

#undef AAUDIO_CASE_ENUM
+4 −1
Original line number Diff line number Diff line
@@ -25,9 +25,12 @@ namespace aaudio {
aaudio_policy_t AudioGlobal_getMMapPolicy();
aaudio_result_t AudioGlobal_setMMapPolicy(aaudio_policy_t policy);

const char* AudioGlobal_convertFormatToText(aaudio_format_t format);
const char* AudioGlobal_convertDirectionToText(aaudio_direction_t direction);
const char* AudioGlobal_convertPerformanceModeToText(aaudio_performance_mode_t mode);
const char* AudioGlobal_convertResultToText(aaudio_result_t returnCode);
const char* AudioGlobal_convertSharingModeToText(aaudio_sharing_mode_t mode);
const char* AudioGlobal_convertStreamStateToText(aaudio_stream_state_t state);

}

#endif  // AAUDIO_AUDIOGLOBAL_H
+28 −1
Original line number Diff line number Diff line
@@ -20,6 +20,9 @@

#include <atomic>
#include <stdint.h>

#include <media/MediaMetricsItem.h>

#include <aaudio/AAudio.h>

#include "AudioStreamBuilder.h"
@@ -29,7 +32,6 @@

namespace aaudio {


// Sequential number assigned to streams solely for debugging purposes.
static aaudio_stream_id_t AAudio_getNextStreamId() {
    static std::atomic <aaudio_stream_id_t> nextStreamId{1};
@@ -103,6 +105,24 @@ aaudio_result_t AudioStream::open(const AudioStreamBuilder& builder)
    return AAUDIO_OK;
}

void AudioStream::logOpen() {
    LOG_ALWAYS_FATAL_IF(mMetricsId.size() == 0, "mMetricsId is empty!");
    android::mediametrics::LogItem(mMetricsId)
            .set(AMEDIAMETRICS_PROP_PERFORMANCEMODE,
                    AudioGlobal_convertPerformanceModeToText(getPerformanceMode()))
            .set(AMEDIAMETRICS_PROP_SHARINGMODE,
                    AudioGlobal_convertSharingModeToText(getSharingMode()))
            .record();
}

void AudioStream::logBufferState() {
    LOG_ALWAYS_FATAL_IF(mMetricsId.size() == 0, "mMetricsId is empty!");
    android::mediametrics::LogItem(mMetricsId)
            .set(AMEDIAMETRICS_PROP_BUFFERSIZEFRAMES, (int32_t) getBufferSize())
            .set(AMEDIAMETRICS_PROP_UNDERRUN, (int32_t) getXRunCount())
            .record();
}

aaudio_result_t AudioStream::systemStart() {
    std::lock_guard<std::mutex> lock(mStreamLock);

@@ -291,6 +311,13 @@ aaudio_result_t AudioStream::safeRelease() {

void AudioStream::setState(aaudio_stream_state_t state) {
    ALOGD("%s(s#%d) from %d to %d", __func__, getId(), mState, state);
    // Track transition to DISCONNECTED state.
    if (state == AAUDIO_STREAM_STATE_DISCONNECTED && mState != state) {
        android::mediametrics::LogItem(mMetricsId)
                .set(AMEDIAMETRICS_PROP_EVENT, AMEDIAMETRICS_PROP_EVENT_VALUE_DISCONNECT)
                .set(AMEDIAMETRICS_PROP_STATE, AudioGlobal_convertStreamStateToText(getState()))
                .record();
    }
    // CLOSED is a final state
    if (mState == AAUDIO_STREAM_STATE_CLOSED) {
        ALOGE("%s(%d) tried to set to %d but already CLOSED", __func__, getId(), state);
Loading