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:
parent
c8701f776a
commit
2257355fe4
1 changed files with 49 additions and 24 deletions
|
@ -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,
|
||||
|
|
Loading…
Add table
Reference in a new issue