Merge "ASoC: msm: qdsp6v2: Add timestamp in voip frame header"
diff --git a/sound/soc/msm/qdsp6v2/msm-pcm-voip-v2.c b/sound/soc/msm/qdsp6v2/msm-pcm-voip-v2.c
index 4a829fd..158009f 100644
--- a/sound/soc/msm/qdsp6v2/msm-pcm-voip-v2.c
+++ b/sound/soc/msm/qdsp6v2/msm-pcm-voip-v2.c
@@ -79,12 +79,16 @@
VOIP_STARTED,
};
-struct voip_frame {
+struct voip_frame_hdr {
+ uint32_t timestamp;
union {
- uint32_t frame_type;
- uint32_t packet_rate;
- } header;
- uint32_t len;
+ uint32_t frame_type;
+ uint32_t packet_rate;
+ };
+};
+struct voip_frame {
+ struct voip_frame_hdr frm_hdr;
+ uint32_t pktlen;
uint8_t voc_pkt[VOIP_MAX_VOC_PKT_SIZE];
};
@@ -275,6 +279,7 @@
/* capture path */
static void voip_process_ul_pkt(uint8_t *voc_pkt,
uint32_t pkt_len,
+ uint32_t timestamp,
void *private_data)
{
struct voip_buf_node *buf_node = NULL;
@@ -299,13 +304,15 @@
* Bits 0-3: Frame rate
* Bits 4-7: Frame type
*/
- buf_node->frame.header.frame_type =
+ buf_node->frame.frm_hdr.timestamp = timestamp;
+ buf_node->frame.frm_hdr.frame_type =
((*voc_pkt) & 0xF0) >> 4;
voc_pkt = voc_pkt + DSP_FRAME_HDR_LEN;
- buf_node->frame.len = pkt_len - DSP_FRAME_HDR_LEN;
+ buf_node->frame.pktlen = pkt_len - DSP_FRAME_HDR_LEN;
memcpy(&buf_node->frame.voc_pkt[0],
voc_pkt,
- buf_node->frame.len);
+ buf_node->frame.pktlen);
+
list_add_tail(&buf_node->list, &prtd->out_queue);
break;
}
@@ -316,27 +323,30 @@
* Header format:
* Bits 0-3: frame rate
*/
- buf_node->frame.header.packet_rate = (*voc_pkt) & 0x0F;
+ buf_node->frame.frm_hdr.timestamp = timestamp;
+ buf_node->frame.frm_hdr.packet_rate = (*voc_pkt) & 0x0F;
voc_pkt = voc_pkt + DSP_FRAME_HDR_LEN;
- buf_node->frame.len = pkt_len - DSP_FRAME_HDR_LEN;
+ buf_node->frame.pktlen = pkt_len - DSP_FRAME_HDR_LEN;
memcpy(&buf_node->frame.voc_pkt[0],
voc_pkt,
- buf_node->frame.len);
+ buf_node->frame.pktlen);
list_add_tail(&buf_node->list, &prtd->out_queue);
break;
}
default: {
- buf_node->frame.len = pkt_len;
+ buf_node->frame.frm_hdr.timestamp = timestamp;
+ buf_node->frame.pktlen = pkt_len;
memcpy(&buf_node->frame.voc_pkt[0],
voc_pkt,
- buf_node->frame.len);
+ buf_node->frame.pktlen);
list_add_tail(&buf_node->list, &prtd->out_queue);
}
}
- pr_debug("ul_pkt: pkt_len =%d, frame.len=%d\n", pkt_len,
- buf_node->frame.len);
+ pr_debug("%s: pkt_len =%d, frame.pktlen=%d, timestamp=%d\n",
+ __func__, pkt_len, buf_node->frame.pktlen, timestamp);
+
prtd->pcm_capture_irq_pos += prtd->pcm_capture_count;
spin_unlock_irqrestore(&prtd->dsp_ul_lock, dsp_flags);
snd_pcm_period_elapsed(prtd->capture_substream);
@@ -367,7 +377,7 @@
switch (prtd->mode) {
case MODE_AMR:
case MODE_AMR_WB: {
- *((uint32_t *)voc_pkt) = buf_node->frame.len +
+ *((uint32_t *)voc_pkt) = buf_node->frame.pktlen +
DSP_FRAME_HDR_LEN;
/* Advance to the header of voip packet */
voc_pkt = voc_pkt + sizeof(uint32_t);
@@ -376,19 +386,19 @@
* Bits 0-3: Frame rate
* Bits 4-7: Frame type
*/
- *voc_pkt = ((buf_node->frame.header.frame_type &
+ *voc_pkt = ((buf_node->frame.frm_hdr.frame_type &
0x0F) << 4) | (prtd->rate_type & 0x0F);
voc_pkt = voc_pkt + DSP_FRAME_HDR_LEN;
memcpy(voc_pkt,
&buf_node->frame.voc_pkt[0],
- buf_node->frame.len);
+ buf_node->frame.pktlen);
list_add_tail(&buf_node->list, &prtd->free_in_queue);
break;
}
case MODE_IS127:
case MODE_4GV_NB:
case MODE_4GV_WB: {
- *((uint32_t *)voc_pkt) = buf_node->frame.len +
+ *((uint32_t *)voc_pkt) = buf_node->frame.pktlen +
DSP_FRAME_HDR_LEN;
/* Advance to the header of voip packet */
voc_pkt = voc_pkt + sizeof(uint32_t);
@@ -396,22 +406,22 @@
* Add the DSP frame info header. Header format:
* Bits 0-3 : Frame rate
*/
- *voc_pkt = buf_node->frame.header.packet_rate & 0x0F;
+ *voc_pkt = buf_node->frame.frm_hdr.packet_rate & 0x0F;
voc_pkt = voc_pkt + DSP_FRAME_HDR_LEN;
memcpy(voc_pkt,
&buf_node->frame.voc_pkt[0],
- buf_node->frame.len);
+ buf_node->frame.pktlen);
list_add_tail(&buf_node->list, &prtd->free_in_queue);
break;
}
default: {
- *((uint32_t *)voc_pkt) = buf_node->frame.len;
+ *((uint32_t *)voc_pkt) = buf_node->frame.pktlen;
voc_pkt = voc_pkt + sizeof(uint32_t);
memcpy(voc_pkt,
&buf_node->frame.voc_pkt[0],
- buf_node->frame.len);
+ buf_node->frame.pktlen);
list_add_tail(&buf_node->list, &prtd->free_in_queue);
}
}
@@ -559,7 +569,7 @@
if (prtd->mode == MODE_PCM) {
ret = copy_from_user(&buf_node->frame.voc_pkt,
buf, count);
- buf_node->frame.len = count;
+ buf_node->frame.pktlen = count;
} else
ret = copy_from_user(&buf_node->frame,
buf, count);
diff --git a/sound/soc/msm/qdsp6v2/q6voice.c b/sound/soc/msm/qdsp6v2/q6voice.c
index 2f1319a..ae5bbbf 100644
--- a/sound/soc/msm/qdsp6v2/q6voice.c
+++ b/sound/soc/msm/qdsp6v2/q6voice.c
@@ -5234,8 +5234,10 @@
cvs_voc_pkt = v->shmem_info.sh_buf.buf[1].data;
if (cvs_voc_pkt != NULL && common.mvs_info.ul_cb != NULL) {
+ /* cvs_voc_pkt[0] contains tx timestamp */
common.mvs_info.ul_cb((uint8_t *)&cvs_voc_pkt[3],
cvs_voc_pkt[2],
+ cvs_voc_pkt[0],
common.mvs_info.private_data);
} else
pr_err("%s: cvs_voc_pkt or ul_cb is NULL\n", __func__);
diff --git a/sound/soc/msm/qdsp6v2/q6voice.h b/sound/soc/msm/qdsp6v2/q6voice.h
index 5909219..798391d 100644
--- a/sound/soc/msm/qdsp6v2/q6voice.h
+++ b/sound/soc/msm/qdsp6v2/q6voice.h
@@ -1211,6 +1211,7 @@
/* CB for up-link packets. */
typedef void (*ul_cb_fn)(uint8_t *voc_pkt,
uint32_t pkt_len,
+ uint32_t timestamp,
void *private_data);
/* CB for down-link packets. */