msm: audio: qdsp6v2: Add support for other voice and mp3 codec

Added below support
-MP3 decode
-Voice decode(AMRNB\EVRC\QCELP\AMRWB)
-AMRWB encode

Change-Id: If62c869fb485ebb3f4e5cdfcb8fed743707434e9
Signed-off-by: Alex Wong <waiw@codeaurora.org>
Signed-off-by: Deepa Madiregama <dmadireg@codeaurora.org>
Signed-off-by: Rajesha Kini <rkini@codeaurora.org>
Signed-off-by: Deepa Madiregama <dmadireg@codeaurora.org>
This commit is contained in:
Alex Wong
2011-10-28 10:52:15 +05:30
committed by Asish Bhattacharya
parent a187736bed
commit 2caeecc1fa
3 changed files with 111 additions and 0 deletions

View File

@@ -768,6 +768,11 @@ struct asm_amrnb_read_cfg {
u16 dtx_mode;
};
struct asm_amrwb_read_cfg {
u16 mode;
u16 dtx_mode;
};
struct asm_evrc_read_cfg {
u16 max_rate;
u16 min_rate;
@@ -819,6 +824,7 @@ struct asm_encode_cfg_blk {
struct asm_evrc_read_cfg evrc;
struct asm_qcelp13_read_cfg qcelp13;
struct asm_sbc_read_cfg sbc;
struct asm_amrwb_read_cfg amrwb;
} __attribute__((packed)) cfg;
};
@@ -849,6 +855,7 @@ struct asm_stream_cmd_open_read {
#define MP3 0x00010BE9
#define MPEG4_AAC 0x00010BEA
#define AMRNB_FS 0x00010BEB
#define AMRWB_FS 0x00010BEC
#define V13K_FS 0x00010BED
#define EVRC_FS 0x00010BEE
#define EVRCB_FS 0x00010BEF

View File

@@ -236,6 +236,9 @@ int q6asm_enc_cfg_blk_evrc(struct audio_client *ac, uint32_t frames_per_buf,
int q6asm_enc_cfg_blk_amrnb(struct audio_client *ac, uint32_t frames_per_buf,
uint16_t band_mode, uint16_t dtx_enable);
int q6asm_enc_cfg_blk_amrwb(struct audio_client *ac, uint32_t frames_per_buf,
uint16_t band_mode, uint16_t dtx_enable);
int q6asm_media_format_block_pcm(struct audio_client *ac,
uint32_t rate, uint32_t channels);
@@ -281,4 +284,8 @@ int q6asm_set_io_mode(struct audio_client *ac, uint32_t mode);
int q6asm_get_apr_service_id(int session_id);
#endif
/* Common format block without any payload
*/
int q6asm_media_format_block(struct audio_client *ac, uint32_t format);
#endif /* __Q6_ASM_H__ */

View File

@@ -1081,6 +1081,10 @@ int q6asm_open_read(struct audio_client *ac,
open.uMode = BUFFER_META_ENABLE | STREAM_PRIORITY_HIGH;
open.format = AMRNB_FS;
break;
case FORMAT_AMRWB:
open.uMode = BUFFER_META_ENABLE | STREAM_PRIORITY_HIGH;
open.format = AMRWB_FS;
break;
default:
pr_err("Invalid format[%d]\n", format);
goto fail_cmd;
@@ -1205,6 +1209,27 @@ int q6asm_open_read_write(struct audio_client *ac,
case FORMAT_WMA_V10PRO:
open.write_format = WMA_V10PRO;
break;
case FORMAT_AMRNB:
open.write_format = AMRNB_FS;
break;
case FORMAT_AMRWB:
open.write_format = AMRWB_FS;
break;
case FORMAT_V13K:
open.write_format = V13K_FS;
break;
case FORMAT_EVRC:
open.write_format = EVRC_FS;
break;
case FORMAT_EVRCB:
open.write_format = EVRCB_FS;
break;
case FORMAT_EVRCWB:
open.write_format = EVRCWB_FS;
break;
case FORMAT_MP3:
open.write_format = MP3;
break;
default:
pr_err("Invalid format[%d]\n", wr_format);
goto fail_cmd;
@@ -1226,6 +1251,9 @@ int q6asm_open_read_write(struct audio_client *ac,
case FORMAT_AMRNB:
open.read_format = AMRNB_FS;
break;
case FORMAT_AMRWB:
open.read_format = AMRWB_FS;
break;
default:
pr_err("Invalid format[%d]\n", rd_format);
goto fail_cmd;
@@ -1597,6 +1625,44 @@ fail_cmd:
return -EINVAL;
}
int q6asm_enc_cfg_blk_amrwb(struct audio_client *ac, uint32_t frames_per_buf,
uint16_t band_mode, uint16_t dtx_enable)
{
struct asm_stream_cmd_encdec_cfg_blk enc_cfg;
int rc = 0;
pr_debug("%s:session[%d]frames[%d]band_mode[0x%4x]dtx_enable[0x%4x]",
__func__, ac->session, frames_per_buf, band_mode, dtx_enable);
q6asm_add_hdr(ac, &enc_cfg.hdr, sizeof(enc_cfg), TRUE);
enc_cfg.hdr.opcode = ASM_STREAM_CMD_SET_ENCDEC_PARAM;
enc_cfg.param_id = ASM_ENCDEC_CFG_BLK_ID;
enc_cfg.param_size = sizeof(struct asm_encode_cfg_blk);
enc_cfg.enc_blk.frames_per_buf = frames_per_buf;
enc_cfg.enc_blk.format_id = AMRWB_FS;
enc_cfg.enc_blk.cfg_size = sizeof(struct asm_amrwb_read_cfg);
enc_cfg.enc_blk.cfg.amrwb.mode = band_mode;
enc_cfg.enc_blk.cfg.amrwb.dtx_mode = dtx_enable;
rc = apr_send_pkt(ac->apr, (uint32_t *) &enc_cfg);
if (rc < 0) {
pr_err("Comamnd %d failed\n", ASM_STREAM_CMD_SET_ENCDEC_PARAM);
goto fail_cmd;
}
rc = wait_event_timeout(ac->cmd_wait,
(atomic_read(&ac->cmd_state) == 0), 5*HZ);
if (!rc) {
pr_err("timeout. waited for FORMAT_UPDATE\n");
goto fail_cmd;
}
return 0;
fail_cmd:
return -EINVAL;
}
int q6asm_media_format_block_pcm(struct audio_client *ac,
uint32_t rate, uint32_t channels)
{
@@ -1732,6 +1798,37 @@ fail_cmd:
}
int q6asm_media_format_block(struct audio_client *ac, uint32_t format)
{
struct asm_stream_media_format_update fmt;
int rc = 0;
pr_debug("%s:session[%d] format[0x%x]\n", __func__,
ac->session, format);
q6asm_add_hdr(ac, &fmt.hdr, sizeof(fmt), TRUE);
fmt.hdr.opcode = ASM_DATA_CMD_MEDIA_FORMAT_UPDATE;
fmt.format = format;
fmt.cfg_size = 0;
rc = apr_send_pkt(ac->apr, (uint32_t *) &fmt);
if (rc < 0) {
pr_err("%s:Comamnd open failed\n", __func__);
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__);
goto fail_cmd;
}
return 0;
fail_cmd:
return -EINVAL;
}
int q6asm_media_format_block_wma(struct audio_client *ac,
void *cfg)
{