mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-15 15:15:47 +00:00
ASoC: q6asm: add support to remove intial and trailing silence
This patch adds support to ASM_DATA_CMD_REMOVE_INITIAL_SILENCE and ASM_DATA_CMD_REMOVE_TRAILING_SILENCE q6asm command to support compressed metadata for gapless playback. Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> Tested-by: Vinod Koul <vkoul@kernel.org> Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Reviewed-by: Vinod Koul <vkoul@kernel.org> Link: https://lore.kernel.org/r/20200727093806.17089-6-srinivas.kandagatla@linaro.org Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
50d4e2146c
commit
3937612978
2 changed files with 59 additions and 0 deletions
|
@ -51,6 +51,8 @@
|
|||
#define ASM_STREAM_CMD_OPEN_READWRITE_V2 0x00010D8D
|
||||
#define ASM_MEDIA_FMT_ALAC 0x00012f31
|
||||
#define ASM_MEDIA_FMT_APE 0x00012f32
|
||||
#define ASM_DATA_CMD_REMOVE_INITIAL_SILENCE 0x00010D67
|
||||
#define ASM_DATA_CMD_REMOVE_TRAILING_SILENCE 0x00010D68
|
||||
|
||||
|
||||
#define ASM_LEGACY_STREAM_SESSION 0
|
||||
|
@ -639,6 +641,8 @@ static int32_t q6asm_stream_callback(struct apr_device *adev,
|
|||
case ASM_STREAM_CMD_OPEN_READWRITE_V2:
|
||||
case ASM_STREAM_CMD_SET_ENCDEC_PARAM:
|
||||
case ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2:
|
||||
case ASM_DATA_CMD_REMOVE_INITIAL_SILENCE:
|
||||
case ASM_DATA_CMD_REMOVE_TRAILING_SILENCE:
|
||||
if (result->status != 0) {
|
||||
dev_err(ac->dev,
|
||||
"cmd = 0x%x returned error = 0x%x\n",
|
||||
|
@ -1324,6 +1328,55 @@ int q6asm_stream_media_format_block_ape(struct audio_client *ac,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(q6asm_stream_media_format_block_ape);
|
||||
|
||||
static int q6asm_stream_remove_silence(struct audio_client *ac, uint32_t stream_id,
|
||||
uint32_t cmd,
|
||||
uint32_t num_samples)
|
||||
{
|
||||
uint32_t *samples;
|
||||
struct apr_pkt *pkt;
|
||||
void *p;
|
||||
int rc, pkt_size;
|
||||
|
||||
pkt_size = APR_HDR_SIZE + sizeof(uint32_t);
|
||||
p = kzalloc(pkt_size, GFP_ATOMIC);
|
||||
if (!p)
|
||||
return -ENOMEM;
|
||||
|
||||
pkt = p;
|
||||
samples = p + APR_HDR_SIZE;
|
||||
|
||||
q6asm_add_hdr(ac, &pkt->hdr, pkt_size, true, stream_id);
|
||||
|
||||
pkt->hdr.opcode = cmd;
|
||||
*samples = num_samples;
|
||||
rc = apr_send_pkt(ac->adev, pkt);
|
||||
if (rc == pkt_size)
|
||||
rc = 0;
|
||||
|
||||
kfree(pkt);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
int q6asm_stream_remove_initial_silence(struct audio_client *ac,
|
||||
uint32_t stream_id,
|
||||
uint32_t initial_samples)
|
||||
{
|
||||
return q6asm_stream_remove_silence(ac, stream_id,
|
||||
ASM_DATA_CMD_REMOVE_INITIAL_SILENCE,
|
||||
initial_samples);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(q6asm_stream_remove_initial_silence);
|
||||
|
||||
int q6asm_stream_remove_trailing_silence(struct audio_client *ac, uint32_t stream_id,
|
||||
uint32_t trailing_samples)
|
||||
{
|
||||
return q6asm_stream_remove_silence(ac, stream_id,
|
||||
ASM_DATA_CMD_REMOVE_TRAILING_SILENCE,
|
||||
trailing_samples);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(q6asm_stream_remove_trailing_silence);
|
||||
|
||||
/**
|
||||
* q6asm_enc_cfg_blk_pcm_format_support() - setup pcm configuration for capture
|
||||
*
|
||||
|
|
|
@ -134,6 +134,12 @@ int q6asm_run(struct audio_client *ac, uint32_t stream_id, uint32_t flags,
|
|||
uint32_t msw_ts, uint32_t lsw_ts);
|
||||
int q6asm_run_nowait(struct audio_client *ac, uint32_t stream_id,
|
||||
uint32_t flags, uint32_t msw_ts, uint32_t lsw_ts);
|
||||
int q6asm_stream_remove_initial_silence(struct audio_client *ac,
|
||||
uint32_t stream_id,
|
||||
uint32_t initial_samples);
|
||||
int q6asm_stream_remove_trailing_silence(struct audio_client *ac,
|
||||
uint32_t stream_id,
|
||||
uint32_t trailing_samples);
|
||||
int q6asm_cmd(struct audio_client *ac, uint32_t stream_id, int cmd);
|
||||
int q6asm_cmd_nowait(struct audio_client *ac, uint32_t stream_id, int cmd);
|
||||
int q6asm_get_session_id(struct audio_client *ac);
|
||||
|
|
Loading…
Reference in a new issue