-rw-r--r-- | audio_hw.c | 70 | ||||
-rw-r--r-- | audio_hwsync.c | 34 | ||||
-rw-r--r-- | audio_hwsync.h | 13 |
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; } |