-
-
Notifications
You must be signed in to change notification settings - Fork 12.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
alsa: Add multilib plugin support via "libs" entry in asound config.
alsa: Remove unused $ALSA_PLUGIN_DIRS support.
- Loading branch information
1 parent
02c89b5
commit ab8ef63
Showing
4 changed files
with
233 additions
and
117 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
232 changes: 232 additions & 0 deletions
232
pkgs/os-specific/linux/alsa-lib/alsa-plugin-conf-multilib.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,232 @@ | ||
diff --git a/src/control/control.c b/src/control/control.c | ||
index d66ed75..42cecad 100644 | ||
--- a/src/control/control.c | ||
+++ b/src/control/control.c | ||
@@ -838,6 +838,10 @@ static int snd_ctl_open_conf(snd_ctl_t **ctlp, const char *name, | ||
#ifndef PIC | ||
extern void *snd_control_open_symbols(void); | ||
#endif | ||
+ | ||
+ snd_config_t *libs = NULL; | ||
+ const char *libs_lib = NULL; | ||
+ | ||
if (snd_config_get_type(ctl_conf) != SND_CONFIG_TYPE_COMPOUND) { | ||
if (name) | ||
SNDERR("Invalid type for CTL %s definition", name); | ||
@@ -879,6 +883,19 @@ static int snd_ctl_open_conf(snd_ctl_t **ctlp, const char *name, | ||
SNDERR("Invalid type for %s", id); | ||
goto _err; | ||
} | ||
+ | ||
+ continue; | ||
+ } | ||
+ // Handle an array of extra libs. | ||
+ if (strcmp(id, "libs") == 0) { | ||
+ if (snd_config_get_type(n) != SND_CONFIG_TYPE_COMPOUND) { | ||
+ SNDERR("Invalid type for libs definition in CTL %s definition", | ||
+ str); | ||
+ goto _err; | ||
+ } | ||
+ | ||
+ libs = n; | ||
+ | ||
continue; | ||
} | ||
if (strcmp(id, "open") == 0) { | ||
@@ -903,7 +920,62 @@ static int snd_ctl_open_conf(snd_ctl_t **ctlp, const char *name, | ||
open_name = buf; | ||
sprintf(buf, "_snd_ctl_%s_open", str); | ||
} | ||
- if (!lib) { | ||
+ | ||
+#ifndef PIC | ||
+ snd_control_open_symbols(); | ||
+#endif | ||
+ | ||
+ // Normal alsa behaviour when there is no libs array. | ||
+ if (!libs) { | ||
+ if (lib) { | ||
+ open_func = snd_dlobj_cache_get(lib, open_name, | ||
+ SND_DLSYM_VERSION(SND_CONTROL_DLSYM_VERSION), 1); | ||
+ } | ||
+ } | ||
+ // Handle libs array. | ||
+ // Suppresses error messages if any function is loaded successfully. | ||
+ else { | ||
+ if (lib) { | ||
+ open_func = snd_dlobj_cache_get(lib, open_name, | ||
+ SND_DLSYM_VERSION(SND_CONTROL_DLSYM_VERSION), 0); | ||
+ } | ||
+ | ||
+ if (!open_func) { | ||
+ snd_config_for_each(i, next, libs) { | ||
+ snd_config_t *n = snd_config_iterator_entry(i); | ||
+ | ||
+ err = snd_config_get_string(n, &libs_lib); | ||
+ if (err < 0) { | ||
+ SNDERR("Invalid entry in CTL %s libs definition", str); | ||
+ goto _err; | ||
+ } | ||
+ | ||
+ if (!open_func) { | ||
+ open_func = snd_dlobj_cache_get(libs_lib, open_name, | ||
+ SND_DLSYM_VERSION(SND_CONTROL_DLSYM_VERSION), 0); | ||
+ } | ||
+ } | ||
+ } | ||
+ | ||
+ // Print error messages. | ||
+ if (!open_func) { | ||
+ if (lib) { | ||
+ SNDERR("Either %s cannot be opened or %s was not defined inside", | ||
+ lib, open_name); | ||
+ } | ||
+ | ||
+ snd_config_for_each(i, next, libs) { | ||
+ snd_config_t *n = snd_config_iterator_entry(i); | ||
+ | ||
+ snd_config_get_string(n, &libs_lib); | ||
+ SNDERR("Either %s cannot be opened or %s was not defined inside", | ||
+ libs_lib, open_name); | ||
+ } | ||
+ } | ||
+ } | ||
+ | ||
+ // Look in ALSA_PLUGIN_DIR iff we found nowhere else to look. | ||
+ if (!lib && (!libs || !libs_lib)) { | ||
const char *const *build_in = build_in_ctls; | ||
while (*build_in) { | ||
if (!strcmp(*build_in, str)) | ||
@@ -919,12 +991,11 @@ static int snd_ctl_open_conf(snd_ctl_t **ctlp, const char *name, | ||
lib = buf1; | ||
sprintf(buf1, "%s/libasound_module_ctl_%s.so", ALSA_PLUGIN_DIR, str); | ||
} | ||
- } | ||
-#ifndef PIC | ||
- snd_control_open_symbols(); | ||
-#endif | ||
- open_func = snd_dlobj_cache_get(lib, open_name, | ||
+ | ||
+ open_func = snd_dlobj_cache_get(lib, open_name, | ||
SND_DLSYM_VERSION(SND_CONTROL_DLSYM_VERSION), 1); | ||
+ } | ||
+ | ||
if (open_func) { | ||
err = open_func(ctlp, name, ctl_root, ctl_conf, mode); | ||
if (err >= 0) { | ||
diff --git a/src/pcm/pcm.c b/src/pcm/pcm.c | ||
index 2e24338..7f489f4 100644 | ||
--- a/src/pcm/pcm.c | ||
+++ b/src/pcm/pcm.c | ||
@@ -2116,6 +2116,10 @@ static int snd_pcm_open_conf(snd_pcm_t **pcmp, const char *name, | ||
#ifndef PIC | ||
extern void *snd_pcm_open_symbols(void); | ||
#endif | ||
+ | ||
+ snd_config_t *libs = NULL; | ||
+ const char *libs_lib = NULL; | ||
+ | ||
if (snd_config_get_type(pcm_conf) != SND_CONFIG_TYPE_COMPOUND) { | ||
char *val; | ||
id = NULL; | ||
@@ -2160,6 +2164,19 @@ static int snd_pcm_open_conf(snd_pcm_t **pcmp, const char *name, | ||
SNDERR("Invalid type for %s", id); | ||
goto _err; | ||
} | ||
+ | ||
+ continue; | ||
+ } | ||
+ // Handle an array of extra libs. | ||
+ if (strcmp(id, "libs") == 0) { | ||
+ if (snd_config_get_type(n) != SND_CONFIG_TYPE_COMPOUND) { | ||
+ SNDERR("Invalid type for libs definition in PCM %s definition", | ||
+ str); | ||
+ goto _err; | ||
+ } | ||
+ | ||
+ libs = n; | ||
+ | ||
continue; | ||
} | ||
if (strcmp(id, "open") == 0) { | ||
@@ -2184,7 +2201,62 @@ static int snd_pcm_open_conf(snd_pcm_t **pcmp, const char *name, | ||
open_name = buf; | ||
sprintf(buf, "_snd_pcm_%s_open", str); | ||
} | ||
- if (!lib) { | ||
+ | ||
+#ifndef PIC | ||
+ snd_pcm_open_symbols(); /* this call is for static linking only */ | ||
+#endif | ||
+ | ||
+ // Normal alsa behaviour when there is no libs array. | ||
+ if (!libs) { | ||
+ if (lib) { | ||
+ open_func = snd_dlobj_cache_get(lib, open_name, | ||
+ SND_DLSYM_VERSION(SND_PCM_DLSYM_VERSION), 1); | ||
+ } | ||
+ } | ||
+ // Handle libs array. | ||
+ // Suppresses error messages if any function is loaded successfully. | ||
+ else { | ||
+ if (lib) { | ||
+ open_func = snd_dlobj_cache_get(lib, open_name, | ||
+ SND_DLSYM_VERSION(SND_PCM_DLSYM_VERSION), 0); | ||
+ } | ||
+ | ||
+ if (!open_func) { | ||
+ snd_config_for_each(i, next, libs) { | ||
+ snd_config_t *n = snd_config_iterator_entry(i); | ||
+ | ||
+ err = snd_config_get_string(n, &libs_lib); | ||
+ if (err < 0) { | ||
+ SNDERR("Invalid entry in PCM %s libs definition", str); | ||
+ goto _err; | ||
+ } | ||
+ | ||
+ if (!open_func) { | ||
+ open_func = snd_dlobj_cache_get(libs_lib, open_name, | ||
+ SND_DLSYM_VERSION(SND_PCM_DLSYM_VERSION), 0); | ||
+ } | ||
+ } | ||
+ } | ||
+ | ||
+ // Print error messages. | ||
+ if (!open_func) { | ||
+ if (lib) { | ||
+ SNDERR("Either %s cannot be opened or %s was not defined inside", | ||
+ lib, open_name); | ||
+ } | ||
+ | ||
+ snd_config_for_each(i, next, libs) { | ||
+ snd_config_t *n = snd_config_iterator_entry(i); | ||
+ | ||
+ snd_config_get_string(n, &libs_lib); | ||
+ SNDERR("Either %s cannot be opened or %s was not defined inside", | ||
+ libs_lib, open_name); | ||
+ } | ||
+ } | ||
+ } | ||
+ | ||
+ // Look in ALSA_PLUGIN_DIR iff we found nowhere else to look. | ||
+ if (!lib && (!libs || !libs_lib)) { | ||
const char *const *build_in = build_in_pcms; | ||
while (*build_in) { | ||
if (!strcmp(*build_in, str)) | ||
@@ -2200,12 +2272,11 @@ static int snd_pcm_open_conf(snd_pcm_t **pcmp, const char *name, | ||
lib = buf1; | ||
sprintf(buf1, "%s/libasound_module_pcm_%s.so", ALSA_PLUGIN_DIR, str); | ||
} | ||
- } | ||
-#ifndef PIC | ||
- snd_pcm_open_symbols(); /* this call is for static linking only */ | ||
-#endif | ||
- open_func = snd_dlobj_cache_get(lib, open_name, | ||
+ | ||
+ open_func = snd_dlobj_cache_get(lib, open_name, | ||
SND_DLSYM_VERSION(SND_PCM_DLSYM_VERSION), 1); | ||
+ } | ||
+ | ||
if (open_func) { | ||
err = open_func(pcmp, name, pcm_root, pcm_conf, stream, mode); | ||
if (err >= 0) { |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters