/* ------------------- device --------------------- */ static long qcelp_in_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { struct q6audio_in *audio = file->private_data; int rc = 0; int cnt = 0; switch (cmd) { case AUDIO_START: { struct msm_audio_qcelp_enc_config *enc_cfg; enc_cfg = audio->enc_cfg; pr_debug("%s:session id %d: default buf alloc[%d]\n", __func__, audio->ac->session, audio->buf_alloc); if (audio->enabled == 1) { pr_aud_info("%s:AUDIO_START already over\n", __func__); rc = 0; break; } rc = audio_in_buf_alloc(audio); if (rc < 0) { pr_aud_err("%s:session id %d: buffer allocation failed\n", __func__, audio->ac->session); break; } /* reduced_rate_level, rate_modulation_cmd set to zero currently not configurable from user space */ rc = q6asm_enc_cfg_blk_qcelp(audio->ac, audio->buf_cfg.frames_per_buf, enc_cfg->min_bit_rate, enc_cfg->max_bit_rate, 0, 0); if (rc < 0) { pr_aud_err("%s:session id %d: cmd qcelp media format block\ failed\n", __func__, audio->ac->session); break; } if (audio->feedback == NON_TUNNEL_MODE) { rc = q6asm_media_format_block_pcm(audio->ac, audio->pcm_cfg.sample_rate, audio->pcm_cfg.channel_count); if (rc < 0) { pr_aud_err("%s:session id %d: media format block\ failed\n", __func__, audio->ac->session); break; } }
static long qcelp_in_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { struct q6audio_in *audio = file->private_data; int rc = 0; int cnt = 0; switch (cmd) { case AUDIO_START: { struct msm_audio_qcelp_enc_config *enc_cfg; enc_cfg = audio->enc_cfg; pr_debug("%s:session id %d: default buf alloc[%d]\n", __func__, audio->ac->session, audio->buf_alloc); if (audio->enabled == 1) { pr_info("%s:AUDIO_START already over\n", __func__); rc = 0; break; } rc = audio_in_buf_alloc(audio); if (rc < 0) { pr_err("%s:session id %d: buffer allocation failed\n", __func__, audio->ac->session); break; } rc = q6asm_enc_cfg_blk_qcelp(audio->ac, audio->buf_cfg.frames_per_buf, enc_cfg->min_bit_rate, enc_cfg->max_bit_rate, 0, 0); if (rc < 0) { pr_err("%s:session id %d: cmd qcelp media format block" "failed\n", __func__, audio->ac->session); break; } if (audio->feedback == NON_TUNNEL_MODE) { rc = q6asm_media_format_block_pcm(audio->ac, audio->pcm_cfg.sample_rate, audio->pcm_cfg.channel_count); if (rc < 0) { pr_err("%s:session id %d: media format block" "failed\n", __func__, audio->ac->session); break; } } pr_debug("%s:session id %d: AUDIO_START enable[%d]\n", __func__, audio->ac->session, audio->enabled); rc = audio_in_enable(audio); if (!rc) { audio->enabled = 1; } else { audio->enabled = 0; pr_err("%s:session id %d: Audio Start procedure failed" "rc=%d\n", __func__, audio->ac->session, rc); break; } while (cnt++ < audio->str_cfg.buffer_count) q6asm_read(audio->ac); rc = 0; pr_debug("%s:session id %d: AUDIO_START success enable[%d]\n", __func__, audio->ac->session, audio->enabled); break; } case AUDIO_STOP: { pr_debug("%s:session id %d: AUDIO_STOP\n", __func__, audio->ac->session); rc = audio_in_disable(audio); if (rc < 0) { pr_err("%s:session id %d: Audio Stop procedure failed" "rc=%d\n", __func__, audio->ac->session, rc); break; } break; } case AUDIO_GET_QCELP_ENC_CONFIG: { if (copy_to_user((void *)arg, audio->enc_cfg, sizeof(struct msm_audio_qcelp_enc_config))) rc = -EFAULT; break; } case AUDIO_SET_QCELP_ENC_CONFIG: { struct msm_audio_qcelp_enc_config cfg; struct msm_audio_qcelp_enc_config *enc_cfg; enc_cfg = audio->enc_cfg; if (copy_from_user(&cfg, (void *) arg, sizeof(struct msm_audio_qcelp_enc_config))) { rc = -EFAULT; break; } if (cfg.min_bit_rate > 4 || cfg.min_bit_rate < 1) { pr_err("%s:session id %d: invalid min bitrate\n", __func__, audio->ac->session); rc = -EINVAL; break; } if (cfg.max_bit_rate > 4 || cfg.max_bit_rate < 1) { pr_err("%s:session id %d: invalid max bitrate\n", __func__, audio->ac->session); rc = -EINVAL; break; } enc_cfg->min_bit_rate = cfg.min_bit_rate; enc_cfg->max_bit_rate = cfg.max_bit_rate; pr_debug("%s:session id %d: min_bit_rate= 0x%x" "max_bit_rate=0x%x\n", __func__, audio->ac->session, enc_cfg->min_bit_rate, enc_cfg->max_bit_rate); break; } default: rc = -EINVAL; } return rc; }