From 6f4cb57328e5a5c99bd714b24b9e9694606d31bf Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sat, 2 Feb 2013 22:46:41 +0100 Subject: [PATCH] alsa-lib: add upstream patches Signed-off-by: Stephan Raue --- .../patches/alsa-lib-hda-intel-hd-001.patch | 83 ++++++++++++ .../patches/alsa-lib-hda-intel-hd-002.patch | 123 ++++++++++++++++++ 2 files changed, 206 insertions(+) create mode 100644 packages/audio/alsa-lib/patches/alsa-lib-hda-intel-hd-001.patch create mode 100644 packages/audio/alsa-lib/patches/alsa-lib-hda-intel-hd-002.patch diff --git a/packages/audio/alsa-lib/patches/alsa-lib-hda-intel-hd-001.patch b/packages/audio/alsa-lib/patches/alsa-lib-hda-intel-hd-001.patch new file mode 100644 index 0000000000..48bf3318ec --- /dev/null +++ b/packages/audio/alsa-lib/patches/alsa-lib-hda-intel-hd-001.patch @@ -0,0 +1,83 @@ +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-hda-intel-hd-002.patch b/packages/audio/alsa-lib/patches/alsa-lib-hda-intel-hd-002.patch new file mode 100644 index 0000000000..72b115faf4 --- /dev/null +++ b/packages/audio/alsa-lib/patches/alsa-lib-hda-intel-hd-002.patch @@ -0,0 +1,123 @@ +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 (16 weeks, 1 day, 5 hours and 49 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 +