audio: PT03 playback sound is not smooth [1/1]

PD#SWPL-193166

Problem:
When frame size is odd, the last byte was missing.

Solution:
When frame size is odd, save the last byte.

Verify:
yocto-t5d

Change-Id: Ie890b1d40afa06f74ac05b86b700d26fd7532e70
Signed-off-by: yayun.shi <yayun.shi@amlogic.com>
diff --git a/audio_hal/audio_hw.c b/audio_hal/audio_hw.c
index 00bd733..0bdab6a 100644
--- a/audio_hal/audio_hw.c
+++ b/audio_hal/audio_hw.c
@@ -335,7 +335,17 @@
         }
         ret = aml_spdif_decoder_process(aml_out->spdif_dec_handle, in_buf, in_size, used_size, &out_abuffer->buffer, &out_abuffer->size);
         if (out_abuffer->buffer && out_abuffer->size) {
+            /*if (out_abuffer->size) {
+                char *p = (char*)out_abuffer->buffer;
+                AM_LOGI("+[%d](%x,%x,%x,%x,%x)", out_abuffer->size, p[out_abuffer->size-5], p[out_abuffer->size-4],
+                p[out_abuffer->size-3], p[out_abuffer->size-2], p[out_abuffer->size-1]);
+            }*/
             endian16_convert((void*)out_abuffer->buffer, out_abuffer->size);
+            /*if (out_abuffer->size) {
+                char *p = (char*)out_abuffer->buffer;
+                AM_LOGI("-[%d](%x,%x,%x,%x,%x)", out_abuffer->size, p[out_abuffer->size-5], p[out_abuffer->size-4],
+                p[out_abuffer->size-3], p[out_abuffer->size-2], p[out_abuffer->size-1]);
+            }*/
         }
         if (out_abuffer->size == 0) {
             *used_size = in_size;
diff --git a/utils/aml_audio_spdifdec.c b/utils/aml_audio_spdifdec.c
index 003d19f..61f7850 100644
--- a/utils/aml_audio_spdifdec.c
+++ b/utils/aml_audio_spdifdec.c
@@ -495,6 +495,7 @@
     int32_t new_buf_size = 0;
     int32_t dtshd_header_len = 0;
     int32_t dts_type4_subtype = 0;
+    int32_t dts_frame_size_is_odd = 0;
     int ret = 0;
 
     if (!spdif_dec_handle || !inbuf || !spdifdec_buf || !buf_left || !buf_offset || !used_size || !out_size) {
@@ -542,6 +543,13 @@
         goto DO_SYNC;
     }
 
+    //ALOGI("payload_size:%d odd:%d format:%x", payload_size, payload_size%2, spdif_dec_handle->format);
+    if ((payload_size%2) && (spdif_dec_handle->format == AUDIO_FORMAT_DTS_HD || AUDIO_FORMAT_DTS == spdif_dec_handle->format)) {
+        dts_frame_size_is_odd = 1;
+        payload_size += 1;//for odd frame, the last audio byte comes from high address
+        //ALOGI("1.payload_size:%d dts_frame_size_is_odd:%d", payload_size, dts_frame_size_is_odd);
+    }
+
     /*we have a complete payload*/
     if ((spdif_dec_handle->buf_remain - IEC61937_HEADER_SIZE - dtshd_header_len + *buf_left) >= payload_size) {
         need_size = payload_size - (spdif_dec_handle->buf_remain - IEC61937_HEADER_SIZE - dtshd_header_len);
@@ -575,6 +583,13 @@
                 }
             }
             *output_buf = (void*)(spdifdec_buf + IEC61937_HEADER_SIZE + dtshd_header_len);
+            if (dts_frame_size_is_odd) {
+                payload_size -= 1;
+                unsigned char *p = (unsigned char*)*output_buf;
+                /*ALOGI("2.payload_size:%d dts_frame_size_is_odd:%d (%x,%x,%x,%x)", payload_size, dts_frame_size_is_odd,
+                p[payload_size-3], p[payload_size-2], p[payload_size-1], p[payload_size]);*/
+                p[payload_size - 1] = p[payload_size];//for odd frame, the last audio byte comes from high address
+            }
             *out_size   = payload_size;
             *used_size = *buf_offset;
             ALOGV("OK type=0x%x payload size=%d used size=%d\n", spdif_dec_handle->format, payload_size, *buf_offset);
@@ -584,6 +599,14 @@
         }else {
             /*internal buf has more data than payload, we only need part of it*/
             *output_buf = (void*)(spdifdec_buf + IEC61937_HEADER_SIZE + dtshd_header_len);
+            if (dts_frame_size_is_odd) {
+                payload_size -= 1;
+                unsigned char *p = (unsigned char*)*output_buf;
+                /*ALOGI("3.payload_size:%d dts_frame_size_is_odd:%d (%x,%x,%x,%x)", payload_size, dts_frame_size_is_odd,
+                p[payload_size-3], p[payload_size-2], p[payload_size-1], p[payload_size]);*/
+                p[payload_size - 1] = p[payload_size];//for odd frame, the last audio byte comes from high address
+
+            }
             *out_size   = payload_size;
             /*move need_size bytes back to original buf*/
             *used_size = *buf_offset + need_size;