From 2257355fe4091dd589b672537e1527c7ea4bdef7 Mon Sep 17 00:00:00 2001 From: Ralf Herz Date: Wed, 20 Jun 2018 11:30:58 +0200 Subject: [PATCH] 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 --- asoc/msm-compress-q6-v2.c | 73 ++++++++++++++++++++++++++------------- 1 file changed, 49 insertions(+), 24 deletions(-) diff --git a/asoc/msm-compress-q6-v2.c b/asoc/msm-compress-q6-v2.c index c0d8614559f1..6fb61da19536 100644 --- a/asoc/msm-compress-q6-v2.c +++ b/asoc/msm-compress-q6-v2.c @@ -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,