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

Commit e5e45a93 authored by Arun Kumar Dasari's avatar Arun Kumar Dasari Committed by Gerrit - the friendly Code Review server
Browse files

ASoC: msm: qdsp6v2: support decode of g711 clips



Add support in audio stream manager to configure decode
of g711 related clips.

Change-Id: Ie90fd68e24e7e793aaac64290e3c1e41682d6d5a
Signed-off-by: default avatarYamit Mehta <ymehta@codeaurora.org>
parent 311cf263
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -3294,6 +3294,10 @@ struct asm_alac_cfg {
	u32 channel_layout_tag;
};

struct asm_g711_dec_cfg {
	u32 sample_rate;
};

struct asm_vorbis_cfg {
	u32 bit_stream_fmt;
};
@@ -3878,6 +3882,12 @@ struct asm_alac_fmt_blk_v2 {

} __packed;

struct asm_g711_dec_fmt_blk_v2 {
	struct apr_hdr hdr;
	struct asm_data_cmd_media_fmt_update_v2 fmtblk;
	u32 sample_rate;
} __packed;

struct asm_ape_fmt_blk_v2 {
	struct apr_hdr hdr;
	struct asm_data_cmd_media_fmt_update_v2 fmtblk;
+3 −0
Original line number Diff line number Diff line
@@ -471,6 +471,9 @@ int q6asm_stream_media_format_block_flac(struct audio_client *ac,
int q6asm_media_format_block_alac(struct audio_client *ac,
			struct asm_alac_cfg *cfg, int stream_id);

int q6asm_media_format_block_g711(struct audio_client *ac,
			struct asm_g711_dec_cfg *cfg, int stream_id);

int q6asm_stream_media_format_block_vorbis(struct audio_client *ac,
			struct asm_vorbis_cfg *cfg, int stream_id);

+59 −0
Original line number Diff line number Diff line
@@ -2724,6 +2724,12 @@ static int __q6asm_open_read_write(struct audio_client *ac, uint32_t rd_format,
	case FORMAT_APE:
		open.dec_fmt_id = ASM_MEDIA_FMT_APE;
		break;
	case FORMAT_G711_ALAW_FS:
		open.dec_fmt_id = ASM_MEDIA_FMT_G711_ALAW_FS;
		break;
	case FORMAT_G711_MLAW_FS:
		open.dec_fmt_id = ASM_MEDIA_FMT_G711_MLAW_FS;
		break;
	default:
		pr_err("%s: Invalid format 0x%x\n",
				__func__, wr_format);
@@ -5009,6 +5015,59 @@ fail_cmd:
	return rc;
}

/*
 * q6asm_media_format_block_g711 - sends g711 decoder configuration
 *                                            parameters
 * @ac: Client session handle
 * @cfg: Audio stream manager configuration parameters
 * @stream_id: Stream id
 */
int q6asm_media_format_block_g711(struct audio_client *ac,
				struct asm_g711_dec_cfg *cfg, int stream_id)
{
	struct asm_g711_dec_fmt_blk_v2 fmt;
	int rc = 0;

	pr_debug("%s :session[%d]rate[%d]\n", __func__,
		ac->session, cfg->sample_rate);

	q6asm_stream_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE, stream_id);
	atomic_set(&ac->cmd_state, -1);

	fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2;
	fmt.fmtblk.fmt_blk_size = sizeof(fmt) - sizeof(fmt.hdr) -
						sizeof(fmt.fmtblk);

	fmt.sample_rate = cfg->sample_rate;

	rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt);
	if (rc < 0) {
		pr_err("%s :Command media format update failed %d\n",
				__func__, rc);
		goto fail_cmd;
	}
	rc = wait_event_timeout(ac->cmd_wait,
				(atomic_read(&ac->cmd_state) >= 0), 5*HZ);
	if (!rc) {
		pr_err("%s :timeout. waited for FORMAT_UPDATE\n", __func__);
		rc = -ETIMEDOUT;
		goto fail_cmd;
	}

	if (atomic_read(&ac->cmd_state) > 0) {
		pr_err("%s: DSP returned error[%s]\n",
				__func__, adsp_err_get_err_str(
				atomic_read(&ac->cmd_state)));
		rc = adsp_err_get_lnx_err_code(
				atomic_read(&ac->cmd_state));
		goto fail_cmd;
	}
	return 0;
fail_cmd:
	return rc;
}
EXPORT_SYMBOL(q6asm_media_format_block_g711);

int q6asm_stream_media_format_block_vorbis(struct audio_client *ac,
				struct asm_vorbis_cfg *cfg, int stream_id)
{