예제 #1
0
void audio_commit_pending_pp_params(void *priv, unsigned id, uint16_t *msg)
{
	struct audio_copp *audio_copp = priv;

	if (audio_copp == NULL) {
		MM_ERR("NULL audio copp pointer\n");
		return;
	}

	if (AUDPP_MSG_CFG_MSG == id && msg[0] == AUDPP_MSG_ENA_DIS)
		return;

	if (!audio_copp->status)
		return;

	if (!is_acdb_enabled()) {
		audpp_dsp_set_mbadrc(COMMON_OBJ_ID, audio_copp->mbadrc_enable,
						&audio_copp->mbadrc);

		audpp_dsp_set_eq(COMMON_OBJ_ID, audio_copp->eq_enable,
						&audio_copp->eq);
		audpp_dsp_set_rx_iir(COMMON_OBJ_ID, audio_copp->rx_iir_enable,
							&audio_copp->iir);
		audpp_dsp_set_vol_pan(COMMON_OBJ_ID, &audio_copp->vol_pan);

		audpp_dsp_set_qconcert_plus(COMMON_OBJ_ID,
				audio_copp->qconcert_plus_enable,
				&audio_copp->qconcert_plus);
	}
	audio_enable_srs_trumedia(audio_copp, true);
}
예제 #2
0
static long audpre_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
	struct audio_in *audio = file->private_data;
	int rc = 0, enable;
	uint16_t enable_mask;
#if DEBUG
	int i;
#endif

	mutex_lock(&audio->lock);
	switch (cmd) {
	case AUDIO_ENABLE_AUDPRE: {

		if (is_acdb_enabled()) {
			MM_INFO("Audpp is supported via acdb\n");
			rc = -EFAULT;
			break;
		}

		if (copy_from_user(&enable_mask, (void *) arg,
				sizeof(enable_mask)))
			goto out_fault;

		enable = (enable_mask & AGC_ENABLE) ? 1 : 0;
		audio_enable_tx_agc(audio, enable);
		enable = (enable_mask & NS_ENABLE) ? 1 : 0;
		audio_enable_ns(audio, enable);
		enable = (enable_mask & TX_IIR_ENABLE) ? 1 : 0;
		audio_enable_iir(audio, enable);
		break;
	}
	case AUDIO_SET_AGC: {
		if (copy_from_user(&audio->agc, (void *) arg,
				sizeof(audio->agc)))
			goto out_fault;
#if DEBUG
		MM_AUD_INFO("set agc\n");
		for (i = 0; i < AGC_PARAM_SIZE; i++) \
			MM_AUD_INFO("agc_params[%d] = 0x%04x\n", i,
				audio->agc.agc_params[i]);
#endif
		break;
	}
	case AUDIO_SET_NS: {
		if (copy_from_user(&audio->ns, (void *) arg, sizeof(audio->ns)))
			goto out_fault;
#if DEBUG
		MM_AUD_INFO("set ns\n");
		for (i = 0; i < NS_PARAM_SIZE; i++) \
			MM_AUD_INFO("ns_params[%d] = 0x%04x\n",
				i, audio->ns.ns_params[i]);
#endif
		break;
	}
	case AUDIO_SET_TX_IIR: {
		if (copy_from_user(&audio->iir, (void *) arg,
					sizeof(audio->iir)))
			goto out_fault;
#if DEBUG
		MM_AUD_INFO("set iir\n");
		MM_AUD_INFO("iir.num_bands = 0x%04x\n", audio->iir.num_bands);
		for (i = 0; i < IIR_PARAM_SIZE; i++) \
			MM_AUD_INFO("iir_params[%d] = 0x%04x\n",
				i, audio->iir.iir_params[i]);
#endif
		break;
	}
	default:
		rc = -EINVAL;
	}

	goto out;

out_fault:
	rc = -EFAULT;
out:
	mutex_unlock(&audio->lock);
	return rc;
}
예제 #3
0
static void audrec_dsp_event(void *data, unsigned id, size_t len,
			    void (*getevent)(void *ptr, size_t len))
{
	struct audio_in *audio = NULL;
	uint16_t msg[3];

	if (data)
		audio = data;
	else {
		MM_AUD_ERR("invalid data for event %x\n", id);
		return;
	}

	getevent(msg, sizeof(msg));

	switch (id) {
	case AUDREC_MSG_CMD_CFG_DONE_MSG: {
		if (msg[0] & AUDREC_MSG_CFG_DONE_ENC_ENA) {
			audio->audrec_obj_idx = msg[1];
			MM_AUD_INFO("audpre: CFG ENABLED\n");
			audpcm_in_encmem_config(audio);
		} else {
			MM_AUD_INFO("audrec: CFG SLEEP\n");
			audio->running = 0;
			audio->tx_agc_enable = 0;
			audio->ns_enable = 0;
			audio->iir_enable = 0;
		}
		break;
	}
	case AUDREC_MSG_CMD_AREC_MEM_CFG_DONE_MSG: {
		MM_AUD_DBG("audrec: AREC_MEM_CFG_DONE_MSG\n");
		audpcm_in_encparam_config(audio);
		break;
	}
	case AUDREC_MSG_CMD_AREC_PARAM_CFG_DONE_MSG: {
		MM_AUD_INFO("audrec: PARAM CFG DONE\n");
		audio->running = 1;
		if (is_acdb_enabled())
			break;
		audio_dsp_set_tx_agc(audio);
		audio_dsp_set_ns(audio);
		audio_dsp_set_iir(audio);
		break;
	}
	case AUDREC_MSG_NO_EXT_PKT_AVAILABLE_MSG: {
		MM_AUD_ERR("audrec: ERROR %x\n", msg[0]);
		break;
	}
	case AUDREC_MSG_PACKET_READY_MSG: {
		struct audrec_msg_packet_ready_msg pkt_ready_msg;

		getevent(&pkt_ready_msg, AUDREC_MSG_PACKET_READY_MSG_LEN);
		MM_AUD_DBG("UP_PACKET_READY_MSG: write cnt msw  %d \
		write cnt lsw %d read cnt msw %d  read cnt lsw %d \n",\
		pkt_ready_msg.pkt_counter_msw, \
		pkt_ready_msg.pkt_counter_lsw, \
		pkt_ready_msg.pkt_read_cnt_msw, \
		pkt_ready_msg.pkt_read_cnt_lsw);

		audpcm_in_get_dsp_frames(audio);
		break;
	}
	case ADSP_MESSAGE_ID: {
		MM_AUD_INFO("audrec: module enabled\n");
		break;
	}
	default:
		MM_AUD_ERR("audrec: unknown event %d\n", id);
	}
}