static int audio_open(struct inode *inode, struct file *file) { struct audio *audio = &fm_audio; int rc = 0; MM_DBG("\n"); /* Macro prints the file name and function */ mutex_lock(&audio->lock); if (audio->opened) { MM_ERR("busy\n"); rc = -EBUSY; goto done; } rc = audmgr_open(&audio->audmgr); if (rc) { MM_ERR("%s: failed to register listnet\n", __func__); goto done; } file->private_data = audio; audio->opened = 1; done: mutex_unlock(&audio->lock); return rc; }
static int audio_in_open(struct inode *inode, struct file *file) { struct audio_in *audio = &the_audio_in; int rc; mutex_lock(&audio->lock); if (audio->opened) { rc = -EBUSY; goto done; } /* Settings will be re-config at AUDIO_SET_CONFIG, * but at least we need to have initial config */ audio->samp_rate = RPC_AUD_DEF_SAMPLE_RATE_11025; audio->samp_rate_index = AUDREC_CMD_SAMP_RATE_INDX_11025; audio->channel_mode = AUDREC_CMD_STEREO_MODE_MONO; audio->buffer_size = MONO_DATA_SIZE; audio->type = AUDREC_CMD_TYPE_0_INDEX_WAV; /* For AAC, bit rate hard coded, default settings is * sample rate (11025) x channel count (1) x recording quality (1.75) * = 19293 bps */ audio->bit_rate = 19293; audio->record_quality = 0x1c00; rc = audmgr_open(&audio->audmgr); if (rc) goto done; rc = msm_adsp_get("AUDPREPROCTASK", &audio->audpre, &audpre_adsp_ops, audio); if (rc) goto done; rc = msm_adsp_get("AUDRECTASK", &audio->audrec, &audrec_adsp_ops, audio); if (rc) goto done; audio->dsp_cnt = 0; audio->stopped = 0; audio->buffer_cfg_ioctl = 0; /* No valid ioctl set */ audio_flush(audio); file->private_data = audio; audio->opened = 1; rc = 0; done: mutex_unlock(&audio->lock); return rc; }
static int audio_amrnb_in_open(struct inode *inode, struct file *file) { struct audio_amrnb_in *audio = &the_audio_amrnb_in; int rc; mutex_lock(&audio->lock); if (audio->opened) { rc = -EBUSY; goto done; } if (!audio->data) { audio->data = dma_alloc_coherent(NULL, DMASZ, &audio->phys, GFP_KERNEL); if (!audio->data) { rc = -ENOMEM; goto done; } } rc = audmgr_open(&audio->audmgr); if (rc) goto err; audio->buffer_size = FRAME_SIZE - 8; audio->enc_type = 10; audio->amrnb_enc_cfg.voicememoencweight1 = 0x0000; audio->amrnb_enc_cfg.voicememoencweight2 = 0x0000; audio->amrnb_enc_cfg.voicememoencweight3 = 0x4000; audio->amrnb_enc_cfg.voicememoencweight4 = 0x0000; audio->amrnb_enc_cfg.dtx_mode_enable = 0; audio->amrnb_enc_cfg.test_mode_enable = 0; audio->amrnb_enc_cfg.enc_mode = 7; audio->dsp_cnt = 0; audio->stopped = 0; audio_amrnb_in_flush(audio); file->private_data = audio; audio->opened = 1; rc = 0; goto done; err: dma_free_coherent(NULL, DMASZ, audio->data, audio->phys); done: mutex_unlock(&audio->lock); return rc; }
static int audio_in_open(struct inode *inode, struct file *file) { struct audio_in *audio = &the_audio_in; int rc; mutex_lock(&audio->lock); if (audio->opened) { rc = -EBUSY; goto done; } /* Settings will be re-config at AUDIO_SET_CONFIG, * but at least we need to have initial config */ audio->samp_rate = RPC_AUD_DEF_SAMPLE_RATE_11025; audio->samp_rate_index = AUDREC_CMD_SAMP_RATE_INDX_11025; audio->channel_mode = AUDREC_CMD_STEREO_MODE_MONO; audio->buffer_size = MONO_DATA_SIZE; audio->type = AUDREC_CMD_TYPE_0_INDEX_WAV; rc = audmgr_open(&audio->audmgr); if (rc) goto done; rc = msm_adsp_get("AUDPREPROCTASK", &audio->audpre, &audpre_adsp_ops, audio); if (rc) goto done; rc = msm_adsp_get("AUDRECTASK", &audio->audrec, &audrec_adsp_ops, audio); if (rc) goto done; audio->audmgr.handle = 0xFFFF; audio->dsp_cnt = 0; audio->stopped = 0; audio_flush(audio); file->private_data = audio; audio->opened = 1; rc = 0; done: mutex_unlock(&audio->lock); return rc; }
static int audpcm_in_open(struct inode *inode, struct file *file) { struct audio_in *audio = &the_audio_in; int rc; int len = 0; unsigned long ionflag = 0; ion_phys_addr_t addr = 0; struct ion_handle *handle = NULL; struct ion_client *client = NULL; int encid; mutex_lock(&audio->lock); if (audio->opened) { rc = -EBUSY; goto done; } /* Settings will be re-config at AUDIO_SET_CONFIG, * but at least we need to have initial config */ audio->mode = MSM_AUD_ENC_MODE_TUNNEL; audio->samp_rate = RPC_AUD_DEF_SAMPLE_RATE_11025; audio->samp_rate_index = AUDREC_CMD_SAMP_RATE_INDX_11025; audio->channel_mode = AUDREC_CMD_STEREO_MODE_MONO; audio->buffer_size = MONO_DATA_SIZE; audio->enc_type = AUDREC_CMD_TYPE_0_INDEX_WAV | audio->mode; rc = audmgr_open(&audio->audmgr); if (rc) goto done; encid = audpreproc_aenc_alloc(audio->enc_type, &audio->module_name, &audio->queue_ids); if (encid < 0) { MM_ERR("No free encoder available\n"); rc = -ENODEV; goto done; } audio->enc_id = encid; rc = msm_adsp_get(audio->module_name, &audio->audrec, &audrec_adsp_ops, audio); if (rc) { audpreproc_aenc_free(audio->enc_id); goto done; } rc = msm_adsp_get("AUDPREPROCTASK", &audio->audpre, &audpre_adsp_ops, audio); if (rc) { msm_adsp_put(audio->audrec); audpreproc_aenc_free(audio->enc_id); goto done; } audio->dsp_cnt = 0; audio->stopped = 0; audpcm_in_flush(audio); client = msm_ion_client_create(UINT_MAX, "Audio_PCM_in_client"); if (IS_ERR_OR_NULL(client)) { MM_ERR("Unable to create ION client\n"); rc = -ENOMEM; goto client_create_error; } audio->client = client; MM_DBG("allocating mem sz = %d\n", DMASZ); handle = ion_alloc(client, DMASZ, SZ_4K, ION_HEAP(ION_AUDIO_HEAP_ID), 0); if (IS_ERR_OR_NULL(handle)) { MM_ERR("Unable to create allocate O/P buffers\n"); rc = -ENOMEM; goto output_buff_alloc_error; } audio->output_buff_handle = handle; rc = ion_phys(client , handle, &addr, &len); if (rc) { MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", (unsigned int) addr, (unsigned int) len); rc = -ENOMEM; goto output_buff_get_phys_error; } else { MM_INFO("O/P buffers:valid phy: %x sz: %x\n", (unsigned int) addr, (unsigned int) len); } audio->phys = (int32_t)addr; rc = ion_handle_get_flags(client, handle, &ionflag); if (rc) { MM_ERR("could not get flags for the handle\n"); rc = -ENOMEM; goto output_buff_get_flags_error; } audio->data = ion_map_kernel(client, handle); if (IS_ERR(audio->data)) { MM_ERR("could not map read buffers,freeing instance 0x%08x\n", (int)audio); rc = -ENOMEM; goto output_buff_map_error; } MM_DBG("read buf: phy addr 0x%08x kernel addr 0x%08x\n", audio->phys, (int)audio->data); file->private_data = audio; audio->opened = 1; rc = 0; done: mutex_unlock(&audio->lock); return rc; output_buff_map_error: output_buff_get_phys_error: output_buff_get_flags_error: ion_free(client, audio->output_buff_handle); output_buff_alloc_error: ion_client_destroy(client); client_create_error: msm_adsp_put(audio->audrec); msm_adsp_put(audio->audpre); audpreproc_aenc_free(audio->enc_id); mutex_unlock(&audio->lock); return rc; }
int audio_adsp_configure(struct msm_audio *prtd) { int ret, i; if (prtd->dir == SNDRV_PCM_STREAM_PLAYBACK) { prtd->data = prtd->playback_substream->dma_buffer.area; prtd->phys = prtd->playback_substream->dma_buffer.addr; } if (prtd->dir == SNDRV_PCM_STREAM_CAPTURE) { prtd->data = prtd->capture_substream->dma_buffer.area; prtd->phys = prtd->capture_substream->dma_buffer.addr; } if (!prtd->data) { ret = -ENOMEM; goto err1; } ret = audmgr_open(&prtd->audmgr); if (ret) goto err2; if (prtd->dir == SNDRV_PCM_STREAM_PLAYBACK) { prtd->out_buffer_size = PLAYBACK_DMASZ; prtd->out_sample_rate = 44100; prtd->out_channel_mode = AUDPP_CMD_PCM_INTF_STEREO_V; prtd->out_weight = 100; prtd->out[0].data = prtd->data + 0; prtd->out[0].addr = prtd->phys + 0; prtd->out[0].size = BUFSZ; prtd->out[1].data = prtd->data + BUFSZ; prtd->out[1].addr = prtd->phys + BUFSZ; prtd->out[1].size = BUFSZ; } if (prtd->dir == SNDRV_PCM_STREAM_CAPTURE) { prtd->samp_rate = RPC_AUD_DEF_SAMPLE_RATE_44100; prtd->samp_rate_index = AUDREC_CMD_SAMP_RATE_INDX_44100; prtd->channel_mode = AUDREC_CMD_STEREO_MODE_STEREO; prtd->buffer_size = STEREO_DATA_SIZE; prtd->type = AUDREC_CMD_TYPE_0_INDEX_WAV; prtd->tx_agc_cfg.cmd_id = AUDPREPROC_CMD_CFG_AGC_PARAMS; prtd->ns_cfg.cmd_id = AUDPREPROC_CMD_CFG_NS_PARAMS; prtd->iir_cfg.cmd_id = AUDPREPROC_CMD_CFG_IIR_TUNING_FILTER_PARAMS; ret = msm_adsp_get("AUDPREPROCTASK", &prtd->audpre, &aud_pre_adsp_ops, prtd); if (ret) goto err3; ret = msm_adsp_get("AUDRECTASK", &prtd->audrec, &aud_rec_adsp_ops, prtd); if (ret) { msm_adsp_put(prtd->audpre); goto err3; } prtd->dsp_cnt = 0; prtd->in_head = 0; prtd->in_tail = 0; prtd->in_count = 0; for (i = 0; i < FRAME_NUM; i++) { prtd->in[i].size = 0; prtd->in[i].read = 0; } } return 0; err3: audmgr_close(&prtd->audmgr); err2: prtd->data = NULL; err1: return ret; }
static int audpcm_in_open(struct inode *inode, struct file *file) { struct audio_in *audio = &the_audio_in; int rc; int len = 0; unsigned long ionflag = 0; ion_phys_addr_t addr = 0; struct ion_handle *handle = NULL; struct ion_client *client = NULL; int encid; struct timespec ts; struct rtc_time tm; mutex_lock(&audio->lock); if (audio->opened) { rc = -EBUSY; goto done; } audio->mode = MSM_AUD_ENC_MODE_TUNNEL; audio->samp_rate = RPC_AUD_DEF_SAMPLE_RATE_11025; audio->samp_rate_index = AUDREC_CMD_SAMP_RATE_INDX_11025; audio->channel_mode = AUDREC_CMD_STEREO_MODE_MONO; audio->buffer_size = MONO_DATA_SIZE; audio->enc_type = AUDREC_CMD_TYPE_0_INDEX_WAV | audio->mode; rc = audmgr_open(&audio->audmgr); if (rc) goto done; encid = audpreproc_aenc_alloc(audio->enc_type, &audio->module_name, &audio->queue_ids); if (encid < 0) { MM_AUD_ERR("No free encoder available\n"); rc = -ENODEV; goto done; } audio->enc_id = encid; rc = msm_adsp_get(audio->module_name, &audio->audrec, &audrec_adsp_ops, audio); if (rc) { audpreproc_aenc_free(audio->enc_id); goto done; } audio->dsp_cnt = 0; audio->stopped = 0; audpcm_in_flush(audio); client = msm_ion_client_create(UINT_MAX, "Audio_PCM_in_client"); if (IS_ERR_OR_NULL(client)) { MM_ERR("Unable to create ION client\n"); rc = -ENOMEM; goto client_create_error; } audio->client = client; MM_DBG("allocating mem sz = %d\n", DMASZ); handle = ion_alloc(client, DMASZ, SZ_4K, ION_HEAP(ION_AUDIO_HEAP_ID)); if (IS_ERR_OR_NULL(handle)) { MM_ERR("Unable to create allocate O/P buffers\n"); rc = -ENOMEM; goto output_buff_alloc_error; } audio->output_buff_handle = handle; rc = ion_phys(client , handle, &addr, &len); if (rc) { MM_ERR("O/P buffers:Invalid phy: %x sz: %x\n", (unsigned int) addr, (unsigned int) len); rc = -ENOMEM; goto output_buff_get_phys_error; } else { MM_INFO("O/P buffers:valid phy: %x sz: %x\n", (unsigned int) addr, (unsigned int) len); } audio->phys = (int32_t)addr; rc = ion_handle_get_flags(client, handle, &ionflag); if (rc) { MM_ERR("could not get flags for the handle\n"); rc = -ENOMEM; goto output_buff_get_flags_error; } audio->data = ion_map_kernel(client, handle, ionflag); if (IS_ERR(audio->data)) { MM_ERR("could not map read buffers,freeing instance 0x%08x\n", (int)audio); rc = -ENOMEM; goto output_buff_map_error; } MM_DBG("read buf: phy addr 0x%08x kernel addr 0x%08x\n", audio->phys, (int)audio->data); file->private_data = audio; audio->opened = 1; rc = 0; done: mutex_unlock(&audio->lock); getnstimeofday(&ts); rtc_time_to_tm(ts.tv_sec, &tm); pr_aud_info1("[ATS][start_recording][successful] at %lld \ (%d-%02d-%02d %02d:%02d:%02d.%09lu UTC)\n", ktime_to_ns(ktime_get()), tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, ts.tv_nsec); return rc; output_buff_map_error: output_buff_get_phys_error: output_buff_get_flags_error: ion_free(client, audio->output_buff_handle); output_buff_alloc_error: ion_client_destroy(client); client_create_error: msm_adsp_put(audio->audrec); audpreproc_aenc_free(audio->enc_id); mutex_unlock(&audio->lock); return rc; }