| From 1fa1757366783fb52e6e85c2d735db49b818d382 Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Wed, 2 Nov 2011 21:30:51 +0100 |
| Subject: ALSA: hda/realtek - Don't create alt-stream for capture when unnecessary |
| |
| From: Takashi Iwai <tiwai@suse.de> |
| |
| commit 1fa1757366783fb52e6e85c2d735db49b818d382 upstream. |
| |
| When the driver finds multiple ADCs, it tries to create an alternative |
| capture PCM stream. However, these secondary ADCs might be useless or |
| in uncontrolled paths in some cases, e.g. when auto-mic or dynamic |
| ADC-switching is enabled. Also, when only a single capture source is |
| available, the multi-streams don't make sense, too. |
| |
| With this patch, the driver checks such condition and skips the alt |
| stream appropriately. |
| |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| sound/pci/hda/patch_realtek.c | 8 ++++++-- |
| 1 file changed, 6 insertions(+), 2 deletions(-) |
| |
| --- a/sound/pci/hda/patch_realtek.c |
| +++ b/sound/pci/hda/patch_realtek.c |
| @@ -2232,6 +2232,7 @@ static int alc_build_pcms(struct hda_cod |
| struct alc_spec *spec = codec->spec; |
| struct hda_pcm *info = spec->pcm_rec; |
| const struct hda_pcm_stream *p; |
| + bool have_multi_adcs; |
| int i; |
| |
| codec->num_pcms = 1; |
| @@ -2310,8 +2311,11 @@ static int alc_build_pcms(struct hda_cod |
| /* If the use of more than one ADC is requested for the current |
| * model, configure a second analog capture-only PCM. |
| */ |
| + have_multi_adcs = (spec->num_adc_nids > 1) && |
| + !spec->dyn_adc_switch && !spec->auto_mic && |
| + (!spec->input_mux || spec->input_mux->num_items > 1); |
| /* Additional Analaog capture for index #2 */ |
| - if (spec->alt_dac_nid || spec->num_adc_nids > 1) { |
| + if (spec->alt_dac_nid || have_multi_adcs) { |
| codec->num_pcms = 3; |
| info = spec->pcm_rec + 2; |
| info->name = spec->stream_name_analog; |
| @@ -2327,7 +2331,7 @@ static int alc_build_pcms(struct hda_cod |
| alc_pcm_null_stream; |
| info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0; |
| } |
| - if (spec->num_adc_nids > 1) { |
| + if (have_multi_adcs) { |
| p = spec->stream_analog_alt_capture; |
| if (!p) |
| p = &alc_pcm_analog_alt_capture; |