asoc: Support compressed capture from AFE interfaces

Support compressed IEC61937 audio capture from AFE interfaces
with variable data packet lengths.

Change-Id: Iffd5a06ed5fe1a96f34e225d54fab660b21d2a48
Signed-off-by: Ralf Herz <rherz@codeaurora.org>
This commit is contained in:
Ralf Herz 2018-06-20 11:30:58 +02:00
parent c8701f776a
commit 2257355fe4

View file

@ -540,7 +540,7 @@ static int msm_compr_read_buffer(struct msm_compr_audio *prtd)
__func__, ret);
return ret;
}
prtd->bytes_read += buffer_length;
prtd->bytes_read += buffer_length + prtd->ts_header_offset;
prtd->bytes_read_offset += buffer_length + prtd->ts_header_offset;
if (prtd->bytes_read_offset >= prtd->buffer_size)
prtd->bytes_read_offset -= prtd->buffer_size;
@ -676,9 +676,8 @@ static void compr_event_handler(uint32_t opcode,
if (prtd->ts_header_offset) {
/* Update the header for received buffer */
buff_addr = prtd->buffer + prtd->byte_offset;
/* Write the length of the buffer */
*buff_addr = prtd->codec_param.buffer.fragment_size
- prtd->ts_header_offset;
/* Write the actual length of the received buffer */
*buff_addr = payload[4];
buff_addr++;
/* Write the offset */
*buff_addr = prtd->ts_header_offset;
@ -1457,28 +1456,54 @@ static int msm_compr_configure_dsp_for_capture(struct snd_compr_stream *cstream)
break;
}
pr_debug("%s: stream_id %d bits_per_sample %d\n",
__func__, ac->stream_id, bits_per_sample);
pr_debug("%s: stream_id %d bits_per_sample %d compr_passthr %d\n",
__func__, ac->stream_id, bits_per_sample,
prtd->compr_passthr);
if (prtd->codec_param.codec.flags & COMPRESSED_TIMESTAMP_FLAG) {
ret = q6asm_open_read_v4(prtd->audio_client, prtd->codec,
bits_per_sample, true, enc_cfg_id);
if (prtd->compr_passthr != LEGACY_PCM) {
ret = q6asm_open_read_compressed(prtd->audio_client,
prtd->codec, prtd->compr_passthr);
if (ret < 0) {
pr_err("%s:ASM open read err[%d] for compr_type[%d]\n",
__func__, ret, prtd->compr_passthr);
return ret;
}
ret = msm_pcm_routing_reg_phy_compr_stream(
soc_prtd->dai_link->id,
ac->perf_mode,
prtd->session_id,
SNDRV_PCM_STREAM_CAPTURE,
prtd->compr_passthr);
if (ret) {
pr_err("%s: compr stream reg failed:%d\n",
__func__, ret);
return ret;
}
} else {
ret = q6asm_open_read_v4(prtd->audio_client, prtd->codec,
bits_per_sample, false, enc_cfg_id);
}
if (ret < 0) {
pr_err("%s: q6asm_open_read failed:%d\n", __func__, ret);
return ret;
}
if (prtd->codec_param.codec.flags & COMPRESSED_TIMESTAMP_FLAG) {
ret = q6asm_open_read_v4(prtd->audio_client,
prtd->codec,
bits_per_sample, true, enc_cfg_id);
} else {
ret = q6asm_open_read_v4(prtd->audio_client,
prtd->codec,
bits_per_sample, false, enc_cfg_id);
}
if (ret < 0) {
pr_err("%s: q6asm_open_read failed:%d\n",
__func__, ret);
return ret;
}
ret = msm_pcm_routing_reg_phy_stream(soc_prtd->dai_link->id,
ac->perf_mode,
prtd->session_id,
SNDRV_PCM_STREAM_CAPTURE);
if (ret) {
pr_err("%s: stream reg failed:%d\n", __func__, ret);
return ret;
ret = msm_pcm_routing_reg_phy_stream(soc_prtd->dai_link->id,
ac->perf_mode,
prtd->session_id,
SNDRV_PCM_STREAM_CAPTURE);
if (ret) {
pr_err("%s: stream reg failed:%d\n", __func__, ret);
return ret;
}
}
ret = q6asm_set_io_mode(ac, (COMPRESSED_STREAM_IO | ASYNC_IO_MODE));
@ -1533,7 +1558,7 @@ static int msm_compr_configure_dsp_for_capture(struct snd_compr_stream *cstream)
ret = q6asm_enc_cfg_blk_custom(prtd->audio_client, prtd->sample_rate,
prtd->num_channels, prtd->codec,
(void *)&prtd->codec_param.codec.options.generic);
} else {
} else if (prtd->compr_passthr == LEGACY_PCM) {
ret = q6asm_enc_cfg_blk_pcm_format_support_v4(prtd->audio_client,
prtd->sample_rate, prtd->num_channels,
bits_per_sample, sample_word_size,