static int pcm_open(struct inode *inode, struct file *file) { struct pcm *pcm; pcm = kzalloc(sizeof(struct pcm), GFP_KERNEL); if (!pcm) return -ENOMEM; mutex_init(&pcm->lock); file->private_data = pcm; pcm->ac = q6audio_open(AUDIO_FLAG_WRITE, BUFSZ); if (!pcm->ac) { kfree(pcm); return -ENOMEM; } pcm->cfg.channel_count = 2; pcm->cfg.buffer_count = 2; pcm->cfg.buffer_size = BUFSZ; pcm->cfg.unused[0] = 0; pcm->cfg.unused[1] = 0; pcm->cfg.unused[2] = 0; pcm->cfg.sample_rate = 48000; return 0; }
static int q6_in_open(struct inode *inode, struct file *file) { struct pcm *pcm; pcm = kmalloc(sizeof(struct pcm), GFP_KERNEL); if (pcm == NULL) { pr_err("Could not allocate memory for pcm driver\n"); return -ENOMEM; } mutex_init(&pcm->lock); file->private_data = pcm; pcm->audio_client = q6audio_open(AUDIO_FLAG_READ, BUFSZ); if (!pcm->audio_client) { kfree(pcm); return -ENOMEM; } pcm->cfg.channel_count = 1; pcm->cfg.buffer_count = 2; pcm->cfg.buffer_size = BUFSZ; pcm->cfg.unused[0] = 0; pcm->cfg.unused[1] = 0; pcm->cfg.unused[2] = 0; pcm->cfg.sample_rate = 8000; return 0; }
static int mp3_open(struct inode *inode, struct file *file) { struct mp3 *mp3; mp3 = kzalloc(sizeof(struct mp3), GFP_KERNEL); if (!mp3) return -ENOMEM; mutex_init(&mp3->lock); file->private_data = mp3; mp3->ac = q6audio_open(AUDIO_FLAG_WRITE, BUFSZ); if (!mp3->ac) { kfree(mp3); return -ENOMEM; } mp3->cfg.channel_count = 2; mp3->cfg.buffer_count = 2; mp3->cfg.buffer_size = BUFSZ; mp3->cfg.unused[0] = 0; mp3->cfg.unused[1] = 0; mp3->cfg.unused[2] = 0; mp3->cfg.sample_rate = 48000; return 0; }
static long q6_evrc_in_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { struct evrc *evrc = file->private_data; struct adsp_open_command rpc; int rc = 0; if (cmd == AUDIO_GET_STATS) { struct msm_audio_stats stats; memset(&stats, 0, sizeof(stats)); if (copy_to_user((void *) arg, &stats, sizeof(stats))) return -EFAULT; return 0; } mutex_lock(&evrc->lock); switch (cmd) { case AUDIO_START: if (evrc->audio_client) { rc = -EBUSY; break; } else { evrc->audio_client = q6audio_open(AUDIO_FLAG_READ, evrc->str_cfg.buffer_size); if (!evrc->audio_client) { kfree(evrc); rc = -ENOMEM; break; } } tx_clk_freq = 8000; memset(&rpc, 0, sizeof(rpc)); rpc.format_block.standard.format = ADSP_AUDIO_FORMAT_EVRC_FS; rpc.format_block.standard.channels = 1; rpc.format_block.standard.bits_per_sample = 16; rpc.format_block.standard.sampling_rate = 8000; rpc.format_block.standard.is_signed = 1; rpc.format_block.standard.is_interleaved = 0; rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_READ; rpc.device = ADSP_AUDIO_DEVICE_ID_DEFAULT; rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_RECORD; rpc.buf_max_size = evrc->str_cfg.buffer_size; rpc.config.evrc.min_rate = evrc->cfg.min_bit_rate; rpc.config.evrc.max_rate = evrc->cfg.max_bit_rate; q6audio_start(evrc->audio_client, &rpc, sizeof(rpc)); break; case AUDIO_STOP: break; case AUDIO_FLUSH: break; case AUDIO_SET_VOLUME: break; case AUDIO_GET_STREAM_CONFIG: if (copy_to_user((void *)arg, &evrc->str_cfg, sizeof(struct msm_audio_stream_config))) rc = -EFAULT; break; case AUDIO_SET_STREAM_CONFIG: if (copy_from_user(&evrc->str_cfg, (void *)arg, sizeof(struct msm_audio_stream_config))) { rc = -EFAULT; break; } if (evrc->str_cfg.buffer_size < 23) { pr_err("[%s:%s] Buffer size too small\n", __MM_FILE__, __func__); rc = -EINVAL; break; } if (evrc->str_cfg.buffer_count != 2) pr_info("[%s:%s] Buffer count set to 2\n", __MM_FILE__, __func__); break; case AUDIO_SET_EVRC_ENC_CONFIG: if (copy_from_user(&evrc->cfg, (void *) arg, sizeof(struct msm_audio_evrc_enc_config))) rc = -EFAULT; if (evrc->cfg.min_bit_rate > 4 || evrc->cfg.min_bit_rate < 1) { pr_err("[%s:%s] invalid min bitrate\n", __MM_FILE__, __func__); rc = -EINVAL; } if (evrc->cfg.max_bit_rate > 4 || evrc->cfg.max_bit_rate < 1) { pr_err("[%s:%s] invalid max bitrate\n", __MM_FILE__, __func__); rc = -EINVAL; } break; case AUDIO_GET_EVRC_ENC_CONFIG: if (copy_to_user((void *) arg, &evrc->cfg, sizeof(struct msm_audio_evrc_enc_config))) rc = -EFAULT; break; default: rc = -EINVAL; } mutex_unlock(&evrc->lock); return rc; }