Merge "qcom/audio/hal: add offset to MMAP output time"
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index f8bf0c9..2807bcc 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -3789,6 +3789,17 @@
     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)
@@ -3866,6 +3877,8 @@
         goto exit;
     }
 
+    out->mmap_time_offset_nanos = get_mmap_out_time_offset();
+
     out->standby = false;
     ret = 0;
 
@@ -3909,7 +3922,9 @@
         ALOGE("%s: %s", __func__, pcm_get_error(out->pcm));
         goto exit;
     }
-    position->time_nanoseconds = audio_utils_ns_from_timespec(&ts);
+    position->time_nanoseconds = audio_utils_ns_from_timespec(&ts)
+            + out->mmap_time_offset_nanos;
+
 exit:
     pthread_mutex_unlock(&out->lock);
     return ret;
diff --git a/hal/audio_hw.h b/hal/audio_hw.h
index 7bca070..0992650 100644
--- a/hal/audio_hw.h
+++ b/hal/audio_hw.h
@@ -232,6 +232,7 @@
     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;
 
     int non_blocking;