예제 #1
0
파일: vx_mixer.c 프로젝트: yogesum/linux
/*
 * get the VU and peak meter values
 * @audio: the audio index
 * @capture: 0 = playback, 1 = capture operation
 * @info: the array of vx_vu_meter records (size = 2).
 */
static int vx_get_audio_vu_meter(struct vx_core *chip, int audio, int capture, struct vx_vu_meter *info)
{
    struct vx_rmh rmh;
    int i, err;

    if (chip->chip_status & VX_STAT_IS_STALE)
        return -EBUSY;

    vx_init_rmh(&rmh, CMD_AUDIO_VU_PIC_METER);
    rmh.LgStat += 2 * VU_METER_CHANNELS;
    if (capture)
        rmh.Cmd[0] |= COMMAND_RECORD_MASK;

    /* Add Audio IO mask */
    rmh.Cmd[1] = 0;
    for (i = 0; i < VU_METER_CHANNELS; i++)
        rmh.Cmd[1] |= 1 << (audio + i);
    err = vx_send_msg(chip, &rmh);
    if (err < 0)
        return err;
    /* Read response */
    for (i = 0; i < 2 * VU_METER_CHANNELS; i +=2) {
        info->saturated = (rmh.Stat[0] & (1 << (audio + i))) ? 1 : 0;
        info->vu_level = rmh.Stat[i + 1];
        info->peak_level = rmh.Stat[i + 2];
        info++;
    }
    return 0;
}
예제 #2
0
/*
 * vx_test_irq_src - query the source of interrupts
 *
 * called from irq handler only
 */
static int vx_test_irq_src(vx_core_t *chip, unsigned int *ret)
{
	int err;

	vx_init_rmh(&chip->irq_rmh, CMD_TEST_IT);
	spin_lock(&chip->lock);
	err = vx_send_msg_nolock(chip, &chip->irq_rmh);
	if (err < 0)
		*ret = 0;
	else
		*ret = chip->irq_rmh.Stat[0];
	spin_unlock(&chip->lock);
	return err;
}
예제 #3
0
파일: vx_mixer.c 프로젝트: yogesum/linux
static int vx_read_audio_level(struct vx_core *chip, int audio, int capture,
                               struct vx_audio_level *info)
{
    int err;
    struct vx_rmh rmh;

    memset(info, 0, sizeof(*info));
    vx_init_rmh(&rmh, CMD_GET_AUDIO_LEVELS);
    if (capture)
        rmh.Cmd[0] |= COMMAND_RECORD_MASK;
    /* Add Audio IO mask */
    rmh.Cmd[1] = 1 << audio;
    err = vx_send_msg(chip, &rmh);
    if (err < 0)
        return err;
    info.level = rmh.Stat[0] & MASK_DSP_WORD_LEVEL;
    info.monitor_level = (rmh.Stat[0] >> 10) & MASK_DSP_WORD_LEVEL;
    info.mute = (rmh.Stat[i] & AUDIO_IO_HAS_MUTE_LEVEL) ? 1 : 0;
    info.monitor_mute = (rmh.Stat[i] & AUDIO_IO_HAS_MUTE_MONITORING_1) ? 1 : 0;
    return 0;
}
예제 #4
0
파일: vx_mixer.c 프로젝트: yogesum/linux
static int vx_adjust_audio_level(struct vx_core *chip, int audio, int capture,
                                 struct vx_audio_level *info)
{
    struct vx_rmh rmh;

    if (chip->chip_status & VX_STAT_IS_STALE)
        return -EBUSY;

    vx_init_rmh(&rmh, CMD_AUDIO_LEVEL_ADJUST);
    if (capture)
        rmh.Cmd[0] |= COMMAND_RECORD_MASK;
    /* Add Audio IO mask */
    rmh.Cmd[1] = 1 << audio;
    rmh.Cmd[2] = 0;
    if (info->has_level) {
        rmh.Cmd[0] |=  VALID_AUDIO_IO_DIGITAL_LEVEL;
        rmh.Cmd[2] |= info->level;
    }
    if (info->has_monitor_level) {
        rmh.Cmd[0] |=  VALID_AUDIO_IO_MONITORING_LEVEL;
        rmh.Cmd[2] |= ((unsigned int)info->monitor_level << 10);
    }
    if (info->has_mute) {
        rmh.Cmd[0] |= VALID_AUDIO_IO_MUTE_LEVEL;
        if (info->mute)
            rmh.Cmd[2] |= AUDIO_IO_HAS_MUTE_LEVEL;
    }
    if (info->has_monitor_mute) {
        /* validate flag for M2 at least to unmute it */
        rmh.Cmd[0] |=  VALID_AUDIO_IO_MUTE_MONITORING_1 | VALID_AUDIO_IO_MUTE_MONITORING_2;
        if (info->monitor_mute)
            rmh.Cmd[2] |= AUDIO_IO_HAS_MUTE_MONITORING_1;
    }

    return vx_send_msg(chip, &rmh);
}