Loading hal/audio_hw.c +32 −2 Original line number Diff line number Diff line Loading @@ -3360,6 +3360,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) Loading Loading @@ -3437,6 +3448,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; Loading Loading @@ -3480,7 +3493,9 @@ static int out_get_mmap_position(const struct audio_stream_out *stream, 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; Loading Loading @@ -3994,6 +4009,17 @@ static int in_start(const struct audio_stream_in* stream) return ret; } // 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 in_get_mmap_time_offset() { const int32_t kDefaultOffsetMicros = 0; int32_t mmap_time_offset_micros = property_get_int32( "persist.audio.in_mmap_delay_micros", kDefaultOffsetMicros); ALOGI("mmap_time_offset_micros = %d for input", mmap_time_offset_micros); return mmap_time_offset_micros * (int64_t)1000; } static int in_create_mmap_buffer(const struct audio_stream_in *stream, int32_t min_size_frames, struct audio_mmap_buffer_info *info) Loading Loading @@ -4074,6 +4100,8 @@ static int in_create_mmap_buffer(const struct audio_stream_in *stream, goto exit; } in->mmap_time_offset_nanos = in_get_mmap_time_offset(); in->standby = false; ret = 0; Loading Loading @@ -4116,7 +4144,9 @@ static int in_get_mmap_position(const struct audio_stream_in *stream, ALOGE("%s: %s", __func__, pcm_get_error(in->pcm)); goto exit; } position->time_nanoseconds = audio_utils_ns_from_timespec(&ts); position->time_nanoseconds = audio_utils_ns_from_timespec(&ts) + in->mmap_time_offset_nanos; exit: pthread_mutex_unlock(&in->lock); return ret; Loading hal/audio_hw.h +2 −0 Original line number Diff line number Diff line Loading @@ -230,6 +230,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; int non_blocking; Loading Loading @@ -274,6 +275,7 @@ struct stream_in { bool enable_ns; int64_t frames_read; /* total frames read, not cleared when entering standby */ int64_t frames_muted; /* total frames muted, not cleared when entering standby */ int64_t mmap_time_offset_nanos; /* fudge factor to correct inaccuracies in DSP */ audio_io_handle_t capture_handle; audio_input_flags_t flags; Loading Loading
hal/audio_hw.c +32 −2 Original line number Diff line number Diff line Loading @@ -3360,6 +3360,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) Loading Loading @@ -3437,6 +3448,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; Loading Loading @@ -3480,7 +3493,9 @@ static int out_get_mmap_position(const struct audio_stream_out *stream, 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; Loading Loading @@ -3994,6 +4009,17 @@ static int in_start(const struct audio_stream_in* stream) return ret; } // 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 in_get_mmap_time_offset() { const int32_t kDefaultOffsetMicros = 0; int32_t mmap_time_offset_micros = property_get_int32( "persist.audio.in_mmap_delay_micros", kDefaultOffsetMicros); ALOGI("mmap_time_offset_micros = %d for input", mmap_time_offset_micros); return mmap_time_offset_micros * (int64_t)1000; } static int in_create_mmap_buffer(const struct audio_stream_in *stream, int32_t min_size_frames, struct audio_mmap_buffer_info *info) Loading Loading @@ -4074,6 +4100,8 @@ static int in_create_mmap_buffer(const struct audio_stream_in *stream, goto exit; } in->mmap_time_offset_nanos = in_get_mmap_time_offset(); in->standby = false; ret = 0; Loading Loading @@ -4116,7 +4144,9 @@ static int in_get_mmap_position(const struct audio_stream_in *stream, ALOGE("%s: %s", __func__, pcm_get_error(in->pcm)); goto exit; } position->time_nanoseconds = audio_utils_ns_from_timespec(&ts); position->time_nanoseconds = audio_utils_ns_from_timespec(&ts) + in->mmap_time_offset_nanos; exit: pthread_mutex_unlock(&in->lock); return ret; Loading
hal/audio_hw.h +2 −0 Original line number Diff line number Diff line Loading @@ -230,6 +230,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; int non_blocking; Loading Loading @@ -274,6 +275,7 @@ struct stream_in { bool enable_ns; int64_t frames_read; /* total frames read, not cleared when entering standby */ int64_t frames_muted; /* total frames muted, not cleared when entering standby */ int64_t mmap_time_offset_nanos; /* fudge factor to correct inaccuracies in DSP */ audio_io_handle_t capture_handle; audio_input_flags_t flags; Loading