Beispiel #1
0
static int config(struct pcm *pcm)
{
	int rc = 0;
	if (!atomic_read(&pcm->out_prefill)) {
		pr_debug("%s: pcm prefill\n", __func__);
		rc = q6asm_audio_client_buf_alloc(IN, pcm->ac,
				pcm->buffer_size, pcm->buffer_count);
		if (rc < 0) {
			pr_err("Audio Start: Buffer Allocation failed \
							rc = %d\n", rc);
			goto fail;
		}
Beispiel #2
0
static int config(struct pcm *pcm)
{
	int rc = 0;

	pr_debug("%s: pcm prefill, buffer_size = %d\n", __func__,
		pcm->buffer_size);
	rc = q6asm_audio_client_buf_alloc(OUT, pcm->ac,
				pcm->buffer_size, pcm->buffer_count);
	if (rc < 0) {
		pr_aud_err("Audio Start: Buffer Allocation failed \
						rc = %d\n", rc);
		goto fail;
	}
Beispiel #3
0
int audio_in_set_config(struct file *file,
		struct msm_audio_config *cfg)
{
	int rc = 0;
	struct q6audio_in  *audio = file->private_data;

	if (audio->feedback != NON_TUNNEL_MODE) {
		pr_err("%s:session id %d: Not sufficient permission to change the record mode\n",
			__func__, audio->ac->session);
		rc = -EACCES;
		goto ret;
	}
	if ((cfg->buffer_count > PCM_BUF_COUNT) ||
		(cfg->buffer_count == 1))
		cfg->buffer_count = PCM_BUF_COUNT;

	audio->pcm_cfg.buffer_count = cfg->buffer_count;
	audio->pcm_cfg.buffer_size  = cfg->buffer_size;
	audio->pcm_cfg.channel_count = cfg->channel_count;
	audio->pcm_cfg.sample_rate = cfg->sample_rate;
	if (audio->opened && audio->feedback == NON_TUNNEL_MODE) {
		rc = q6asm_audio_client_buf_alloc(IN, audio->ac,
			ALIGN_BUF_SIZE(audio->pcm_cfg.buffer_size),
			audio->pcm_cfg.buffer_count);
		if (rc < 0) {
			pr_err("%s:session id %d: Buffer Alloc failed\n",
				__func__, audio->ac->session);
			rc = -ENOMEM;
			goto ret;
		}
	}
	audio->buf_alloc |= BUF_ALLOC_IN;
	rc = 0;
	pr_debug("%s:session id %d: AUDIO_SET_CONFIG %d %d\n", __func__,
			audio->ac->session, audio->pcm_cfg.buffer_count,
			audio->pcm_cfg.buffer_size);
ret:
	return rc;
}
/* ------------------- device --------------------- */
long audio_in_ioctl(struct file *file,
				unsigned int cmd, unsigned long arg)
{
	struct q6audio_in  *audio = file->private_data;
	int rc = 0;

	if (cmd == AUDIO_GET_STATS) {
		struct msm_audio_stats stats;
		memset(&stats, 0, sizeof(stats));
		stats.byte_count = atomic_read(&audio->in_bytes);
		stats.sample_count = atomic_read(&audio->in_samples);
		if (copy_to_user((void *) arg, &stats, sizeof(stats)))
			return -EFAULT;
		return rc;
	}

	mutex_lock(&audio->lock);
	switch (cmd) {
	case AUDIO_FLUSH: {
		/* Make sure we're stopped and we wake any threads
		* that might be blocked holding the read_lock.
		* While audio->stopped read threads will always
		* exit immediately.
		*/
		rc = audio_in_flush(audio);
		if (rc < 0)
			pr_err("%s:session id %d: Flush Fail rc=%d\n",
					__func__, audio->ac->session, rc);
		else { /* Register back the flushed read buffer with DSP */
			int cnt = 0;
			while (cnt++ < audio->str_cfg.buffer_count)
				q6asm_read(audio->ac); /* Push buffer to DSP */
			pr_debug("register the read buffer\n");
		}
		break;
	}
	case AUDIO_PAUSE: {
		pr_debug("%s:session id %d: AUDIO_PAUSE\n", __func__,
					audio->ac->session);
		if (audio->enabled)
			audio_in_pause(audio);
		break;
	}
	case AUDIO_GET_STREAM_CONFIG: {
		struct msm_audio_stream_config cfg;
		memset(&cfg, 0, sizeof(cfg));
		cfg.buffer_size = audio->str_cfg.buffer_size;
		cfg.buffer_count = audio->str_cfg.buffer_count;
		if (copy_to_user((void *)arg, &cfg, sizeof(cfg)))
			rc = -EFAULT;
		pr_debug("%s:session id %d: AUDIO_GET_STREAM_CONFIG %d %d\n",
				__func__, audio->ac->session, cfg.buffer_size,
				cfg.buffer_count);
		break;
	}
	case AUDIO_SET_STREAM_CONFIG: {
		struct msm_audio_stream_config cfg;
		if (copy_from_user(&cfg, (void *)arg, sizeof(cfg))) {
			rc = -EFAULT;
			break;
		}
		/* Minimum single frame size,
		   but with in maximum frames number */
		if ((cfg.buffer_size < (audio->min_frame_size+ \
			sizeof(struct meta_out_dsp))) ||
			(cfg.buffer_count < FRAME_NUM)) {
			rc = -EINVAL;
			break;
		}
		audio->str_cfg.buffer_size = cfg.buffer_size;
		audio->str_cfg.buffer_count = cfg.buffer_count;
		if(audio->opened){
			rc = q6asm_audio_client_buf_alloc(OUT,audio->ac,
				ALIGN_BUF_SIZE(audio->str_cfg.buffer_size),
				audio->str_cfg.buffer_count);
			if (rc < 0) {
			pr_err("%s: session id %d: Buffer Alloc failed rc=%d\n",
				__func__, audio->ac->session, rc);
			rc = -ENOMEM;
			break;
			}
		}
		audio->buf_alloc |= BUF_ALLOC_OUT;
		rc = 0;
		pr_debug("%s:session id %d: AUDIO_SET_STREAM_CONFIG %d %d\n",
				__func__, audio->ac->session,
				audio->str_cfg.buffer_size,
				audio->str_cfg.buffer_count);
		break;
	}
	case AUDIO_GET_SESSION_ID: {
		if (copy_to_user((void *) arg, &audio->ac->session,
			sizeof(unsigned short))) {
			rc = -EFAULT;
		}
		break;
	}
	case AUDIO_SET_BUF_CFG: {
		struct msm_audio_buf_cfg  cfg;
		if (copy_from_user(&cfg, (void *)arg, sizeof(cfg))) {
			rc = -EFAULT;
			break;
		}
		if ((audio->feedback == NON_TUNNEL_MODE) &&
			!cfg.meta_info_enable) {
			rc = -EFAULT;
			break;
		}

		/* Restrict the num of frames per buf to coincide with
		 * default buf size */
		if (cfg.frames_per_buf > audio->max_frames_per_buf) {
			rc = -EFAULT;
			break;
		}
		audio->buf_cfg.meta_info_enable = cfg.meta_info_enable;
		audio->buf_cfg.frames_per_buf = cfg.frames_per_buf;
		pr_debug("%s:session id %d: Set-buf-cfg: meta[%d] framesperbuf[%d]\n",
				__func__,
				audio->ac->session, cfg.meta_info_enable,
				cfg.frames_per_buf);
		break;
	}
	case AUDIO_GET_BUF_CFG: {
		pr_debug("%s:session id %d: Get-buf-cfg: meta[%d] framesperbuf[%d]\n",
			__func__,
			audio->ac->session, audio->buf_cfg.meta_info_enable,
			audio->buf_cfg.frames_per_buf);

		if (copy_to_user((void *)arg, &audio->buf_cfg,
					sizeof(struct msm_audio_buf_cfg)))
			rc = -EFAULT;
		break;
	}
	case AUDIO_GET_CONFIG: {
		if (copy_to_user((void *)arg, &audio->pcm_cfg,
					sizeof(struct msm_audio_config)))
			rc = -EFAULT;
		break;

	}
	case AUDIO_SET_CONFIG: {
		struct msm_audio_config cfg;
		if (copy_from_user(&cfg, (void *)arg, sizeof(cfg))) {
			rc = -EFAULT;
			break;
		}
		if (audio->feedback != NON_TUNNEL_MODE) {
			pr_err("%s:session id %d: Not sufficient permission to change the record mode\n",
					__func__,
					audio->ac->session);
			rc = -EACCES;
			break;
		}
		if ((cfg.buffer_count > PCM_BUF_COUNT) ||
				(cfg.buffer_count == 1))
			cfg.buffer_count = PCM_BUF_COUNT;

		audio->pcm_cfg.buffer_count = cfg.buffer_count;
		audio->pcm_cfg.buffer_size  = cfg.buffer_size;
		audio->pcm_cfg.channel_count = cfg.channel_count;
		audio->pcm_cfg.sample_rate = cfg.sample_rate;
		if(audio->opened && audio->feedback == NON_TUNNEL_MODE){
			rc = q6asm_audio_client_buf_alloc(IN, audio->ac,
				ALIGN_BUF_SIZE(audio->pcm_cfg.buffer_size),
				audio->pcm_cfg.buffer_count);
			if(rc < 0){
				pr_err("%s:session id %d: Buffer Alloc failed\n",
						__func__,audio->ac->session);
				rc = -ENOMEM;
				break;
			}
		}
		audio->buf_alloc |= BUF_ALLOC_IN;
		rc = 0;
		pr_debug("%s:session id %d: AUDIO_SET_CONFIG %d %d\n", __func__,
			audio->ac->session, audio->pcm_cfg.buffer_count,
			audio->pcm_cfg.buffer_size);
		break;
	}
	default:
		/* call codec specific ioctl */
		rc = audio->enc_ioctl(file, cmd, arg);
	}
	mutex_unlock(&audio->lock);
	return rc;
}
int audio_in_buf_alloc(struct q6audio_in *audio)
{
	int rc = 0;

	switch (audio->buf_alloc) {
	case NO_BUF_ALLOC:
		if (audio->feedback == NON_TUNNEL_MODE) {
			rc = q6asm_audio_client_buf_alloc(IN,
				audio->ac,
				ALIGN_BUF_SIZE(audio->pcm_cfg.buffer_size),
				audio->pcm_cfg.buffer_count);
			if (rc < 0) {
				pr_err("%s:session id %d: Buffer Alloc failed\n",
						__func__,
						audio->ac->session);
				rc = -ENOMEM;
				break;
			}
			audio->buf_alloc |= BUF_ALLOC_IN;
		}
		rc = q6asm_audio_client_buf_alloc(OUT, audio->ac,
				ALIGN_BUF_SIZE(audio->str_cfg.buffer_size),
				audio->str_cfg.buffer_count);
		if (rc < 0) {
			pr_err("%s:session id %d: Buffer Alloc failed rc=%d\n",
					__func__, audio->ac->session, rc);
			rc = -ENOMEM;
			break;
		}
		audio->buf_alloc |= BUF_ALLOC_OUT;
		break;
	case BUF_ALLOC_IN:
		rc = q6asm_audio_client_buf_alloc(OUT, audio->ac,
				ALIGN_BUF_SIZE(audio->str_cfg.buffer_size),
				audio->str_cfg.buffer_count);
		if (rc < 0) {
			pr_err("%s:session id %d: Buffer Alloc failed rc=%d\n",
					__func__, audio->ac->session, rc);
			rc = -ENOMEM;
			break;
		}
		audio->buf_alloc |= BUF_ALLOC_OUT;
		break;
	case BUF_ALLOC_OUT:
		if (audio->feedback == NON_TUNNEL_MODE) {
			rc = q6asm_audio_client_buf_alloc(IN, audio->ac,
				ALIGN_BUF_SIZE(audio->pcm_cfg.buffer_size),
				audio->pcm_cfg.buffer_count);
			if (rc < 0) {
				pr_err("%s:session id %d: Buffer Alloc failed\n",
					__func__,
					audio->ac->session);
				rc = -ENOMEM;
				break;
			}
			audio->buf_alloc |= BUF_ALLOC_IN;
		}
		break;
	default:
		pr_debug("%s:session id %d: buf[%d]\n", __func__,
					audio->ac->session, audio->buf_alloc);
	}

	return rc;
}
Beispiel #6
0
long audio_in_ioctl(struct file *file,
				unsigned int cmd, unsigned long arg)
{
	struct q6audio_in  *audio = file->private_data;
	int rc = 0;

	if (cmd == AUDIO_GET_STATS) {
		struct msm_audio_stats stats;
		memset(&stats, 0, sizeof(stats));
		stats.byte_count = atomic_read(&audio->in_bytes);
		stats.sample_count = atomic_read(&audio->in_samples);
		if (copy_to_user((void *) arg, &stats, sizeof(stats)))
			return -EFAULT;
		return rc;
	}

	mutex_lock(&audio->lock);
	switch (cmd) {
	case AUDIO_FLUSH:
	case AUDIO_PAUSE:
	case AUDIO_GET_SESSION_ID:
		rc = audio_in_ioctl_shared(file, cmd, arg);
		break;
	case AUDIO_GET_STREAM_CONFIG: {
		struct msm_audio_stream_config cfg;
		memset(&cfg, 0, sizeof(cfg));
		cfg.buffer_size = audio->str_cfg.buffer_size;
		cfg.buffer_count = audio->str_cfg.buffer_count;
		if (copy_to_user((void *)arg, &cfg, sizeof(cfg)))
			rc = -EFAULT;
		pr_debug("%s:session id %d: AUDIO_GET_STREAM_CONFIG %d %d\n",
				__func__, audio->ac->session, cfg.buffer_size,
				cfg.buffer_count);
		break;
	}
	case AUDIO_SET_STREAM_CONFIG: {
		struct msm_audio_stream_config cfg;
		if (copy_from_user(&cfg, (void *)arg, sizeof(cfg))) {
			pr_err("%s: copy_from_user for AUDIO_SET_STREAM_CONFIG failed\n"
				, __func__);
			rc = -EFAULT;
			break;
		}
		/* Minimum single frame size,
		   but with in maximum frames number */
		if ((cfg.buffer_size < (audio->min_frame_size+ \
			sizeof(struct meta_out_dsp))) ||
			(cfg.buffer_count < FRAME_NUM)) {
			rc = -EINVAL;
			break;
		}
		audio->str_cfg.buffer_size = cfg.buffer_size;
		audio->str_cfg.buffer_count = cfg.buffer_count;
		if (audio->opened) {
			rc = q6asm_audio_client_buf_alloc(OUT, audio->ac,
				ALIGN_BUF_SIZE(audio->str_cfg.buffer_size),
				audio->str_cfg.buffer_count);
			if (rc < 0) {
				pr_err("%s: session id %d: Buffer Alloc failed rc=%d\n",
					__func__, audio->ac->session, rc);
				rc = -ENOMEM;
				break;
			}
		}
		audio->buf_alloc |= BUF_ALLOC_OUT;
		rc = 0;
		pr_debug("%s:session id %d: AUDIO_SET_STREAM_CONFIG %d %d\n",
				__func__, audio->ac->session,
				audio->str_cfg.buffer_size,
				audio->str_cfg.buffer_count);
		break;
	}
	case AUDIO_SET_BUF_CFG: {
		struct msm_audio_buf_cfg  cfg;
		if (copy_from_user(&cfg, (void *)arg, sizeof(cfg))) {
			rc = -EFAULT;
			break;
		}
		if ((audio->feedback == NON_TUNNEL_MODE) &&
			!cfg.meta_info_enable) {
			rc = -EFAULT;
			break;
		}

		/* Restrict the num of frames per buf to coincide with
		 * default buf size */
		if (cfg.frames_per_buf > audio->max_frames_per_buf) {
			rc = -EFAULT;
			break;
		}
		audio->buf_cfg.meta_info_enable = cfg.meta_info_enable;
		audio->buf_cfg.frames_per_buf = cfg.frames_per_buf;
		pr_debug("%s:session id %d: Set-buf-cfg: meta[%d] framesperbuf[%d]\n",
				__func__,
				audio->ac->session, cfg.meta_info_enable,
				cfg.frames_per_buf);
		break;
	}
	case AUDIO_GET_BUF_CFG: {
		pr_debug("%s:session id %d: Get-buf-cfg: meta[%d] framesperbuf[%d]\n",
			__func__,
			audio->ac->session, audio->buf_cfg.meta_info_enable,
			audio->buf_cfg.frames_per_buf);

		if (copy_to_user((void *)arg, &audio->buf_cfg,
					sizeof(struct msm_audio_buf_cfg)))
			rc = -EFAULT;
		break;
	}
	case AUDIO_GET_CONFIG: {
		if (copy_to_user((void *)arg, &audio->pcm_cfg,
					sizeof(struct msm_audio_config)))
			rc = -EFAULT;
		break;

	}
	case AUDIO_SET_CONFIG: {
		struct msm_audio_config cfg;
		if (copy_from_user(&cfg, (void *)arg, sizeof(cfg))) {
			pr_err("%s: copy_from_user for AUDIO_SET_CONFIG failed\n",
				__func__);
			rc = -EFAULT;
			break;
		}
		rc = audio_in_set_config(file, &cfg);
		break;
	}
	default:
		/* call codec specific ioctl */
		rc = audio->enc_ioctl(file, cmd, arg);
	}
	mutex_unlock(&audio->lock);
	return rc;
}