Exemplo n.º 1
0
/*
 *  set sampling rate according to the substream
 */
static int snd_ps3_set_avsetting(struct snd_pcm_substream *substream)
{
    struct snd_ps3_card_info *card = snd_pcm_substream_chip(substream);
    struct snd_ps3_avsetting_info avs;

    avs = card->avs;

    pr_debug("%s: called freq=%d width=%d\n", __func__,
             substream->runtime->rate,
             snd_pcm_format_width(substream->runtime->format));

    pr_debug("%s: before freq=%d width=%d\n", __func__,
             card->avs.avs_audio_rate, card->avs.avs_audio_width);

    /* sample rate */
    switch (substream->runtime->rate) {
    case 44100:
        avs.avs_audio_rate = PS3AV_CMD_AUDIO_FS_44K;
        break;
    case 48000:
        avs.avs_audio_rate = PS3AV_CMD_AUDIO_FS_48K;
        break;
    case 88200:
        avs.avs_audio_rate = PS3AV_CMD_AUDIO_FS_88K;
        break;
    case 96000:
        avs.avs_audio_rate = PS3AV_CMD_AUDIO_FS_96K;
        break;
    default:
        pr_info("%s: invalid rate %d\n", __func__,
                substream->runtime->rate);
        return 1;
    }

    /* width */
    switch (snd_pcm_format_width(substream->runtime->format)) {
    case 16:
        avs.avs_audio_width = PS3AV_CMD_AUDIO_WORD_BITS_16;
        break;
    case 24:
        avs.avs_audio_width = PS3AV_CMD_AUDIO_WORD_BITS_24;
        break;
    default:
        pr_info("%s: invalid width %d\n", __func__,
                snd_pcm_format_width(substream->runtime->format));
        return 1;
    }

    if ((card->avs.avs_audio_width != avs.avs_audio_width) ||
            (card->avs.avs_audio_rate != avs.avs_audio_rate)) {
        card->avs = avs;
        snd_ps3_change_avsetting(card);

        pr_debug("%s: after freq=%d width=%d\n", __func__,
                 card->avs.avs_audio_rate, card->avs.avs_audio_width);

        return 0;
    } else
        return 1;
}
Exemplo n.º 2
0
static int snd_ps3_init_avsetting(struct snd_ps3_card_info *card)
{
    int ret;
    pr_debug("%s: start\n", __func__);
    card->avs.avs_audio_ch = PS3AV_CMD_AUDIO_NUM_OF_CH_2;
    card->avs.avs_audio_rate = PS3AV_CMD_AUDIO_FS_48K;
    card->avs.avs_audio_width = PS3AV_CMD_AUDIO_WORD_BITS_16;
    card->avs.avs_audio_format = PS3AV_CMD_AUDIO_FORMAT_PCM;
    card->avs.avs_audio_source = PS3AV_CMD_AUDIO_SOURCE_SERIAL;

    ret = snd_ps3_change_avsetting(card);

    snd_ps3_audio_fixup(card);

    /* to start to generate SPDIF signal, fill data */
    snd_ps3_program_dma(card, SND_PS3_DMA_FILLTYPE_SILENT_FIRSTFILL);
    snd_ps3_kick_dma(card);
    pr_debug("%s: end\n", __func__);
    return ret;
}
Exemplo n.º 3
0
/*
 *  set sampling rate according to the substream
 */
static int snd_ps3_set_avsetting(struct snd_pcm_substream *substream)
{
	struct snd_ps3_card_info *card = snd_pcm_substream_chip(substream);
	struct snd_ps3_avsetting_info avs;
	int ret;

	avs = card->avs;

	pr_debug("%s: called freq=%d width=%d\n", __func__,
		 substream->runtime->rate,
		 snd_pcm_format_width(substream->runtime->format));

	pr_debug("%s: before freq=%d width=%d\n", __func__,
		 card->avs.avs_audio_rate, card->avs.avs_audio_width);

	/* sample rate */
	switch (substream->runtime->rate) {
	case 44100:
		avs.avs_audio_rate = PS3AV_CMD_AUDIO_FS_44K;
		break;
	case 48000:
		avs.avs_audio_rate = PS3AV_CMD_AUDIO_FS_48K;
		break;
	case 88200:
		avs.avs_audio_rate = PS3AV_CMD_AUDIO_FS_88K;
		break;
	case 96000:
		avs.avs_audio_rate = PS3AV_CMD_AUDIO_FS_96K;
		break;
	default:
		pr_info("%s: invalid rate %d\n", __func__,
			substream->runtime->rate);
		return 1;
	}

	/* width */
	switch (snd_pcm_format_width(substream->runtime->format)) {
	case 16:
		avs.avs_audio_width = PS3AV_CMD_AUDIO_WORD_BITS_16;
		break;
	case 24:
		avs.avs_audio_width = PS3AV_CMD_AUDIO_WORD_BITS_24;
		break;
	default:
		pr_info("%s: invalid width %d\n", __func__,
			snd_pcm_format_width(substream->runtime->format));
		return 1;
	}

	memcpy(avs.avs_cs_info, ps3av_mode_cs_info, 8);

	if (memcmp(&card->avs, &avs, sizeof(avs))) {
		pr_debug("%s: after freq=%d width=%d\n", __func__,
			 card->avs.avs_audio_rate, card->avs.avs_audio_width);

		card->avs = avs;
		snd_ps3_change_avsetting(card);
		ret = 0;
	} else
		ret = 1;

	/* check CS non-audio bit and mute accordingly */
	if (avs.avs_cs_info[0] & 0x02)
		ps3av_audio_mute_analog(1); /* mute if non-audio */
	else
		ps3av_audio_mute_analog(0);

	return ret;
}