diff --git a/packages/audio/alsa-lib/patches/alsa-lib-990.01-control_Simplify_usingsnd_config_get_bool.patch b/packages/audio/alsa-lib/patches/alsa-lib-990.01-control_Simplify_usingsnd_config_get_bool.patch new file mode 100644 index 0000000000..3d679bf07e --- /dev/null +++ b/packages/audio/alsa-lib/patches/alsa-lib-990.01-control_Simplify_usingsnd_config_get_bool.patch @@ -0,0 +1,87 @@ +From: Takashi Iwai suse.de> +Subject: [PATCH RFC 1/2] control: Simplify using snd_config_get_bool() +Newsgroups: gmane.linux.alsa.devel +Date: 2012-10-12 15:25:23 GMT (17 weeks, 8 hours and 26 minutes ago) +snd_config_get_bool() was improved to parse also ASCII strings now, +so we don't have to open-code the boolean parser in +src/control/setup.c any longer. + +Signed-off-by: Takashi Iwai suse.de> +--- + src/control/setup.c | 37 ++++++------------------------------- + 1 file changed, 6 insertions(+), 31 deletions(-) + +diff --git a/src/control/setup.c b/src/control/setup.c +index eecda45..bd3599d 100644 +--- a/src/control/setup.c ++++ b/src/control/setup.c +@@ -400,7 +400,6 @@ static int add_elem(snd_sctl_t *h, snd_config_t *_conf, snd_config_t *private_da + { + snd_config_t *conf; + snd_config_iterator_t i, next; +- char *tmp; + int iface = SND_CTL_ELEM_IFACE_MIXER; + const char *name = NULL; + long index = 0; +@@ -464,33 +463,17 @@ static int add_elem(snd_sctl_t *h, snd_config_t *_conf, snd_config_t *private_da + continue; + } + if (strcmp(id, "lock") == 0) { +- if ((err = snd_config_get_ascii(n, &tmp)) < 0) { +- SNDERR("field %s has an invalid type", id); +- goto _err; +- } +- err = snd_config_get_bool_ascii(tmp); +- if (err < 0) { +- SNDERR("field %s is not a boolean", id); +- free(tmp); ++ err = snd_config_get_bool(n); ++ if (err < 0) + goto _err; +- } + lock = err; +- free(tmp); + continue; + } + if (strcmp(id, "preserve") == 0) { +- if ((err = snd_config_get_ascii(n, &tmp)) < 0) { +- SNDERR("field %s has an invalid type", id); +- goto _err; +- } +- err = snd_config_get_bool_ascii(tmp); +- if (err < 0) { +- SNDERR("field %s is not a boolean", id); +- free(tmp); ++ err = snd_config_get_bool(n); ++ if (err < 0) + goto _err; +- } + preserve = err; +- free(tmp); + continue; + } + if (strcmp(id, "value") == 0) { +@@ -502,18 +485,10 @@ static int add_elem(snd_sctl_t *h, snd_config_t *_conf, snd_config_t *private_da + continue; + } + if (strcmp(id, "optional") == 0) { +- if ((err = snd_config_get_ascii(n, &tmp)) < 0) { +- SNDERR("field %s has an invalid type", id); +- goto _err; +- } +- err = snd_config_get_bool_ascii(tmp); +- if (err < 0) { +- SNDERR("field %s is not a boolean", id); +- free(tmp); ++ err = snd_config_get_bool(n); ++ if (err < 0) + goto _err; +- } + optional = err; +- free(tmp); + continue; + } + SNDERR("Unknown field %s", id); +-- +1.7.12.2 + diff --git a/packages/audio/alsa-lib/patches/alsa-lib-990.02-Add_workaround_for_conflicting_IEC958controls_for_HD-audio.patch b/packages/audio/alsa-lib/patches/alsa-lib-990.02-Add_workaround_for_conflicting_IEC958controls_for_HD-audio.patch new file mode 100644 index 0000000000..cbe465673f --- /dev/null +++ b/packages/audio/alsa-lib/patches/alsa-lib-990.02-Add_workaround_for_conflicting_IEC958controls_for_HD-audio.patch @@ -0,0 +1,122 @@ +From: Takashi Iwai suse.de> +Subject: [PATCH RFC 2/2] Add workaround for conflicting IEC958 controls for HD-audio +Newsgroups: gmane.linux.alsa.devel +Date: 2012-10-12 15:25:49 GMT (17 weeks, 8 hours and 27 minutes ago) +When both an SPDIF and an HDMI output are present on HD-audio, both +try to access IEC958 controls with index=0 although one of them must +be wrong. For avoiding this conflict, the recent kernel code moves +the IEC958 controls of an SPDIF with device=1 once when the conflict +happens. + +In this patch, the corresponding support is added in alsa-lib side. +The new "skip_rest" boolean flag is added to the hooked element +definition which indicates that the rest of element array will be +ignored once when this element is present and evaluated. With this +new flag, the HD-audio config takes device=1 primarily, then take +device=0 as fallback. + +Signed-off-by: Takashi Iwai suse.de> +--- + src/conf/cards/HDA-Intel.conf | 16 ++++++++++++++++ + src/control/setup.c | 19 ++++++++++++++++--- + 2 files changed, 32 insertions(+), 3 deletions(-) + +diff --git a/src/conf/cards/HDA-Intel.conf b/src/conf/cards/HDA-Intel.conf +index d4f2667..55fb624 100644 +--- a/src/conf/cards/HDA-Intel.conf ++++ b/src/conf/cards/HDA-Intel.conf +@@ -113,6 +113,22 @@ HDA-Intel.pcm.iec958.0 { + hook_args [ + { + name "IEC958 Playback Default" ++ device 1 ++ optional true ++ lock true ++ preserve true ++ value [ $AES0 $AES1 $AES2 $AES3 ] ++ } ++ { ++ name "IEC958 Playback Switch" ++ device 1 ++ optional true ++ value true ++ # if this element is present, skip the rest ++ skip_rest true ++ } ++ { ++ name "IEC958 Playback Default" + lock true + preserve true + value [ $AES0 $AES1 $AES2 $AES3 ] +diff --git a/src/control/setup.c b/src/control/setup.c +index bd3599d..f23bf2c 100644 +--- a/src/control/setup.c ++++ b/src/control/setup.c +@@ -396,7 +396,7 @@ static int snd_config_get_ctl_elem_value(snd_config_t *conf, + return 0; + } + +-static int add_elem(snd_sctl_t *h, snd_config_t *_conf, snd_config_t *private_data) ++static int add_elem(snd_sctl_t *h, snd_config_t *_conf, snd_config_t *private_data, int *quit) + { + snd_config_t *conf; + snd_config_iterator_t i, next; +@@ -408,6 +408,7 @@ static int add_elem(snd_sctl_t *h, snd_config_t *_conf, snd_config_t *private_da + int lock = 0; + int preserve = 0; + int optional = 0; ++ int skip_rest = 0; + snd_config_t *value = NULL, *mask = NULL; + snd_sctl_elem_t *elem = NULL; + int err; +@@ -491,6 +492,13 @@ static int add_elem(snd_sctl_t *h, snd_config_t *_conf, snd_config_t *private_da + optional = err; + continue; + } ++ if (strcmp(id, "skip_rest") == 0) { ++ err = snd_config_get_bool(n); ++ if (err < 0) ++ goto _err; ++ skip_rest = err; ++ continue; ++ } + SNDERR("Unknown field %s", id); + return -EINVAL; + } +@@ -539,6 +547,9 @@ static int add_elem(snd_sctl_t *h, snd_config_t *_conf, snd_config_t *private_da + if (! optional) + SNDERR("Cannot obtain info for CTL elem (%s,'%s',%li,%li,%li): %s",snd_ctl_elem_iface_name(iface), name, index, device, subdevice, snd_strerror(err)); + goto _err; ++ } else { ++ if (skip_rest) ++ *quit = 1; + } + snd_ctl_elem_value_set_id(elem->val, elem->id); + snd_ctl_elem_value_set_id(elem->old, elem->id); +@@ -594,7 +605,7 @@ int snd_sctl_build(snd_sctl_t **sctl, snd_ctl_t *handle, snd_config_t *conf, snd + { + snd_sctl_t *h; + snd_config_iterator_t i, next; +- int err; ++ int err, quit = 0; + + assert(sctl); + assert(handle); +@@ -614,11 +625,13 @@ int snd_sctl_build(snd_sctl_t **sctl, snd_ctl_t *handle, snd_config_t *conf, snd + INIT_LIST_HEAD(&h->elems); + snd_config_for_each(i, next, conf) { + snd_config_t *n = snd_config_iterator_entry(i); +- err = add_elem(h, n, private_data); ++ err = add_elem(h, n, private_data, &quit); + if (err < 0) { + free_elems(h); + return err; + } ++ if (quit) ++ break; + } + *sctl = h; + return 0; +-- +1.7.12.2 + diff --git a/packages/audio/alsa-lib/patches/alsa-lib-990.04-hcontrol-Add-workaround-for-handling-IEC958-workaround.patch b/packages/audio/alsa-lib/patches/alsa-lib-990.04-hcontrol-Add-workaround-for-handling-IEC958-workaround.patch new file mode 100644 index 0000000000..4e14e471ea --- /dev/null +++ b/packages/audio/alsa-lib/patches/alsa-lib-990.04-hcontrol-Add-workaround-for-handling-IEC958-workaround.patch @@ -0,0 +1,37 @@ +From b7f85e4b35aeead9b3c64f06c0c4a4617baaf7f5 Mon Sep 17 00:00:00 2001 +From: Anssi Hannula +Date: Sat, 9 Feb 2013 01:37:48 +0200 +Subject: [PATCH] hcontrol: Add workaround for handling IEC958 workaround + +IEC958 workaround in the kernel can cause controls that have same the +same name and index but a different device. + +Temporarily ignore failure of adding such conflicting controls if the +mixer class fails on them. +--- + src/control/hcontrol.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/src/control/hcontrol.c b/src/control/hcontrol.c +index ee1d907..dfc0a5a 100644 +--- a/src/control/hcontrol.c ++++ b/src/control/hcontrol.c +@@ -612,8 +612,13 @@ int snd_hctl_load(snd_hctl_t *hctl) + for (idx = 0; idx < hctl->count; idx++) { + int res = snd_hctl_throw_event(hctl, SNDRV_CTL_EVENT_MASK_ADD, + hctl->pelems[idx]); +- if (res < 0) +- return res; ++ if (res < 0) { ++ if (res == -EINVAL && snd_hctl_elem_get_device(hctl->pelems[idx]) == 1) { ++ SNDERR("ignoring mixer element addition failure on device 1 - IEC958 conflict workaround"); ++ } else { ++ return res; ++ } ++ } + } + err = snd_ctl_subscribe_events(hctl->ctl, 1); + _end: +-- +1.7.10 +