audio: NTS LLP-* case fail. [1/1]
PD#TV-134889
Problem:
Audio HAL did not report pipeline latency, which will cause NRDP to
continue sending data even when the buffer water level is high.So the
delay will be too large.
Solution:
report the pipeline lantency.
Verify:
u-linux
Change-Id: I4511531320fad281dbbbfb5e83bfdd21f2c8d4a0
Signed-off-by: dongyang.zhang <dongyang.zhang@amlogic.com>
diff --git a/audio_hal/audio_hw.c b/audio_hal/audio_hw.c
index ae5d225..16eef9a 100644
--- a/audio_hal/audio_hw.c
+++ b/audio_hal/audio_hw.c
@@ -7467,11 +7467,17 @@
{
struct audio_stream_out *out = (struct audio_stream_out *)data;
struct aml_stream_out *aml_out = (struct aml_stream_out *)out;
+ struct aml_audio_device *adev = aml_out->dev;
uint64_t rp = 0;
+ int app_input_level = 0;
+ int is_alsa_delay_valid = false;
unsigned char zero[5*6*2*48];
unsigned char *in = IpcBuffer_get_ptr(LLP_BUFFER_NAME);
void *ipc_buffer = IpcBuffer_get_by_name(LLP_BUFFER_NAME);
+ prctl(PR_SET_NAME, (unsigned long)"LLP_INPUT");
+ //aml_set_thread_priority("LLP_INPUT", out->llp_input_threadID, 5);
+
memset(zero, 0, sizeof(zero));
/*coverity[missing_lock]:aml_out->llp_input_thread_exit does not need to be lock*/
while (!aml_out->llp_input_thread_exit) {
@@ -7501,6 +7507,7 @@
aml_out->app_underrun_cnt = 0;
if (aml_out->app_underrun_cnt > 10) {
+ is_alsa_delay_valid = false;
IpcBuffer_add_silence(ipc_buffer, sizeof(zero) / nChannel / 2);
IpcBuffer_inc_underrun(ipc_buffer);
aml_out->app_underrun_cnt = 0;
@@ -7519,10 +7526,20 @@
rp += level;
alsa_level = aml_audio_out_get_ms12_latency_frames((struct audio_stream_out *)aml_out);
- //main_input_level = dolby_ms12_get_main_buffer_avail(NULL) / nChannel / 2;
- //IpcBuffer_set_water_level(ipc_buffer, alsa_level + main_input_level);
+ if (is_alsa_delay_valid == false) {
+ alsa_level = 0;
+ if (wp != 0) {
+ is_alsa_delay_valid = true;
+ }
+ }
+ app_input_level = dolby_ms12_get_app_buffer_avail(NULL) / nChannel / 2;
+ IpcBuffer_setMeta(aml_out->llp_buf, wp / nChannel / 2, alsa_level + dolby_ms12_get_app_buffer_avail(NULL) / nChannel / 2);
- AM_LOGI("llp wp = %" PRIu64 "llp rp = %" PRIu64 ", alsa_level = %d ms, app input level = %d", wp, rp, alsa_level / 48, dolby_ms12_get_app_buffer_avail(NULL));
+ if (adev->debug_flag > 0) {
+ AM_LOGI("llp wp:%"PRIu64" (%"PRIu64" ms) hal_delay:%d (%d ms)", wp / nChannel / 2, wp / nChannel / 2 / 48,
+ alsa_level + dolby_ms12_get_app_buffer_avail(NULL) / nChannel / 2, (alsa_level + dolby_ms12_get_app_buffer_avail(NULL) / nChannel / 2) / 48);
+ AM_LOGI("llp wp = %" PRIu64 " llp rp = %" PRIu64 ", alsa_level = %d ms, app input level = %d", wp, rp, alsa_level / 48, dolby_ms12_get_app_buffer_avail(NULL));
+ }
aml_audio_sleep(5000);
}