int snd_config_hook_load_for_all_cards(snd_config_t *root, snd_config_t *config, snd_config_t **dst, snd_config_t *private_data ATTRIBUTE_UNUSED)
{
int card = -1, err;
+ snd_config_t *loaded; // trace loaded cards
+ err = snd_config_top(&loaded);
+ if (err < 0)
+ return err;
do {
err = snd_card_next(&card);
if (err < 0)
- return err;
+ goto __fin_err;
if (card >= 0) {
- snd_config_t *n, *private_data = NULL;
+ snd_config_t *n, *m, *private_data = NULL;
const char *driver;
char *fdriver = NULL;
+ bool load;
err = snd_determine_driver(card, &fdriver);
if (err < 0)
- return err;
+ goto __fin_err;
if (snd_config_search(root, fdriver, &n) >= 0) {
if (snd_config_get_string(n, &driver) < 0) {
if (snd_config_get_type(n) == SND_CONFIG_TYPE_COMPOUND) {
driver = fdriver;
}
__std:
+ load = true;
+ err = snd_config_imake_integer(&m, driver, 1);
+ if (err < 0)
+ goto __err;
+ err = snd_config_add(loaded, m);
+ if (err < 0) {
+ if (err == -EEXIST) {
+ snd_config_delete(m);
+ load = false;
+ } else {
+ goto __err;
+ }
+ }
private_data = _snd_config_hook_private_data(card, driver);
if (!private_data) {
err = -ENOMEM;
err = _snd_config_hook_table(root, config, private_data);
if (err < 0)
goto __err;
- err = snd_config_hook_load(root, config, &n, private_data);
+ if (load)
+ err = snd_config_hook_load(root, config, &n, private_data);
__err:
if (private_data)
snd_config_delete(private_data);
free(fdriver);
if (err < 0)
- return err;
+ goto __fin_err;
}
} while (card >= 0);
+ snd_config_delete(loaded);
*dst = NULL;
return 0;
+__fin_err:
+ snd_config_delete(loaded);
+ return err;
}
#ifndef DOC_HIDDEN
SND_DLSYM_BUILD_VERSION(snd_config_hook_load_for_all_cards, SND_CONFIG_DLSYM_VERSION_HOOK);