Skip to content

Commit

Permalink
ALSA: hda - Add standard channel maps
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Takashi Iwai committed Sep 6, 2012
1 parent be84bbc commit 9c9a517
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 0 deletions.
36 changes: 36 additions & 0 deletions sound/pci/hda/hda_codec.c
Original file line number Diff line number Diff line change
Expand Up @@ -3688,6 +3688,36 @@ int /*__devinit*/ snd_hda_build_controls(struct hda_bus *bus)
}
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 err = 0;
Expand All @@ -3699,6 +3729,12 @@ int snd_hda_codec_build_controls(struct hda_codec *codec)
err = codec->patch_ops.build_controls(codec);
if (err < 0)
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 */
return 0;
}
Expand Down
1 change: 1 addition & 0 deletions sound/pci/hda/hda_codec.h
Original file line number Diff line number Diff line change
Expand Up @@ -776,6 +776,7 @@ struct hda_pcm {
unsigned int pcm_type; /* HDA_PCM_TYPE_XXX */
int device; /* device number to assign */
struct snd_pcm *pcm; /* assigned PCM instance */
bool own_chmap; /* codec driver provides own channel maps */
};

/* codec information */
Expand Down
2 changes: 2 additions & 0 deletions sound/pci/hda/patch_realtek.c
Original file line number Diff line number Diff line change
Expand Up @@ -2287,6 +2287,8 @@ static int alc_build_pcms(struct hda_codec *codec)
p = &alc_pcm_analog_playback;
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].channels_max =
spec->multiout.max_channels;
}
if (spec->adc_nids) {
p = spec->stream_analog_capture;
Expand Down

0 comments on commit 9c9a517

Please sign in to comment.