Loading media/libaaudio/src/Android.bp +6 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,9 @@ cc_library { "libaaudio_internal", "libaudioclient", "libaudioutils", "libmedia_helper", "libmediametrics", "libmediautils", "liblog", "libcutils", "libutils", Loading Loading @@ -75,6 +78,9 @@ cc_library { shared_libs: [ "libaudioclient", "libaudioutils", "libmedia_helper", "libmediametrics", "libmediautils", "liblog", "libcutils", "libutils", Loading media/libaaudio/src/client/AudioStreamInternal.cpp +19 −3 Original line number Diff line number Diff line Loading @@ -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> Loading @@ -28,6 +26,8 @@ #include <aaudio/AAudio.h> #include <cutils/properties.h> #include <media/MediaMetricsItem.h> #include <utils/String16.h> #include <utils/Trace.h> Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading media/libaaudio/src/core/AudioGlobal.cpp +37 −2 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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 Loading media/libaaudio/src/core/AudioGlobal.h +4 −1 Original line number Diff line number Diff line Loading @@ -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 Loading media/libaaudio/src/core/AudioStream.cpp +28 −1 Original line number Diff line number Diff line Loading @@ -20,6 +20,9 @@ #include <atomic> #include <stdint.h> #include <media/MediaMetricsItem.h> #include <aaudio/AAudio.h> #include "AudioStreamBuilder.h" Loading @@ -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}; Loading Loading @@ -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); Loading Loading @@ -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 Loading
media/libaaudio/src/Android.bp +6 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,9 @@ cc_library { "libaaudio_internal", "libaudioclient", "libaudioutils", "libmedia_helper", "libmediametrics", "libmediautils", "liblog", "libcutils", "libutils", Loading Loading @@ -75,6 +78,9 @@ cc_library { shared_libs: [ "libaudioclient", "libaudioutils", "libmedia_helper", "libmediametrics", "libmediautils", "liblog", "libcutils", "libutils", Loading
media/libaaudio/src/client/AudioStreamInternal.cpp +19 −3 Original line number Diff line number Diff line Loading @@ -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> Loading @@ -28,6 +26,8 @@ #include <aaudio/AAudio.h> #include <cutils/properties.h> #include <media/MediaMetricsItem.h> #include <utils/String16.h> #include <utils/Trace.h> Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading
media/libaaudio/src/core/AudioGlobal.cpp +37 −2 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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 Loading
media/libaaudio/src/core/AudioGlobal.h +4 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
media/libaaudio/src/core/AudioStream.cpp +28 −1 Original line number Diff line number Diff line Loading @@ -20,6 +20,9 @@ #include <atomic> #include <stdint.h> #include <media/MediaMetricsItem.h> #include <aaudio/AAudio.h> #include "AudioStreamBuilder.h" Loading @@ -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}; Loading Loading @@ -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); Loading Loading @@ -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