ALSA: hda: hdmi_eld_update_pcm_info: update a stream in place
authorStephen Warren <swarren@nvidia.com>
Wed, 1 Jun 2011 17:14:20 +0000 (11:14 -0600)
committerTakashi Iwai <tiwai@suse.de>
Mon, 6 Jun 2011 10:58:09 +0000 (12:58 +0200)
A future change won't store an entire hda_pcm_stream just to represent
the capabilities of a codec; a custom data-structure will be used. To
ease that transition, modify hdmi_eld_update_pcm_info to expect the
hda_pcm_stream to be pre-initialized with the codec's capabilities, and
to update those capabilities in-place based on the ELD.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_eld.c
sound/pci/hda/hda_local.h
sound/pci/hda/patch_hdmi.c

index b05f7be9dc1b154017838b4fda19486014ad6f47..473cfa13a30d92cf30f9296737af09d0ffaa1290 100644 (file)
@@ -580,43 +580,45 @@ void snd_hda_eld_proc_free(struct hda_codec *codec, struct hdmi_eld *eld)
 #endif /* CONFIG_PROC_FS */
 
 /* update PCM info based on ELD */
-void hdmi_eld_update_pcm_info(struct hdmi_eld *eld, struct hda_pcm_stream *pcm,
-                             struct hda_pcm_stream *codec_pars)
+void snd_hdmi_eld_update_pcm_info(struct hdmi_eld *eld,
+                             struct hda_pcm_stream *hinfo)
 {
+       u32 rates;
+       u64 formats;
+       unsigned int maxbps;
+       unsigned int channels_max;
        int i;
 
        /* assume basic audio support (the basic audio flag is not in ELD;
         * however, all audio capable sinks are required to support basic
         * audio) */
-       pcm->rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000;
-       pcm->formats = SNDRV_PCM_FMTBIT_S16_LE;
-       pcm->maxbps = 16;
-       pcm->channels_max = 2;
+       rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
+               SNDRV_PCM_RATE_48000;
+       formats = SNDRV_PCM_FMTBIT_S16_LE;
+       maxbps = 16;
+       channels_max = 2;
        for (i = 0; i < eld->sad_count; i++) {
                struct cea_sad *a = &eld->sad[i];
-               pcm->rates |= a->rates;
-               if (a->channels > pcm->channels_max)
-                       pcm->channels_max = a->channels;
+               rates |= a->rates;
+               if (a->channels > channels_max)
+                       channels_max = a->channels;
                if (a->format == AUDIO_CODING_TYPE_LPCM) {
                        if (a->sample_bits & AC_SUPPCM_BITS_20) {
-                               pcm->formats |= SNDRV_PCM_FMTBIT_S32_LE;
-                               if (pcm->maxbps < 20)
-                                       pcm->maxbps = 20;
+                               formats |= SNDRV_PCM_FMTBIT_S32_LE;
+                               if (maxbps < 20)
+                                       maxbps = 20;
                        }
                        if (a->sample_bits & AC_SUPPCM_BITS_24) {
-                               pcm->formats |= SNDRV_PCM_FMTBIT_S32_LE;
-                               if (pcm->maxbps < 24)
-                                       pcm->maxbps = 24;
+                               formats |= SNDRV_PCM_FMTBIT_S32_LE;
+                               if (maxbps < 24)
+                                       maxbps = 24;
                        }
                }
        }
 
-       if (!codec_pars)
-               return;
-
        /* restrict the parameters by the values the codec provides */
-       pcm->rates &= codec_pars->rates;
-       pcm->formats &= codec_pars->formats;
-       pcm->channels_max = min(pcm->channels_max, codec_pars->channels_max);
-       pcm->maxbps = min(pcm->maxbps, codec_pars->maxbps);
+       hinfo->rates &= rates;
+       hinfo->formats &= formats;
+       hinfo->maxbps = min(hinfo->maxbps, maxbps);
+       hinfo->channels_max = min(hinfo->channels_max, channels_max);
 }
index 8b88c92826a14abf425235ff74896a4b826e9019..b333bf46a19c42e166d9ada2b34f3f81b18622ba 100644 (file)
@@ -641,8 +641,8 @@ struct hdmi_eld {
 int snd_hdmi_get_eld_size(struct hda_codec *codec, hda_nid_t nid);
 int snd_hdmi_get_eld(struct hdmi_eld *, struct hda_codec *, hda_nid_t);
 void snd_hdmi_show_eld(struct hdmi_eld *eld);
-void hdmi_eld_update_pcm_info(struct hdmi_eld *eld, struct hda_pcm_stream *pcm,
-                             struct hda_pcm_stream *codec_pars);
+void snd_hdmi_eld_update_pcm_info(struct hdmi_eld *eld,
+                             struct hda_pcm_stream *hinfo);
 
 #ifdef CONFIG_PROC_FS
 int snd_hda_eld_proc_new(struct hda_codec *codec, struct hdmi_eld *eld,
index 92fb105da1e04d0740886abe39782fe87d30af61..338546531c1783bc79d85be18c388dfc0dce7d6b 100644 (file)
@@ -815,20 +815,22 @@ static int hdmi_pcm_open(struct hda_pcm_stream *hinfo,
        if (!codec_pars->rates)
                *codec_pars = *hinfo;
 
+       /* Initially set the converter's capabilities */
+       hinfo->channels_min = codec_pars->channels_min;
+       hinfo->channels_max = codec_pars->channels_max;
+       hinfo->rates = codec_pars->rates;
+       hinfo->formats = codec_pars->formats;
+       hinfo->maxbps = codec_pars->maxbps;
+
        eld = &spec->sink_eld[idx];
        if (!static_hdmi_pcm && eld->eld_valid) {
-               hdmi_eld_update_pcm_info(eld, hinfo, codec_pars);
+               snd_hdmi_eld_update_pcm_info(eld, hinfo);
                if (hinfo->channels_min > hinfo->channels_max ||
                    !hinfo->rates || !hinfo->formats)
                        return -ENODEV;
-       } else {
-               /* fallback to the codec default */
-               hinfo->channels_max = codec_pars->channels_max;
-               hinfo->rates = codec_pars->rates;
-               hinfo->formats = codec_pars->formats;
-               hinfo->maxbps = codec_pars->maxbps;
        }
-       /* store the updated parameters */
+
+       /* Store the updated parameters */
        runtime->hw.channels_min = hinfo->channels_min;
        runtime->hw.channels_max = hinfo->channels_max;
        runtime->hw.formats = hinfo->formats;