summaryrefslogtreecommitdiff
Diffstat
-rw-r--r--audio_hw.c70
-rw-r--r--audio_hwsync.c34
-rw-r--r--audio_hwsync.h13
3 files changed, 69 insertions, 48 deletions
diff --git a/audio_hwsync.c b/audio_hwsync.c
index a04fc70..98b9efa 100644
--- a/audio_hwsync.c
+++ b/audio_hwsync.c
@@ -43,7 +43,7 @@ int aml_audio_hwsync_find_frame(audio_hwsync_t *p_hwsync,
size_t remain = in_bytes;
uint8_t *p = (uint8_t *)in_buffer;
uint64_t time_diff = 0;
-
+ int pts_found = 0;
if (p_hwsync == NULL || in_buffer == NULL)
return 0;
@@ -52,27 +52,25 @@ int aml_audio_hwsync_find_frame(audio_hwsync_t *p_hwsync,
//if (p_hwsync->hw_sync_state == HW_SYNC_STATE_RESYNC) {
//}
if (p_hwsync->hw_sync_state == HW_SYNC_STATE_HEADER) {
- //ALOGI("Add to header buffer [%d], 0x%x", out->hw_sync_header_cnt, *p);
+ //ALOGI("Add to header buffer [%d], 0x%x", p_hwsync->hw_sync_header_cnt, *p);
p_hwsync->hw_sync_header[p_hwsync->hw_sync_header_cnt++] = *p++;
remain--;
- if (p_hwsync->hw_sync_header_cnt == 16) {
+ if (p_hwsync->hw_sync_header_cnt == HW_SYNC_HEADER_CNT) {
uint64_t pts;
if (!hwsync_header_valid(&p_hwsync->hw_sync_header[0])) {
//ALOGE("!!!!!!hwsync header out of sync! Resync.should not happen????");
p_hwsync->hw_sync_state = HW_SYNC_STATE_HEADER;
- memcpy(p_hwsync->hw_sync_header, p_hwsync->hw_sync_header + 1, 15);
+ memcpy(p_hwsync->hw_sync_header, p_hwsync->hw_sync_header + 1, HW_SYNC_HEADER_CNT - 1);
p_hwsync->hw_sync_header_cnt--;
continue;
}
- if ((in_bytes-remain) > 16)
+ if ((in_bytes-remain) > HW_SYNC_HEADER_CNT)
ALOGI("got the frame sync header cost %zu",in_bytes-remain);
p_hwsync->hw_sync_state = HW_SYNC_STATE_BODY;
p_hwsync->hw_sync_body_cnt = hwsync_header_get_size(&p_hwsync->hw_sync_header[0]);
p_hwsync->hw_sync_frame_size = p_hwsync->hw_sync_body_cnt;
- p_hwsync->body_align_cnt = 0;
+ p_hwsync->hw_sync_header_cnt = 0;
pts = hwsync_header_get_pts(&p_hwsync->hw_sync_header[0]);
- //memcpy(write_buf+write_pos,&p_hwsync->hw_sync_header[0],16);
- //write_pos += 16;
pts = pts * 90 / 1000000;
time_diff = get_pts_gap(pts, p_hwsync->last_apts_from_header) / 90;
ALOGV("pts %"PRIx64",frame len %zu\n", pts, p_hwsync->hw_sync_body_cnt);
@@ -84,24 +82,40 @@ int aml_audio_hwsync_find_frame(audio_hwsync_t *p_hwsync,
}
p_hwsync->last_apts_from_header = pts;
*cur_pts = pts;
+ pts_found = 1;
//ALOGI("get header body_cnt = %d, pts = %lld", out->hw_sync_body_cnt, pts);
}
continue;
} else if (p_hwsync->hw_sync_state == HW_SYNC_STATE_BODY) {
int m = (p_hwsync->hw_sync_body_cnt < remain) ? p_hwsync->hw_sync_body_cnt : remain;
- //ALOGI("m = %d", m);
// process m bytes body with an empty fragment for alignment
if (m > 0) {
//ret = pcm_write(out->pcm, p, m - align);
+#if 0
+ FILE *fp1 = fopen("/data/find_body.pcm", "a+");
+ if (fp1) {
+ int flen = fwrite((char *)p, 1, m, fp1);
+ //LOGFUNC("flen = %d---outlen=%d ", flen, out_frames * frame_size);
+ fclose(fp1);
+ } else {
+ ALOGE("could not open file:/data/find_body.pcm");
+ }
+#endif
memcpy(p_hwsync->hw_sync_body_buf + p_hwsync->hw_sync_frame_size - p_hwsync->hw_sync_body_cnt, p, m);
p += m;
remain -= m;
- //ALOGI("pcm_write %d, remain %d", m - align, remain);
p_hwsync->hw_sync_body_cnt -= m;
if (p_hwsync->hw_sync_body_cnt == 0) {
p_hwsync->hw_sync_state = HW_SYNC_STATE_HEADER;
p_hwsync->hw_sync_header_cnt = 0;
*outsize = p_hwsync->hw_sync_frame_size;
+ /*
+ sometimes the audioflinger burst size is smaller than hwsync payload
+ we need use the last found pts when got a complete hwsync payload
+ */
+ if (!pts_found) {
+ *cur_pts = p_hwsync->last_apts_from_header;
+ }
ALOGV("we found the frame total body,yeah\n");
break;//continue;
}