/* We allow only one fabric. This simplifies things,
* and more don't really make that much sense */ staticstruct aoa_fabric *fabric; static LIST_HEAD(codec_list);
staticint attach_codec_to_fabric(struct aoa_codec *c)
{ int err;
if (!try_module_get(c->owner)) return -EBUSY; /* found_codec has to be assigned */
err = -ENOENT; if (fabric->found_codec)
err = fabric->found_codec(c); if (err) {
module_put(c->owner);
printk(KERN_ERR "snd-aoa: fabric didn't like codec %s\n",
c->name); return err;
}
c->fabric = fabric;
err = 0; if (c->init)
err = c->init(c); if (err) {
printk(KERN_ERR "snd-aoa: codec %s didn't init\n", c->name);
c->fabric = NULL; if (fabric->remove_codec)
fabric->remove_codec(c);
module_put(c->owner); return err;
} if (fabric->attached_codec)
fabric->attached_codec(c); return 0;
}
int aoa_codec_register(struct aoa_codec *codec)
{ int err = 0;
/* if there's a fabric already, we can tell if we * will want to have this codec, so propagate error
* through. Otherwise, this will happen later... */ if (fabric)
err = attach_codec_to_fabric(codec); if (!err)
list_add(&codec->list, &codec_list); return err;
}
EXPORT_SYMBOL_GPL(aoa_codec_register);
int aoa_fabric_register(struct aoa_fabric *new_fabric, struct device *dev)
{ struct aoa_codec *c; int err;
/* allow querying for presence of fabric
* (i.e. do this test first!) */ if (new_fabric == fabric) {
err = -EALREADY; goto attach;
} if (fabric) return -EEXIST; if (!new_fabric) return -EINVAL;
err = aoa_alsa_init(new_fabric->name, new_fabric->owner, dev); if (err) return err;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.