接着(二),重新把vlc_entry__core 写出来:
int vlc_entry__core (vlc_set_cb vlc_set, void *opaque)
{
module_t *module;
module_config_t *config = NULL;
if (vlc_set (opaque, NULL, VLC_MODULE_CREATE, &module)
goto error;
if (vlc_set (opaque, module, VLC_MODULE_NAME, (MODULE_STRING)))
goto error;
vlc_set 实际上是开始传进来的vlc_plugin_setter ,看下VLC_MODULE_CREATE传进来后的代码:
static int vlc_plugin_setter (void *plugin, void *tgt, int propid, ...) {
switch (propid)
{
case VLC_MODULE_CREATE:
{
module = *pprimary;
module_t *submodule = vlc_module_create (module);
*(va_arg (ap, module_t **)) = submodule;
.......
}
注意(va_arg (ap, module_t *)) = submodule;这句,ap正好对应第四个参数,它是&module, 因此module被创建出来了。后面的vlc_set (opaque, module, VLC_MODULE_NAME, (MODULE_STRING))也是类似。
再看回(二)中的:
vlc_module_begin ()
set_category( CAT_AUDIO )
set_subcategory( SUBCAT_AUDIO_GENERAL )
add_category_hint( N_("Audio"), AOUT_CAT_LONGTEXT , false )
中间的设置非常多!!!
vlc_module_end ()
其实set_category( CAT_AUDIO )等等这些都是宏,他们实际上都是通过vlc_plugin_setter 给module设置参数,就不一一详述了。