Exemplo n.º 1
0
//added by john for speaker PA control end
static int audio_enable(struct audio *audio)
{
    struct audmgr_config cfg;
    int rc;

    MM_DBG("\n"); /* Macro prints the file name and function */

    if (audio->enabled)
        return 0;

    /* refuse to start if we're not ready */
    if (!audio->out[0].used || !audio->out[1].used)
        return -EIO;

    /* we start buffers 0 and 1, so buffer 0 will be the
     * next one the dsp will want
     */
    audio->out_tail = 0;
    audio->out_needed = 0;

    cfg.tx_rate = RPC_AUD_DEF_SAMPLE_RATE_NONE;
    cfg.rx_rate = RPC_AUD_DEF_SAMPLE_RATE_48000;
    cfg.def_method = RPC_AUD_DEF_METHOD_HOST_PCM;
    cfg.codec = RPC_AUD_DEF_CODEC_PCM;
    cfg.snd_method = RPC_SND_METHOD_MIDI;

    audio_prevent_sleep(audio);
    rc = audmgr_enable(&audio->audmgr, &cfg);
    if (rc < 0) {
        audio_allow_sleep(audio);
        return rc;
    }

    if (audpp_enable(-1, audio_dsp_event, audio)) {
        MM_ERR("audpp_enable() failed\n");
        audmgr_disable(&audio->audmgr);
        audio_allow_sleep(audio);
        return -ENODEV;
    }

    audio->enabled = 1;
//modified by john
    isAudioEn = audio->enabled;
    if(!isIncallMode) {
        audio_opal_spkr_pa_enable(false);
    }
//modified by john
    htc_pwrsink_set(PWRSINK_AUDIO, 100);
    return 0;
}
Exemplo n.º 2
0
/* must be called with audio->lock held */
static int audio_disable(struct audio *audio)
{
	MM_INFO("\n"); /* Macro prints the file name and function */
	if (audio->enabled) {
		audio->enabled = 0;
		
		isAudioEn = 0;			//JRD added.
		audio_opal_spkr_pa_enable();

		audio_dsp_out_enable(audio, 0);

		audpp_disable(-1, audio);

		wake_up(&audio->wait);
		audmgr_disable(&audio->audmgr);
		audio->out_needed = 0;
		audio_allow_sleep(audio);
	}
	return 0;
}
Exemplo n.º 3
0
/* must be called with audio->lock held */
static int audio_disable(struct audio *audio)
{
    MM_DBG("\n"); /* Macro prints the file name and function */
    if (audio->enabled) {
        audio->enabled = 0;
//added by john
        isAudioEn = audio->enabled;
        if(!isIncallMode) {
            audio_opal_spkr_pa_enable(false);
        }
//added by john
        audio_dsp_out_enable(audio, 0);

        audpp_disable(-1, audio);

        wake_up(&audio->wait);
        audmgr_disable(&audio->audmgr);
        audio->out_needed = 0;
        audio_allow_sleep(audio);
    }
    return 0;
}
Exemplo n.º 4
0
static long snd_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
	struct snd_set_device_msg dmsg;
	struct snd_set_volume_msg vmsg;
	struct snd_avc_ctl_msg avc_msg;
	struct snd_agc_ctl_msg agc_msg;

	struct msm_snd_device_config dev;
	struct msm_snd_volume_config vol;
	struct snd_ctxt *snd = file->private_data;
	int rc = 0;
        //jrd add
        int spkr_param = 0;

	uint32_t avc, agc;

	mutex_lock(&snd->lock);
	switch (cmd) {
	case SND_SET_DEVICE:
		if (copy_from_user(&dev, (void __user *) arg, sizeof(dev))) {
			MM_ERR("set device: invalid pointer\n");
			rc = -EFAULT;
			break;
		}

		dmsg.args.device = cpu_to_be32(dev.device);
		dmsg.args.ear_mute = cpu_to_be32(dev.ear_mute);
		dmsg.args.mic_mute = cpu_to_be32(dev.mic_mute);
		if (check_mute(dev.ear_mute) < 0 ||
				check_mute(dev.mic_mute) < 0) {
			MM_ERR("set device: invalid mute status\n");
			rc = -EINVAL;
			break;
		}
		dmsg.args.cb_func = -1;
		dmsg.args.client_data = 0;

		MM_INFO("snd_set_device %d %d %d\n", dev.device,
				dev.ear_mute, dev.mic_mute);

		rc = msm_rpc_call(snd->ept,
			SND_SET_DEVICE_PROC,
			&dmsg, sizeof(dmsg), 5 * HZ);
		break;

	case SND_SET_VOLUME:
		if (copy_from_user(&vol, (void __user *) arg, sizeof(vol))) {
			MM_ERR("set volume: invalid pointer\n");
			rc = -EFAULT;
			break;
		}

		vmsg.args.device = cpu_to_be32(vol.device);
		vmsg.args.method = cpu_to_be32(vol.method);
		if (vol.method != SND_METHOD_VOICE) {
			MM_ERR("set volume: invalid method\n");
			rc = -EINVAL;
			break;
		}

		vmsg.args.volume = cpu_to_be32(vol.volume);
		vmsg.args.cb_func = -1;
		vmsg.args.client_data = 0;

		MM_INFO("snd_set_volume %d %d %d\n", vol.device,
				vol.method, vol.volume);

		rc = msm_rpc_call(snd->ept,
			SND_SET_VOLUME_PROC,
			&vmsg, sizeof(vmsg), 5 * HZ);
		break;

        //JRD add for speaker pa control
	case SND_SET_PA:
		if (get_user(avc, (uint32_t __user *) arg)) {
			rc = -EFAULT;
			break;
		}

		spkr_param = avc;
		isSpkr = (spkr_param > 1) ? true:false;
		isIncallMode = spkr_param%2;
		MM_INFO("snd_avc_ctl %d; isIncallMode: %d;spkr_param : %d; ===\n", avc,isIncallMode,spkr_param);

		audio_opal_spkr_pa_enable();
		rc = 0;
		break;

	case SND_AVC_CTL:
		if (get_user(avc, (uint32_t __user *) arg)) {
			rc = -EFAULT;
			break;
		} else if ((avc != 1) && (avc != 0)) {
			rc = -EINVAL;
			break;
		}

		avc_msg.args.avc_ctl = cpu_to_be32(avc);
		avc_msg.args.cb_func = -1;
		avc_msg.args.client_data = 0;

		MM_INFO("snd_avc_ctl %d\n", avc);

		rc = msm_rpc_call(snd->ept,
			SND_AVC_CTL_PROC,
			&avc_msg, sizeof(avc_msg), 5 * HZ);
		break;

	case SND_AGC_CTL:
		if (get_user(agc, (uint32_t __user *) arg)) {
			rc = -EFAULT;
			break;
		} else if ((agc != 1) && (agc != 0)) {
			rc = -EINVAL;
			break;
		}
		agc_msg.args.agc_ctl = cpu_to_be32(agc);
		agc_msg.args.cb_func = -1;
		agc_msg.args.client_data = 0;

		MM_INFO("snd_agc_ctl %d\n", agc);

		rc = msm_rpc_call(snd->ept,
			SND_AGC_CTL_PROC,
			&agc_msg, sizeof(agc_msg), 5 * HZ);
		break;

	case SND_GET_NUM_ENDPOINTS:
		if (copy_to_user((void __user *)arg,
				&snd->snd_epts->num, sizeof(unsigned))) {
			MM_ERR("get endpoint: invalid pointer\n");
			rc = -EFAULT;
		}
		break;

	case SND_GET_ENDPOINT:
		rc = get_endpoint(snd, arg);
		break;

	default:
		MM_ERR("unknown command\n");
		rc = -EINVAL;
		break;
	}
	mutex_unlock(&snd->lock);

	return rc;
}