diff options
author | Takashi Iwai <tiwai@suse.de> | 2011-06-20 06:47:45 -0400 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2011-06-20 10:24:12 -0400 |
commit | 370bafbdae3d78c9081ebe3028a3ff5f0e91357b (patch) | |
tree | 001eba76685c47454edac41d859e5c77220f889a | |
parent | 4a918ffeaadd6a2269b9c6575478c102382c7702 (diff) |
ALSA: hda - Create virtual-master control for VIA codecs
Now let's add the missing Master control to VIA codecs.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r-- | sound/pci/hda/patch_via.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c index 1edcd3221c98..deb33ae109c8 100644 --- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c | |||
@@ -1308,6 +1308,31 @@ static const struct hda_pcm_stream via_pcm_digital_capture = { | |||
1308 | .channels_max = 2, | 1308 | .channels_max = 2, |
1309 | }; | 1309 | }; |
1310 | 1310 | ||
1311 | /* | ||
1312 | * slave controls for virtual master | ||
1313 | */ | ||
1314 | static const char * const via_slave_vols[] = { | ||
1315 | "Front Playback Volume", | ||
1316 | "Surround Playback Volume", | ||
1317 | "Center Playback Volume", | ||
1318 | "LFE Playback Volume", | ||
1319 | "Side Playback Volume", | ||
1320 | "Headphone Playback Volume", | ||
1321 | "Speaker Playback Volume", | ||
1322 | NULL, | ||
1323 | }; | ||
1324 | |||
1325 | static const char * const via_slave_sws[] = { | ||
1326 | "Front Playback Switch", | ||
1327 | "Surround Playback Switch", | ||
1328 | "Center Playback Switch", | ||
1329 | "LFE Playback Switch", | ||
1330 | "Side Playback Switch", | ||
1331 | "Headphone Playback Switch", | ||
1332 | "Speaker Playback Switch", | ||
1333 | NULL, | ||
1334 | }; | ||
1335 | |||
1311 | static int via_build_controls(struct hda_codec *codec) | 1336 | static int via_build_controls(struct hda_codec *codec) |
1312 | { | 1337 | { |
1313 | struct via_spec *spec = codec->spec; | 1338 | struct via_spec *spec = codec->spec; |
@@ -1343,6 +1368,23 @@ static int via_build_controls(struct hda_codec *codec) | |||
1343 | return err; | 1368 | return err; |
1344 | } | 1369 | } |
1345 | 1370 | ||
1371 | /* if we have no master control, let's create it */ | ||
1372 | if (!snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) { | ||
1373 | unsigned int vmaster_tlv[4]; | ||
1374 | snd_hda_set_vmaster_tlv(codec, spec->multiout.dac_nids[0], | ||
1375 | HDA_OUTPUT, vmaster_tlv); | ||
1376 | err = snd_hda_add_vmaster(codec, "Master Playback Volume", | ||
1377 | vmaster_tlv, via_slave_vols); | ||
1378 | if (err < 0) | ||
1379 | return err; | ||
1380 | } | ||
1381 | if (!snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) { | ||
1382 | err = snd_hda_add_vmaster(codec, "Master Playback Switch", | ||
1383 | NULL, via_slave_sws); | ||
1384 | if (err < 0) | ||
1385 | return err; | ||
1386 | } | ||
1387 | |||
1346 | /* assign Capture Source enums to NID */ | 1388 | /* assign Capture Source enums to NID */ |
1347 | kctl = snd_hda_find_mixer_ctl(codec, "Input Source"); | 1389 | kctl = snd_hda_find_mixer_ctl(codec, "Input Source"); |
1348 | for (i = 0; kctl && i < kctl->count; i++) { | 1390 | for (i = 0; kctl && i < kctl->count; i++) { |