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;