ALSA: hda - Add standard channel maps
Although HD-audio allows pair-wise channel configurations, only the fixed channel positions are used in this version. In future, this can be changed and allow user to modify the channel positions. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
be84bbcccc
commit
9c9a5175e6
|
@ -3688,6 +3688,36 @@ int /*__devinit*/ snd_hda_build_controls(struct hda_bus *bus)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_HDA(snd_hda_build_controls);
|
EXPORT_SYMBOL_HDA(snd_hda_build_controls);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* add standard channel maps if not specified
|
||||||
|
*/
|
||||||
|
static int add_std_chmaps(struct hda_codec *codec)
|
||||||
|
{
|
||||||
|
int i, str, err;
|
||||||
|
|
||||||
|
for (i = 0; i < codec->num_pcms; i++) {
|
||||||
|
for (str = 0; str < 2; str++) {
|
||||||
|
struct snd_pcm *pcm = codec->pcm_info[i].pcm;
|
||||||
|
struct hda_pcm_stream *hinfo =
|
||||||
|
&codec->pcm_info[i].stream[str];
|
||||||
|
struct snd_pcm_chmap *chmap;
|
||||||
|
|
||||||
|
if (codec->pcm_info[i].own_chmap)
|
||||||
|
continue;
|
||||||
|
if (!pcm || !hinfo->substreams)
|
||||||
|
continue;
|
||||||
|
err = snd_pcm_add_chmap_ctls(pcm, str,
|
||||||
|
snd_pcm_std_chmaps,
|
||||||
|
hinfo->channels_max,
|
||||||
|
0, &chmap);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
chmap->channel_mask = SND_PCM_CHMAP_MASK_2468;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int snd_hda_codec_build_controls(struct hda_codec *codec)
|
int snd_hda_codec_build_controls(struct hda_codec *codec)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
@ -3699,6 +3729,12 @@ int snd_hda_codec_build_controls(struct hda_codec *codec)
|
||||||
err = codec->patch_ops.build_controls(codec);
|
err = codec->patch_ops.build_controls(codec);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
/* we create chmaps here instead of build_pcms */
|
||||||
|
err = add_std_chmaps(codec);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
|
||||||
snd_hda_jack_report_sync(codec); /* call at the last init point */
|
snd_hda_jack_report_sync(codec); /* call at the last init point */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -776,6 +776,7 @@ struct hda_pcm {
|
||||||
unsigned int pcm_type; /* HDA_PCM_TYPE_XXX */
|
unsigned int pcm_type; /* HDA_PCM_TYPE_XXX */
|
||||||
int device; /* device number to assign */
|
int device; /* device number to assign */
|
||||||
struct snd_pcm *pcm; /* assigned PCM instance */
|
struct snd_pcm *pcm; /* assigned PCM instance */
|
||||||
|
bool own_chmap; /* codec driver provides own channel maps */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* codec information */
|
/* codec information */
|
||||||
|
|
|
@ -2287,6 +2287,8 @@ static int alc_build_pcms(struct hda_codec *codec)
|
||||||
p = &alc_pcm_analog_playback;
|
p = &alc_pcm_analog_playback;
|
||||||
info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
|
info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
|
||||||
info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
|
info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
|
||||||
|
info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max =
|
||||||
|
spec->multiout.max_channels;
|
||||||
}
|
}
|
||||||
if (spec->adc_nids) {
|
if (spec->adc_nids) {
|
||||||
p = spec->stream_analog_capture;
|
p = spec->stream_analog_capture;
|
||||||
|
|
Loading…
Reference in a new issue