mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-28 13:16:41 +00:00
alsa-lib: add upstream patches
Signed-off-by: Stephan Raue <stephan@openelec.tv>
This commit is contained in:
parent
49869f1686
commit
6f4cb57328
@ -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 <tiwai <at> 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
|
||||||
|
|
123
packages/audio/alsa-lib/patches/alsa-lib-hda-intel-hd-002.patch
Normal file
123
packages/audio/alsa-lib/patches/alsa-lib-hda-intel-hd-002.patch
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
From: Takashi Iwai <tiwai <at> 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 <tiwai <at> 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
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user