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

Commit 64e16a7c authored by Phil Burk's avatar Phil Burk
Browse files

audioflinger: fix FIXME in logBufferSizeUnderruns

Some debug code was accidentally merged.
The hang was caused by a recursive lock of mLock.
The code now calls lockfree methods.
Added events for RELEASE and SETBUFFERSIZE.

Bug: 157916126
Test: adb logcat | grep logBufferSize
Test: launch OboeTester
Test: disable MMAP checkbox
Test: Tap OPEN and START
Test: move bufferSize fader
Test: expect to see no spam from logBufferSizeInFrames()
Test: adb shell dumpsys media.metrics
Test: expect to see entries like "(bufferSizeFrames=118, underrun=1)"
Change-Id: I7d782ccea2c2470bc18a3a61cfb8767430a441d8
parent 72c3e0bb
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -288,7 +288,7 @@ aaudio_result_t AudioStreamInternal::release_l() {
            requestStop();
        }

        logBufferState();
        logReleaseBufferState();

        setState(AAUDIO_STREAM_STATE_CLOSING);
        aaudio_handle_t serviceStreamHandle = mServiceStreamHandle;
@@ -783,6 +783,14 @@ aaudio_result_t AudioStreamInternal::setBufferSize(int32_t requestedFrames) {
        adjustedFrames = std::min(actualFrames, adjustedFrames);
    }

    if (adjustedFrames != mBufferSizeInFrames) {
        android::mediametrics::LogItem(mMetricsId)
                .set(AMEDIAMETRICS_PROP_EVENT, AMEDIAMETRICS_PROP_EVENT_VALUE_SETBUFFERSIZE)
                .set(AMEDIAMETRICS_PROP_BUFFERSIZEFRAMES, adjustedFrames)
                .set(AMEDIAMETRICS_PROP_UNDERRUN, (int32_t) getXRunCount())
                .record();
    }

    mBufferSizeInFrames = adjustedFrames;
    ALOGV("%s(%d) returns %d", __func__, requestedFrames, adjustedFrames);
    return (aaudio_result_t) adjustedFrames;
+2 −1
Original line number Diff line number Diff line
@@ -116,9 +116,10 @@ void AudioStream::logOpen() {
    }
}

void AudioStream::logBufferState() {
void AudioStream::logReleaseBufferState() {
    if (mMetricsId.size() > 0) {
        android::mediametrics::LogItem(mMetricsId)
                .set(AMEDIAMETRICS_PROP_EVENT, AMEDIAMETRICS_PROP_EVENT_VALUE_RELEASE)
                .set(AMEDIAMETRICS_PROP_BUFFERSIZEFRAMES, (int32_t) getBufferSize())
                .set(AMEDIAMETRICS_PROP_UNDERRUN, (int32_t) getXRunCount())
                .record();
+1 −1
Original line number Diff line number Diff line
@@ -115,7 +115,7 @@ public:

    // log to MediaMetrics
    virtual void logOpen();
    void logBufferState();
    void logReleaseBufferState();

    /**
     * Free any hardware or system resources from the open() call.
+1 −1
Original line number Diff line number Diff line
@@ -292,7 +292,7 @@ aaudio_result_t AudioStreamRecord::release_l() {
    //  Then call it from here
    if (getState() != AAUDIO_STREAM_STATE_CLOSING) {
        mAudioRecord->removeAudioDeviceCallback(mDeviceCallback);
        logBufferState();
        logReleaseBufferState();
        mAudioRecord.clear();
        mFixedBlockWriter.close();
        return AudioStream::release_l();
+1 −1
Original line number Diff line number Diff line
@@ -254,7 +254,7 @@ aaudio_result_t AudioStreamTrack::open(const AudioStreamBuilder& builder)
aaudio_result_t AudioStreamTrack::release_l() {
    if (getState() != AAUDIO_STREAM_STATE_CLOSING) {
        mAudioTrack->removeAudioDeviceCallback(mDeviceCallback);
        logBufferState();
        logReleaseBufferState();
        // TODO Investigate why clear() causes a hang in test_various.cpp
        // if I call close() from a data callback.
        // But the same thing in AudioRecord is OK!
Loading