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

Commit fe17efd5 authored by Phil Burk's avatar Phil Burk Committed by Gerrit - the friendly Code Review server
Browse files

qcom/audio/hal: add offset to MMAP output time

Try to fix glitches on AAudio MMAP output on some devices.
The DSP is returning a position/time pair that is too soon.

Bug: 122680738
Test: Should see glitch.count = 0 when you run this test.
Test: adb shell aaudio_loopback -tm -b999 -s20 -x -X

Change-Id: I7bc9924a7aaa34d2e721365aa8ee0b69de5936f8
(cherry picked from commit 51e6bc44)
parent 198adc00
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
@@ -5708,6 +5708,17 @@ static void adjust_mmap_period_count(struct pcm_config *config, int32_t min_size
    ALOGV("%s requested config.period_count = %d", __func__, config->period_count);
}

// Read offset for the positional timestamp from a persistent vendor property.
// This is to workaround apparent inaccuracies in the timing information that
// is used by the AAudio timing model. The inaccuracies can cause glitches.
static int64_t get_mmap_out_time_offset() {
    const int32_t kDefaultOffsetMicros = 0;
    int32_t mmap_time_offset_micros = property_get_int32(
        "persist.audio.out_mmap_delay_micros", kDefaultOffsetMicros);
    ALOGI("mmap_time_offset_micros = %d for output", mmap_time_offset_micros);
    return mmap_time_offset_micros * (int64_t)1000;
}

static int out_create_mmap_buffer(const struct audio_stream_out *stream,
                                  int32_t min_size_frames,
                                  struct audio_mmap_buffer_info *info)
@@ -5800,6 +5811,8 @@ static int out_create_mmap_buffer(const struct audio_stream_out *stream,
        goto exit;
    }

    out->mmap_time_offset_nanos = get_mmap_out_time_offset();

    out->standby = false;
    ret = 0;

@@ -5843,7 +5856,8 @@ static int out_get_mmap_position(const struct audio_stream_out *stream,
        ALOGE("%s: %s", __func__, pcm_get_error(out->pcm));
        return ret;
    }
    position->time_nanoseconds = ts.tv_sec*1000000000LL + ts.tv_nsec;
    position->time_nanoseconds = ts.tv_sec*1000000000LL + ts.tv_nsec
            + out->mmap_time_offset_nanos;
    return 0;
}

+1 −0
Original line number Diff line number Diff line
@@ -317,6 +317,7 @@ struct stream_out {
    uint32_t supported_sample_rates[MAX_SUPPORTED_SAMPLE_RATES+1];
    bool muted;
    uint64_t written; /* total frames written, not cleared when entering standby */
    int64_t mmap_time_offset_nanos; /* fudge factor to correct inaccuracies in DSP */
    audio_io_handle_t handle;
    struct stream_app_type_cfg app_type_cfg;