ALSA: hdmi: fix printout of SAD sampling rates

SAD sampling rate information reported in
/proc/asound/cardX/eldX is incorrect due to a mismatch
between HDA and HDMI frequencies. Add new routine to provide
relevant values.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Pierre-Louis Bossart 2011-10-05 15:14:20 -05:00 committed by Takashi Iwai
parent 7c2f8e4009
commit af65cbf296
2 changed files with 23 additions and 3 deletions

View File

@ -5205,7 +5205,7 @@ EXPORT_SYMBOL_HDA(snd_array_free);
* @buf: the string buffer to write * @buf: the string buffer to write
* @buflen: the max buffer length * @buflen: the max buffer length
* *
* used by hda_proc.c and hda_eld.c * used by hda_proc.c
*/ */
void snd_print_pcm_rates(int pcm, char *buf, int buflen) void snd_print_pcm_rates(int pcm, char *buf, int buflen)
{ {

View File

@ -363,6 +363,26 @@ error:
return ret; return ret;
} }
/**
* SNDRV_PCM_RATE_* and AC_PAR_PCM values don't match, print correct rates with
* hdmi-specific routine.
*/
static void hdmi_print_pcm_rates(int pcm, char *buf, int buflen)
{
static unsigned int alsa_rates[] = {
5512, 8000, 11025, 16000, 22050, 32000, 44100, 48000, 88200,
96000, 176400, 192000, 384000
};
int i, j;
for (i = 0, j = 0; i < ARRAY_SIZE(alsa_rates); i++)
if (pcm & (1 << i))
j += snprintf(buf + j, buflen - j, " %d",
alsa_rates[i]);
buf[j] = '\0'; /* necessary when j == 0 */
}
static void hdmi_show_short_audio_desc(struct cea_sad *a) static void hdmi_show_short_audio_desc(struct cea_sad *a)
{ {
char buf[SND_PRINT_RATES_ADVISED_BUFSIZE]; char buf[SND_PRINT_RATES_ADVISED_BUFSIZE];
@ -371,7 +391,7 @@ static void hdmi_show_short_audio_desc(struct cea_sad *a)
if (!a->format) if (!a->format)
return; return;
snd_print_pcm_rates(a->rates, buf, sizeof(buf)); hdmi_print_pcm_rates(a->rates, buf, sizeof(buf));
if (a->format == AUDIO_CODING_TYPE_LPCM) if (a->format == AUDIO_CODING_TYPE_LPCM)
snd_print_pcm_bits(a->sample_bits, buf2 + 8, sizeof(buf2) - 8); snd_print_pcm_bits(a->sample_bits, buf2 + 8, sizeof(buf2) - 8);
@ -430,7 +450,7 @@ static void hdmi_print_sad_info(int i, struct cea_sad *a,
i, a->format, cea_audio_coding_type_names[a->format]); i, a->format, cea_audio_coding_type_names[a->format]);
snd_iprintf(buffer, "sad%d_channels\t\t%d\n", i, a->channels); snd_iprintf(buffer, "sad%d_channels\t\t%d\n", i, a->channels);
snd_print_pcm_rates(a->rates, buf, sizeof(buf)); hdmi_print_pcm_rates(a->rates, buf, sizeof(buf));
snd_iprintf(buffer, "sad%d_rates\t\t[0x%x]%s\n", i, a->rates, buf); snd_iprintf(buffer, "sad%d_rates\t\t[0x%x]%s\n", i, a->rates, buf);
if (a->format == AUDIO_CODING_TYPE_LPCM) { if (a->format == AUDIO_CODING_TYPE_LPCM) {