Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2257355f authored by Ralf Herz's avatar Ralf Herz
Browse files

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: default avatarRalf Herz <rherz@codeaurora.org>
parent c8701f77
Loading
Loading
Loading
Loading
+49 −24
Original line number Diff line number Diff line
@@ -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,18 +1456,43 @@ 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->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 {
		if (prtd->codec_param.codec.flags & COMPRESSED_TIMESTAMP_FLAG) {
		ret = q6asm_open_read_v4(prtd->audio_client, prtd->codec,
			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,
			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);
			pr_err("%s: q6asm_open_read failed:%d\n",
					__func__, ret);
			return ret;
		}

@@ -1480,6 +1504,7 @@ static int msm_compr_configure_dsp_for_capture(struct snd_compr_stream *cstream)
			pr_err("%s: stream reg failed:%d\n", __func__, ret);
			return ret;
		}
	}

	ret = q6asm_set_io_mode(ac, (COMPRESSED_STREAM_IO | ASYNC_IO_MODE));
	if (ret < 0) {
@@ -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,