static int amrnb_in_open(struct inode *inode, struct file *file) { struct q6audio_in *audio = NULL; struct msm_audio_amrnb_enc_config_v2 *enc_cfg; int rc = 0; audio = kzalloc(sizeof(struct q6audio_in), GFP_KERNEL); if (audio == NULL) { pr_err("%s Could not allocate memory for amrnb" "driver\n", __func__); return -ENOMEM; } audio->enc_cfg = kzalloc(sizeof(struct msm_audio_amrnb_enc_config_v2), GFP_KERNEL); if (audio->enc_cfg == NULL) { pr_err("%s:session id %d: Could not allocate memory for aac" "config param\n", __func__, audio->ac->session); kfree(audio); return -ENOMEM; } enc_cfg = audio->enc_cfg; mutex_init(&audio->lock); mutex_init(&audio->read_lock); mutex_init(&audio->write_lock); spin_lock_init(&audio->dsp_lock); init_waitqueue_head(&audio->read_wait); init_waitqueue_head(&audio->write_wait); audio->str_cfg.buffer_size = FRAME_SIZE; audio->str_cfg.buffer_count = FRAME_NUM; audio->min_frame_size = 32; audio->max_frames_per_buf = 10; audio->pcm_cfg.buffer_size = PCM_BUF_SIZE; audio->pcm_cfg.buffer_count = PCM_BUF_COUNT; enc_cfg->band_mode = 7; enc_cfg->dtx_enable = 0; audio->pcm_cfg.channel_count = 1; audio->pcm_cfg.sample_rate = 8000; audio->buf_cfg.meta_info_enable = 0x01; audio->buf_cfg.frames_per_buf = 0x01; audio->ac = q6asm_audio_client_alloc((app_cb)q6asm_in_cb, (void *)audio); if (!audio->ac) { pr_err("%s: Could not allocate memory for audio" "client\n", __func__); kfree(audio->enc_cfg); kfree(audio); return -ENOMEM; } if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { audio->feedback = NON_TUNNEL_MODE; rc = q6asm_open_read_write(audio->ac, FORMAT_AMRNB, FORMAT_LINEAR_PCM); if (rc < 0) { pr_err("%s:session id %d: NT mode Open failed rc=%d\n", __func__, audio->ac->session, rc); rc = -ENODEV; goto fail; } pr_info("%s:session id %d: NT mode encoder success\n", __func__, audio->ac->session); } else if (!(file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { audio->feedback = TUNNEL_MODE; rc = q6asm_open_read(audio->ac, FORMAT_AMRNB); if (rc < 0) { pr_err("%s:session id %d: T mode Open failed rc=%d\n", __func__, audio->ac->session, rc); rc = -ENODEV; goto fail; } rc = q6asm_reg_tx_overflow(audio->ac, 0x01); if (rc < 0) { pr_err("%s:session id %d: TX Overflow registration" "failed rc=%d\n", __func__, audio->ac->session, rc); rc = -ENODEV; goto fail; } pr_info("%s:session id %d: T mode encoder success\n", __func__, audio->ac->session); } else { pr_err("%s:session id %d: Unexpected mode\n", __func__, audio->ac->session); rc = -EACCES; goto fail; } audio->opened = 1; atomic_set(&audio->in_count, PCM_BUF_COUNT); atomic_set(&audio->out_count, 0x00); audio->enc_ioctl = amrnb_in_ioctl; file->private_data = audio; pr_info("%s:session id %d: success\n", __func__, audio->ac->session); return 0; fail: q6asm_audio_client_free(audio->ac); kfree(audio->enc_cfg); kfree(audio); return rc; }
static int aac_in_open(struct inode *inode, struct file *file) { struct q6audio_in *audio = NULL; struct msm_audio_aac_enc_config *enc_cfg; struct msm_audio_aac_config *aac_config; int rc = 0; audio = kzalloc(sizeof(struct q6audio_in), GFP_KERNEL); if (audio == NULL) { pr_err("%s: Could not allocate memory for aac" "driver\n", __func__); return -ENOMEM; } /* */ audio->enc_cfg = kzalloc(sizeof(struct msm_audio_aac_enc_config), GFP_KERNEL); if (audio->enc_cfg == NULL) { pr_err("%s:session id %d: Could not allocate memory for aac" "config param\n", __func__, audio->ac->session); kfree(audio); return -ENOMEM; } enc_cfg = audio->enc_cfg; audio->codec_cfg = kzalloc(sizeof(struct msm_audio_aac_config), GFP_KERNEL); if (audio->codec_cfg == NULL) { pr_err("%s:session id %d: Could not allocate memory for aac" "config\n", __func__, audio->ac->session); kfree(audio->enc_cfg); kfree(audio); return -ENOMEM; } aac_config = audio->codec_cfg; mutex_init(&audio->lock); mutex_init(&audio->read_lock); mutex_init(&audio->write_lock); spin_lock_init(&audio->dsp_lock); init_waitqueue_head(&audio->read_wait); init_waitqueue_head(&audio->write_wait); /* */ audio->str_cfg.buffer_size = FRAME_SIZE; audio->str_cfg.buffer_count = FRAME_NUM; audio->min_frame_size = 1536; audio->max_frames_per_buf = 5; enc_cfg->sample_rate = 8000; enc_cfg->channels = 1; enc_cfg->bit_rate = 16000; enc_cfg->stream_format = 0x00;/* */ audio->buf_cfg.meta_info_enable = 0x01; audio->buf_cfg.frames_per_buf = 0x01; audio->pcm_cfg.buffer_count = PCM_BUF_COUNT; audio->pcm_cfg.buffer_size = PCM_BUF_SIZE; aac_config->format = AUDIO_AAC_FORMAT_ADTS; aac_config->audio_object = AUDIO_AAC_OBJECT_LC; aac_config->sbr_on_flag = 0; aac_config->sbr_ps_on_flag = 0; aac_config->channel_configuration = 1; audio->ac = q6asm_audio_client_alloc((app_cb)q6asm_in_cb, (void *)audio); if (!audio->ac) { pr_err("%s: Could not allocate memory for" "audio client\n", __func__); kfree(audio->enc_cfg); kfree(audio->codec_cfg); kfree(audio); return -ENOMEM; } /* */ audio->buf_cfg.frames_per_buf = 0x01; if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { audio->feedback = NON_TUNNEL_MODE; rc = q6asm_open_read_write(audio->ac, FORMAT_MPEG4_AAC, FORMAT_LINEAR_PCM); if (rc < 0) { pr_err("%s:session id %d: NT Open failed rc=%d\n", __func__, audio->ac->session, rc); rc = -ENODEV; goto fail; } audio->buf_cfg.meta_info_enable = 0x01; pr_info("%s:session id %d: NT mode encoder success\n", __func__, audio->ac->session); } else if (!(file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { audio->feedback = TUNNEL_MODE; rc = q6asm_open_read(audio->ac, FORMAT_MPEG4_AAC); if (rc < 0) { pr_err("%s:session id %d: Tunnel Open failed rc=%d\n", __func__, audio->ac->session, rc); rc = -ENODEV; goto fail; } /* */ rc = q6asm_reg_tx_overflow(audio->ac, 0x01); if (rc < 0) { pr_err("%s:session id %d: TX Overflow registration" "failed rc=%d\n", __func__, audio->ac->session, rc); rc = -ENODEV; goto fail; } audio->buf_cfg.meta_info_enable = 0x00; pr_info("%s:session id %d: T mode encoder success\n", __func__, audio->ac->session); } else { pr_err("%s:session id %d: Unexpected mode\n", __func__, audio->ac->session); rc = -EACCES; goto fail; } audio->opened = 1; atomic_set(&audio->in_count, PCM_BUF_COUNT); atomic_set(&audio->out_count, 0x00); audio->enc_ioctl = aac_in_ioctl; file->private_data = audio; pr_info("%s:session id %d: success\n", __func__, audio->ac->session); return 0; fail: q6asm_audio_client_free(audio->ac); kfree(audio->enc_cfg); kfree(audio->codec_cfg); kfree(audio); return rc; }
static int evrc_in_open(struct inode *inode, struct file *file) { struct q6audio_in *audio = NULL; struct msm_audio_evrc_enc_config *enc_cfg; int rc = 0; audio = kzalloc(sizeof(struct q6audio_in), GFP_KERNEL); if (audio == NULL) { pr_err("%s: Could not allocate memory for evrc" "driver\n", __func__); return -ENOMEM; } /* Allocate memory for encoder config param */ audio->enc_cfg = kzalloc(sizeof(struct msm_audio_evrc_enc_config), GFP_KERNEL); if (audio->enc_cfg == NULL) { pr_err("%s:session id %d: Could not allocate memory for aac" "config param\n", __func__, audio->ac->session); kfree(audio); return -ENOMEM; } enc_cfg = audio->enc_cfg; mutex_init(&audio->lock); mutex_init(&audio->read_lock); mutex_init(&audio->write_lock); spin_lock_init(&audio->dsp_lock); init_waitqueue_head(&audio->read_wait); init_waitqueue_head(&audio->write_wait); /* Settings will be re-config at AUDIO_SET_CONFIG, * but at least we need to have initial config */ audio->str_cfg.buffer_size = FRAME_SIZE; audio->str_cfg.buffer_count = FRAME_NUM; audio->min_frame_size = 23; audio->max_frames_per_buf = 10; audio->pcm_cfg.buffer_size = PCM_BUF_SIZE; audio->pcm_cfg.buffer_count = PCM_BUF_COUNT; enc_cfg->min_bit_rate = 4; enc_cfg->max_bit_rate = 4; audio->pcm_cfg.channel_count = 1; audio->pcm_cfg.sample_rate = 8000; audio->buf_cfg.meta_info_enable = 0x01; audio->buf_cfg.frames_per_buf = 0x01; audio->ac = q6asm_audio_client_alloc((app_cb)q6asm_in_cb, (void *)audio); if (!audio->ac) { pr_err("%s: Could not allocate memory for audio" "client\n", __func__); kfree(audio->enc_cfg); kfree(audio); return -ENOMEM; } /* open evrc encoder in T/NT mode */ if ((file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { audio->feedback = NON_TUNNEL_MODE; rc = q6asm_open_read_write(audio->ac, FORMAT_EVRC, FORMAT_LINEAR_PCM); if (rc < 0) { pr_err("%s:session id %d: NT mode Open failed rc=%d\n", __func__, audio->ac->session, rc); rc = -ENODEV; goto fail; } pr_info("%s:session id %d: NT mode encoder success\n", __func__, audio->ac->session); } else if (!(file->f_mode & FMODE_WRITE) && (file->f_mode & FMODE_READ)) { audio->feedback = TUNNEL_MODE; rc = q6asm_open_read(audio->ac, FORMAT_EVRC); if (rc < 0) { pr_err("%s:session id %d: T mode Open failed rc=%d\n", __func__, audio->ac->session, rc); rc = -ENODEV; goto fail; } /* register for tx overflow (valid for tunnel mode only) */ rc = q6asm_reg_tx_overflow(audio->ac, 0x01); if (rc < 0) { pr_err("%s:session id %d: TX Overflow registration" "failed rc=%d\n", __func__, audio->ac->session, rc); rc = -ENODEV; goto fail; } pr_info("%s:session id %d: T mode encoder success\n", __func__, audio->ac->session); } else { pr_err("%s:session id %d: Unexpected mode\n", __func__, audio->ac->session); rc = -EACCES; goto fail; } audio->opened = 1; atomic_set(&audio->in_count, PCM_BUF_COUNT); atomic_set(&audio->out_count, 0x00); audio->enc_ioctl = evrc_in_ioctl; file->private_data = audio; pr_info("%s:session id %d: success\n", __func__, audio->ac->session); return 0; fail: q6asm_audio_client_free(audio->ac); kfree(audio->enc_cfg); kfree(audio); return rc; }