static int audpcm_in_release(struct inode *inode, struct file *file) { struct audio_in *audio = file->private_data; struct timespec ts; struct rtc_time tm; mutex_lock(&audio->lock); /* with draw frequency for session incase not stopped the driver */ msm_snddev_withdraw_freq(audio->enc_id, SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); auddev_unregister_evt_listner(AUDDEV_CLNT_ENC, audio->enc_id); audpcm_in_disable(audio); audpcm_in_flush(audio); msm_adsp_put(audio->audrec); audpreproc_aenc_free(audio->enc_id); audio->audrec = NULL; audio->opened = 0; mutex_unlock(&audio->lock); getnstimeofday(&ts); rtc_time_to_tm(ts.tv_sec, &tm); pr_aud_info1("[ATS][stop_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 0; }
static int audamrnb_in_release(struct inode *inode, struct file *file) { struct audio_in *audio = file->private_data; MM_DBG("\n"); mutex_lock(&audio->lock); audio->in_call = 0; /* with draw frequency for session incase not stopped the driver */ msm_snddev_withdraw_freq(audio->enc_id, SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); auddev_unregister_evt_listner(AUDDEV_CLNT_ENC, audio->enc_id); audamrnb_in_disable(audio); audamrnb_in_flush(audio); msm_adsp_put(audio->audrec); audpreproc_aenc_free(audio->enc_id); audio->audrec = NULL; audio->opened = 0; if (audio->data) { iounmap(audio->data); pmem_kfree(audio->phys); audio->data = NULL; } mutex_unlock(&audio->lock); return 0; }
static int auda2dp_in_release(struct inode *inode, struct file *file) { struct audio_a2dp_in *audio = file->private_data; mutex_lock(&audio->lock); /* with draw frequency for session incase not stopped the driver */ msm_snddev_withdraw_freq(audio->enc_id, SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); auddev_unregister_evt_listner(AUDDEV_CLNT_ENC, audio->enc_id); /*reset the sampling frequency information at audpreproc layer*/ audio->session_info.sampling_freq = 0; audpreproc_update_audrec_info(&audio->session_info); auda2dp_in_disable(audio); auda2dp_in_flush(audio); msm_adsp_put(audio->audrec); audpreproc_aenc_free(audio->enc_id); audio->audrec = NULL; audio->opened = 0; if (audio->data) { msm_subsystem_unmap_buffer(audio->msm_map); free_contiguous_memory_by_paddr(audio->phys); audio->data = NULL; } mutex_unlock(&audio->lock); return 0; }
static int audpcm_in_release(struct inode *inode, struct file *file) { struct audio_in *audio = file->private_data; if (!audio) return 0; mutex_lock(&audio->lock); audio->in_call = 0; msm_snddev_withdraw_freq(audio->enc_id, SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); auddev_unregister_evt_listner(AUDDEV_CLNT_ENC, audio->enc_id); audpcm_in_disable(audio); audpcm_in_flush(audio); if (audio->audrec) msm_adsp_put(audio->audrec); if (audio->enc_id >=0) audpreproc_aenc_free(audio->enc_id); iounmap(audio->data); pmem_kfree(audio->phys); mutex_unlock(&audio->lock); kfree(audio); #ifdef TEST_ONLY current_audio_in = 0; #endif MM_DBG("closed.\n"); return 0; }
static int audamrnb_in_release(struct inode *inode, struct file *file) { struct audio_in *audio = file->private_data; MM_DBG("\n"); mutex_lock(&audio->lock); audio->in_call = 0; /* with draw frequency for session incase not stopped the driver */ msm_snddev_withdraw_freq(audio->enc_id, SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); auddev_unregister_evt_listner(AUDDEV_CLNT_ENC, audio->enc_id); /*reset the sampling frequency information at audpreproc layer*/ audio->session_info.sampling_freq = 0; audpreproc_update_audrec_info(&audio->session_info); audamrnb_in_disable(audio); audamrnb_in_flush(audio); msm_adsp_put(audio->audrec); audpreproc_aenc_free(audio->enc_id); audio->audrec = NULL; audio->opened = 0; if (audio->data) { ion_unmap_kernel(audio->client, audio->buff_handle); ion_free(audio->client, audio->buff_handle); ion_client_destroy(audio->client); audio->data = NULL; } mutex_unlock(&audio->lock); return 0; }
static int fm_audio_release(struct inode *inode, struct file *file) { struct audio *audio = file->private_data; pr_debug("audio instance 0x%08x freeing\n", (int)audio); mutex_lock(&audio->lock); auddev_unregister_evt_listner(AUDDEV_CLNT_DEC, audio->dec_id); fm_audio_disable(audio); audio->running = 0; audio->enabled = 0; audio->opened = 0; mutex_unlock(&audio->lock); return 0; }
static int audqcelp_in_release(struct inode *inode, struct file *file) { struct audio_in *audio = file->private_data; MM_DBG("\n"); mutex_lock(&audio->lock); audio->in_call = 0; auddev_unregister_evt_listner(AUDDEV_CLNT_ENC, audio->enc_id); audqcelp_in_disable(audio); audqcelp_in_flush(audio); msm_adsp_put(audio->audrec); audpreproc_aenc_free(audio->enc_id); audio->audrec = NULL; audio->opened = 0; mutex_unlock(&audio->lock); return 0; }
static int audamrnb_in_release(struct inode *inode, struct file *file) { struct audio_in *audio = file->private_data; mutex_lock(&audio->lock); audio->in_call = 0; msm_snddev_withdraw_freq(audio->enc_id, SNDDEV_CAP_TX, AUDDEV_CLNT_ENC); auddev_unregister_evt_listner(AUDDEV_CLNT_ENC, audio->enc_id); audamrnb_in_disable(audio); audamrnb_in_flush(audio); msm_adsp_put(audio->audrec); audpreproc_aenc_free(audio->enc_id); atomic_set(&audio->opened,0); mutex_unlock(&audio->lock); MM_DBG("closed.\n"); return 0; }
static int audpcm_in_open(struct inode *inode, struct file *file) { struct audio_in *audio; const char *modname; int rc; audio = kzalloc(sizeof(struct audio_in), GFP_KERNEL); if (!audio) return -ENOMEM; #ifdef TEST_ONLY current_audio_in = audio; #endif audio->phys = pmem_kalloc(DMASZ, PMEM_MEMTYPE_EBI1 | PMEM_ALIGNMENT_4K); if (!IS_ERR((void *) audio->phys)) { audio->data = ioremap(audio->phys, DMASZ); if (!audio->data) { MM_AUD_ERR("Could not remap DMA buffers\n"); pmem_kfree(audio->phys); kfree(audio); return -ENOMEM; } } else { MM_AUD_ERR("Could not allocate DMA buffers\n"); kfree(audio); return -ENOMEM; } audio->enc_id = audpreproc_aenc_alloc(ENC_TYPE_WAV | MSM_AUD_ENC_MODE_TUNNEL, &modname, &audio->queue_ids); if (audio->enc_id < 0) { MM_AUD_ERR("No free encoder available\n"); rc = -ENODEV; goto no_aenc; } MM_DBG("allocated encoder %d, module %s\n", audio->enc_id, modname); rc = auddev_register_evt_listner(AUDDEV_EVT_DEV_RDY | AUDDEV_EVT_DEV_RLS | AUDDEV_EVT_FREQ_CHG | AUDDEV_EVT_VOICE_STATE_CHG, AUDDEV_CLNT_ENC, audio->enc_id, audpcm_in_listener, audio); if (rc) { MM_AUD_ERR("failed to register device event listener\n"); goto evt_error; } rc = msm_adsp_get(modname, &audio->audrec, &audrec_adsp_ops, audio); if (rc) { MM_AUD_ERR("Failed to get AUDREC task\n"); goto no_audrec; } if(!audio->audrec) { MM_AUD_ERR("Null AUDREC task returned by ADSP\n"); rc = -EFAULT; goto no_audrec; } audio->source = INTERNAL_CODEC_TX_SOURCE_MIX_MASK; audio->channel_mode = AUDREC_CMD_MODE_MONO; audio->buffer_size = MONO_DATA_SIZE; audio->samp_rate = 8000; audio->stopped = 0; audio->running = 0; audio->enabled = 0; audpcm_in_flush(audio); mutex_init(&audio->lock); mutex_init(&audio->read_lock); spin_lock_init(&audio->dsp_lock); spin_lock_init(&audio->dev_lock); init_waitqueue_head(&audio->wait); init_waitqueue_head(&audio->wait_enable); init_waitqueue_head(&audio->wait_voice_incall); init_waitqueue_head(&audio->wait_rec_cfg); audio->voice_state = msm_get_voice_state(); file->private_data = audio; return rc; no_audrec: auddev_unregister_evt_listner(AUDDEV_CLNT_ENC, audio->enc_id); evt_error: audpreproc_aenc_free(audio->enc_id); no_aenc: iounmap(audio->data); pmem_kfree(audio->phys); kfree(audio); return rc; }
static int audamrnb_in_open(struct inode *inode, struct file *file) { struct audio_in *audio = &the_audio_amrnb_in; const char *modname; int rc; mutex_lock(&audio->lock); if (atomic_read(&audio->opened) != 0) { MM_AUD_ERR("Already open\n"); mutex_unlock(&audio->lock); return -EBUSY; } if (!audio->phys) { audio->phys = pmem_kalloc(DMASZ, PMEM_MEMTYPE_EBI1 | PMEM_ALIGNMENT_4K); if (!IS_ERR((void *) audio->phys)) { audio->data = ioremap(audio->phys, DMASZ); if (!audio->data) { MM_AUD_ERR("Could not remap DMA buffers\n"); pmem_kfree(audio->phys); audio->phys = 0; mutex_unlock(&audio->lock); return -ENOMEM; } } else { MM_AUD_ERR("Could not allocate DMA buffers\n"); audio->phys = 0; mutex_unlock(&audio->lock); return -ENOMEM; } } audio->enc_id = audpreproc_aenc_alloc(ENC_TYPE_AMRNB | MSM_AUD_ENC_MODE_TUNNEL, &modname, &audio->queue_ids); if (audio->enc_id < 0) { MM_ERR("No free encoder available\n"); mutex_unlock(&audio->lock); return -ENODEV; } MM_DBG("allocated encoder %d, module %s\n", audio->enc_id, modname); rc = auddev_register_evt_listner(AUDDEV_EVT_DEV_RDY | AUDDEV_EVT_DEV_RLS | AUDDEV_EVT_VOICE_STATE_CHG, AUDDEV_CLNT_ENC, audio->enc_id, amrnb_in_listener, (void *) audio); if (rc) { MM_ERR("failed to register device event listener\n"); goto evt_error; } rc = msm_adsp_get(modname, &audio->audrec, &audrec_amrnb_adsp_ops, audio); if (rc) { MM_AUD_ERR("Failed to get AUDREC task\n"); goto no_audrec; } if(!audio->audrec) { MM_AUD_ERR("Null AUDREC task returned by ADSP\n"); goto no_audrec; } audio->source = INTERNAL_CODEC_TX_SOURCE_MIX_MASK; audio->buffer_size = (FRAME_SIZE - 8); audio->enc_type = ENC_TYPE_AMRNB | MSM_AUD_ENC_MODE_TUNNEL; audio->dtx_mode = AMRNB_DTX_MODE_ENABLE; audio->used_mode = AMRNB_USED_MODE_MR122; /* Bit Rate 12.2 kbps */ audio->stopped = 0; audio->running = 0; audio->enabled = 0; audamrnb_in_flush(audio); audio->voice_state = msm_get_voice_state(); file->private_data = audio; atomic_set(&audio->opened,1); mutex_unlock(&audio->lock); return rc; no_audrec: auddev_unregister_evt_listner(AUDDEV_CLNT_ENC, audio->enc_id); evt_error: audpreproc_aenc_free(audio->enc_id); mutex_unlock(&audio->lock); return rc; }