static long pcm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { struct pcm *pcm = file->private_data; 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(&pcm->lock); switch (cmd) { case AUDIO_SET_VOLUME: { int vol; if (!pcm->ac) { pr_err("%s: cannot set volume before AUDIO_START!\n", __func__); rc = -EINVAL; break; } if (copy_from_user(&vol, (void*) arg, sizeof(vol))) { rc = -EFAULT; break; } pr_debug("[%s:%s] SET_VOLUME: vol = %d\n", __MM_FILE__, __func__, vol); rc = q6audio_set_stream_volume(pcm->ac, vol); break; } case AUDIO_START: { uint32_t acdb_id; pr_debug("[%s:%s] AUDIO_START\n", __MM_FILE__, __func__); if (arg == 0) { acdb_id = 0; } else if (copy_from_user(&acdb_id, (void*) arg, sizeof(acdb_id))) { pr_info("[%s:%s] copy acdb_id from user failed\n", __MM_FILE__, __func__); rc = -EFAULT; break; } if (pcm->ac) { pr_err("[%s:%s] active session already existing\n", __MM_FILE__, __func__); rc = -EBUSY; } else { pcm->ac = q6audio_open_pcm(pcm->buffer_size, pcm->sample_rate, pcm->channel_count, AUDIO_FLAG_WRITE, acdb_id); if (!pcm->ac) { pr_err("[%s:%s] pcm open session failed\n", __MM_FILE__, __func__); rc = -ENOMEM; } } break; } case AUDIO_STOP: pr_debug("[%s:%s] AUDIO_STOP\n", __MM_FILE__, __func__); break; case AUDIO_FLUSH: break; case AUDIO_SET_CONFIG: { struct msm_audio_config config; if (pcm->ac) { rc = -EBUSY; pr_err("[%s:%s] active session already existing\n", __MM_FILE__, __func__); break; } if (copy_from_user(&config, (void*) arg, sizeof(config))) { rc = -EFAULT; break; } pr_debug("[%s:%s] SET_CONFIG: samplerate = %d, channels = %d\n", __MM_FILE__, __func__, config.sample_rate, config.channel_count); if (config.channel_count < 1 || config.channel_count > 2) { rc = -EINVAL; pr_err("[%s:%s] invalid channelcount %d\n", __MM_FILE__, __func__, config.channel_count); break; } if (config.sample_rate < 8000 || config.sample_rate > 48000) { rc = -EINVAL; pr_err("[%s:%s] invalid samplerate %d\n", __MM_FILE__, __func__, config.sample_rate); break; } if (config.buffer_size < 128 || config.buffer_size > 8192) { rc = -EINVAL; pr_err("[%s:%s] invalid buffsize %d\n", __MM_FILE__, __func__, config.buffer_size); break; } pcm->sample_rate = config.sample_rate; pcm->channel_count = config.channel_count; pcm->buffer_size = config.buffer_size; break; } case AUDIO_GET_CONFIG: { struct msm_audio_config config; config.buffer_size = pcm->buffer_size; config.buffer_count = 2; config.sample_rate = pcm->sample_rate; config.channel_count = pcm->channel_count; config.unused[0] = 0; config.unused[1] = 0; config.unused[2] = 0; if (copy_to_user((void*) arg, &config, sizeof(config))) { rc = -EFAULT; } pr_debug("[%s:%s] GET_CONFIG: samplerate = %d, channels = %d\n", __MM_FILE__, __func__, config.sample_rate, config.channel_count); break; } case AUDIO_SET_EQ: { struct msm_audio_eq_stream_config eq_config; pr_debug("[%s:%s] SET_EQ\n", __MM_FILE__, __func__); if (copy_from_user(&eq_config, (void *) arg, sizeof(eq_config))) { rc = -EFAULT; break; } rc = q6audio_set_stream_eq_pcm(pcm->ac, (void *) &eq_config); break; } default: rc = -EINVAL; } mutex_unlock(&pcm->lock); pr_debug("[%s:%s] rc = %d\n", __MM_FILE__, __func__, rc); return rc; }
static long mp3_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { struct mp3 *mp3 = file->private_data; 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(&mp3->lock); switch (cmd) { case AUDIO_SET_VOLUME: { int vol; if (copy_from_user(&vol, (void*) arg, sizeof(vol))) { rc = -EFAULT; break; } rc = q6audio_set_stream_volume(mp3->ac, vol); break; } case AUDIO_START: { uint32_t acdb_id; if (arg == 0) { acdb_id = 0; } else if (copy_from_user(&acdb_id, (void*) arg, sizeof(acdb_id))) { pr_info("pcm_out: copy acdb_id from user failed\n"); rc = -EFAULT; break; } if (mp3->ac) { rc = -EBUSY; } else { mp3->ac = q6audio_open_mp3(BUFSZ, mp3->sample_rate, mp3->channel_count, acdb_id); if (!mp3->ac) rc = -ENOMEM; } break; } case AUDIO_STOP: break; case AUDIO_FLUSH: break; case AUDIO_SET_CONFIG: { struct msm_audio_config config; if (mp3->ac) { rc = -EBUSY; break; } if (copy_from_user(&config, (void*) arg, sizeof(config))) { rc = -EFAULT; break; } if (config.channel_count < 1 || config.channel_count > 2) { rc = -EINVAL; break; } mp3->sample_rate = config.sample_rate; mp3->channel_count = config.channel_count; break; } case AUDIO_GET_CONFIG: { struct msm_audio_config config; config.buffer_size = BUFSZ; config.buffer_count = 2; config.sample_rate = mp3->sample_rate; config.channel_count = mp3->channel_count; config.unused[0] = 0; config.unused[1] = 0; config.unused[2] = 0; if (copy_to_user((void*) arg, &config, sizeof(config))) { rc = -EFAULT; } break; } default: rc = -EINVAL; } mutex_unlock(&mp3->lock); return rc; }
static long pcm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { struct pcm *pcm = file->private_data; struct cad_audio_eq_cfg eq_cfg; int rc = 0; AUDIO_INFO("%s: %X %X\n", __func__, cmd, arg); 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(&pcm->lock); switch (cmd) { case AUDIO_SET_VOLUME: { int vol; if (!pcm->ac) { pr_err("%s: cannot set volume before AUDIO_START!\n", __func__); rc = -EINVAL; break; } if (copy_from_user(&vol, (void*) arg, sizeof(vol))) { rc = -EFAULT; break; } rc = q6audio_set_stream_volume(pcm->ac, vol); break; } case AUDIO_SET_EQ: { if (copy_from_user(&eq_cfg, (void *)arg, sizeof(struct cad_audio_eq_cfg))) { rc = -EFAULT; break; } rc = q6audio_set_stream_eq(pcm->ac, &eq_cfg); break; } case AUDIO_START: { uint32_t acdb_id; if (arg == 0) { acdb_id = 0; } else if (copy_from_user(&acdb_id, (void*) arg, sizeof(acdb_id))) { pr_info("pcm_out: copy acdb_id from user failed\n"); rc = -EFAULT; break; } if (pcm->ac) { rc = -EBUSY; } else { pcm->ac = q6audio_open_pcm(BUFSZ, pcm->sample_rate, pcm->channel_count, AUDIO_FLAG_WRITE, acdb_id); if (!pcm->ac) rc = -ENOMEM; } break; } case AUDIO_STOP: break; case AUDIO_FLUSH: break; case AUDIO_SET_CONFIG: { struct msm_audio_config config; if (pcm->ac) { rc = -EBUSY; break; } if (copy_from_user(&config, (void*) arg, sizeof(config))) { rc = -EFAULT; break; } if (config.channel_count < 1 || config.channel_count > 2) { rc = -EINVAL; break; } pcm->sample_rate = config.sample_rate; pcm->channel_count = config.channel_count; break; } case AUDIO_GET_CONFIG: { struct msm_audio_config config; config.buffer_size = BUFSZ; config.buffer_count = 2; config.sample_rate = pcm->sample_rate; config.channel_count = pcm->channel_count; config.unused[0] = 0; config.unused[1] = 0; config.unused[2] = 0; if (copy_to_user((void*) arg, &config, sizeof(config))) { rc = -EFAULT; } break; } default: rc = -EINVAL; } mutex_unlock(&pcm->lock); return rc; }
static long pcm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { struct pcm *pcm = file->private_data; 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(&pcm->lock); switch (cmd) { case AUDIO_SET_VOLUME: { int vol; if (copy_from_user(&vol, (void*) arg, sizeof(vol))) { rc = -EFAULT; break; } rc = q6audio_set_stream_volume(pcm->ac, vol); break; } case AUDIO_START: { uint32_t acdb_id; if (arg == 0) { acdb_id = 0; } else if (copy_from_user(&acdb_id, (void*) arg, sizeof(acdb_id))) { pr_info("[%s:%s] copy acdb_id from user failed\n", __MM_FILE__, __func__); rc = -EFAULT; break; } if (pcm->ac) { rc = -EBUSY; } else { pcm->ac = q6audio_open_pcm(pcm->buffer_size, pcm->sample_rate, pcm->channel_count, AUDIO_FLAG_WRITE, acdb_id); if (!pcm->ac) { rc = -ENOMEM; } else { int vol; vol = CAD_STREAM_MSM8K_PCM_GAIN; q6audio_set_stream_volume(pcm->ac, vol); } } break; } case AUDIO_STOP: break; case AUDIO_FLUSH: break; case AUDIO_SET_CONFIG: { struct msm_audio_config config; if (pcm->ac) { rc = -EBUSY; break; } if (copy_from_user(&config, (void*) arg, sizeof(config))) { rc = -EFAULT; break; } if (config.channel_count < 1 || config.channel_count > 2) { rc = -EINVAL; break; } if (config.sample_rate < 8000 || config.sample_rate > 48000) { rc = -EINVAL; break; } if (config.buffer_size < 128 || config.buffer_size > 8192) { rc = -EINVAL; break; } pcm->sample_rate = config.sample_rate; pcm->channel_count = config.channel_count; pcm->buffer_size = config.buffer_size; break; } case AUDIO_GET_CONFIG: { struct msm_audio_config config; config.buffer_size = pcm->buffer_size; config.buffer_count = 2; config.sample_rate = pcm->sample_rate; config.channel_count = pcm->channel_count; config.unused[0] = 0; config.unused[1] = 0; config.unused[2] = 0; if (copy_to_user((void*) arg, &config, sizeof(config))) { rc = -EFAULT; } break; } case AUDIO_SET_EQ: { struct msm_audio_eq_stream_config eq_config; if (copy_from_user(&eq_config, (void *) arg, sizeof(eq_config))) { rc = -EFAULT; break; } rc = q6audio_set_stream_eq_pcm(pcm->ac, (void *) &eq_config); break; } default: rc = -EINVAL; } mutex_unlock(&pcm->lock); return rc; }