Changeset d2a0694d908f98db8b8dadbaaa2db07253344f16
- Timestamp:
- 05/08/08 18:20:19
(2 months ago)
- Author:
- Rémi Denis-Courmont <rem@videolan.org>
- git-committer:
- Rémi Denis-Courmont <rem@videolan.org> 1210263619 +0300
- git-parent:
[c3b55fa92cbc1a37e1880a773ec264aecec52486]
- git-author:
- Rémi Denis-Courmont <rem@videolan.org> 1210259576 +0300
- Message:
vlc_module_set: use vararg, more flexible
-
Files:
-
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
| rf802543 |
rd2a0694 |
|
| 391 | 391 | * Plug-in stuff |
|---|
| 392 | 392 | *****************************************************************************/ |
|---|
| 393 | | |
|---|
| 394 | | #include "vlc_modules_macros.h" |
|---|
| 395 | 393 | |
|---|
| 396 | 394 | #if defined (WIN32) && defined (DLL_EXPORT) |
|---|
| … | … | |
| 432 | 430 | # endif |
|---|
| 433 | 431 | #endif |
|---|
| | 432 | |
|---|
| | 433 | #include "vlc_modules_macros.h" |
|---|
| 434 | 434 | |
|---|
| 435 | 435 | /***************************************************************************** |
|---|
| r449fd28 |
rd2a0694 |
|
| 53 | 53 | char ***psz_longname ) ); |
|---|
| 54 | 54 | |
|---|
| 55 | | VLC_EXPORT( module_t *, vlc_module_create, ( vlc_object_t * ) ); |
|---|
| 56 | | VLC_EXPORT( module_t *, vlc_submodule_create, ( module_t * ) ); |
|---|
| 57 | | VLC_EXPORT( int, vlc_module_set, (module_t *module, int propid, void *value) ); |
|---|
| 58 | | |
|---|
| 59 | | enum vlc_module_properties |
|---|
| 60 | | { |
|---|
| 61 | | /* DO NOT EVER REMOVE, INSERT OR REPLACE ANY ITEM! It would break the ABI! |
|---|
| 62 | | * Append new items at the end ONLY. */ |
|---|
| 63 | | VLC_MODULE_CPU_REQUIREMENT, |
|---|
| 64 | | VLC_MODULE_SHORTCUT, |
|---|
| 65 | | VLC_MODULE_SHORTNAME, |
|---|
| 66 | | VLC_MODULE_DESCRIPTION, |
|---|
| 67 | | VLC_MODULE_HELP, |
|---|
| 68 | | VLC_MODULE_CAPABILITY, |
|---|
| 69 | | VLC_MODULE_SCORE, |
|---|
| 70 | | VLC_MODULE_PROGRAM, |
|---|
| 71 | | VLC_MODULE_CB_OPEN, |
|---|
| 72 | | VLC_MODULE_CB_CLOSE, |
|---|
| 73 | | VLC_MODULE_UNLOADABLE, |
|---|
| 74 | | VLC_MODULE_NAME, |
|---|
| 75 | | }; |
|---|
| 76 | | |
|---|
| 77 | 55 | VLC_EXPORT( bool, module_IsCapable, ( const module_t *m, const char *cap ) ); |
|---|
| 78 | 56 | VLC_EXPORT( const char *, module_GetObjName, ( const module_t *m ) ); |
|---|
| r7f68203 |
rd2a0694 |
|
| 3 | 3 | ***************************************************************************** |
|---|
| 4 | 4 | * Copyright (C) 2001-2006 the VideoLAN team |
|---|
| 5 | | * $Id$ |
|---|
| | 5 | * Copyright © 2007-2008 Rémi Denis-Courmont |
|---|
| 6 | 6 | * |
|---|
| 7 | 7 | * Authors: Samuel Hocevar <sam@zoy.org> |
|---|
| … | … | |
| 22 | 22 | *****************************************************************************/ |
|---|
| 23 | 23 | |
|---|
| 24 | | #if !defined( __LIBVLC__ ) |
|---|
| 25 | | #error You are not libvlc or one of its plugins. You cannot include this file |
|---|
| 26 | | #endif |
|---|
| | 24 | #ifndef LIBVLC_MODULES_MACROS_H |
|---|
| | 25 | # define LIBVLC_MODULES_MACROS_H 1 |
|---|
| 27 | 26 | |
|---|
| 28 | 27 | /***************************************************************************** |
|---|
| … | … | |
| 63 | 62 | /* If the module is built-in, then we need to define foo_InitModule instead |
|---|
| 64 | 63 | * of InitModule. Same for Activate- and DeactivateModule. */ |
|---|
| 65 | | #if defined (HAVE_DYNAMIC_PLUGINS) && !defined (__BUILTIN__) |
|---|
| | 64 | #ifdef __PLUGIN__ |
|---|
| 66 | 65 | # define E_( function ) CONCATENATE( function, MODULE_SYMBOL ) |
|---|
| 67 | 66 | # define __VLC_SYMBOL( symbol ) CONCATENATE( symbol, MODULE_SYMBOL ) |
|---|
| … | … | |
| 113 | 112 | module_config_t *p_config = NULL; \ |
|---|
| 114 | 113 | if (vlc_module_set (p_module, VLC_MODULE_NAME, \ |
|---|
| 115 | | (void *)(MODULE_STRING))) \ |
|---|
| | 114 | (const char *)(MODULE_STRING))) \ |
|---|
| 116 | 115 | goto error; \ |
|---|
| 117 | 116 | { \ |
|---|
| … | … | |
| 124 | 123 | \ |
|---|
| 125 | 124 | error: \ |
|---|
| 126 | | /* FIXME: config_Free( p_module ); */ \ |
|---|
| 127 | | /* FIXME: cleanup submodules objects ??? */ \ |
|---|
| 128 | 125 | return VLC_EGENERIC; \ |
|---|
| 129 | 126 | } \ |
|---|
| … | … | |
| 136 | 133 | #define add_requirement( cap ) \ |
|---|
| 137 | 134 | if (vlc_module_set (p_module, VLC_MODULE_CPU_REQUIREMENT, \ |
|---|
| 138 | | (void *)(intptr_t)(CPU_CAPABILITY_##cap))) goto error |
|---|
| | 135 | (int)(CPU_CAPABILITY_##cap))) \ |
|---|
| | 136 | goto error |
|---|
| 139 | 137 | |
|---|
| 140 | 138 | #define add_shortcut( shortcut ) \ |
|---|
| 141 | | if (vlc_module_set (p_submodule, VLC_MODULE_SHORTCUT, (void*)(shortcut))) \ |
|---|
| | 139 | if (vlc_module_set (p_submodule, VLC_MODULE_SHORTCUT, (int)(shortcut))) \ |
|---|
| 142 | 140 | goto error |
|---|
| 143 | 141 | |
|---|
| 144 | 142 | #define set_shortname( shortname ) \ |
|---|
| 145 | 143 | if (vlc_module_set (p_submodule, VLC_MODULE_SHORTNAME, \ |
|---|
| 146 | | (void*)(shortname))) goto error; |
|---|
| | 144 | (const char *)(shortname))) \ |
|---|
| | 145 | goto error |
|---|
| 147 | 146 | |
|---|
| 148 | 147 | #define set_description( desc ) \ |
|---|
| 149 | | if (vlc_module_set (p_submodule, VLC_MODULE_DESCRIPTION, (void*)(desc))) \ |
|---|
| | 148 | if (vlc_module_set (p_submodule, VLC_MODULE_DESCRIPTION, \ |
|---|
| | 149 | (const char *)(desc))) \ |
|---|
| 150 | 150 | goto error |
|---|
| 151 | 151 | |
|---|
| 152 | 152 | #define set_help( help ) \ |
|---|
| 153 | | if (vlc_module_set (p_submodule, VLC_MODULE_HELP, (void*)(help))) \ |
|---|
| | 153 | if (vlc_module_set (p_submodule, VLC_MODULE_HELP, (const char *)(help))) \ |
|---|
| 154 | 154 | goto error |
|---|
| 155 | 155 | |
|---|
| 156 | 156 | #define set_capability( cap, score ) \ |
|---|
| 157 | | if (vlc_module_set (p_submodule, VLC_MODULE_CAPABILITY, (void *)(cap)) \ |
|---|
| 158 | | || vlc_module_set (p_submodule, VLC_MODULE_SCORE, \ |
|---|
| 159 | | (void *)(intptr_t)(score))) \ |
|---|
| | 157 | if (vlc_module_set (p_submodule, VLC_MODULE_CAPABILITY, (int)(cap)) \ |
|---|
| | 158 | || vlc_module_set (p_submodule, VLC_MODULE_SCORE, (int)(score))) \ |
|---|
| 160 | 159 | goto error |
|---|
| 161 | 160 | |
|---|
| 162 | 161 | #define set_callbacks( activate, deactivate ) \ |
|---|
| 163 | | if (vlc_module_set (p_submodule, VLC_MODULE_CB_OPEN, (void *)(activate)) \ |
|---|
| 164 | | || vlc_module_set (p_submodule, VLC_MODULE_CB_CLOSE, \ |
|---|
| 165 | | (void *)(deactivate))) \ |
|---|
| | 162 | if (vlc_module_set (p_submodule, VLC_MODULE_CB_OPEN, activate) \ |
|---|
| | 163 | || vlc_module_set (p_submodule, VLC_MODULE_CB_CLOSE, deactivate)) \ |
|---|
| 166 | 164 | goto error |
|---|
| 167 | 165 | |
|---|
| 168 | 166 | #define linked_with_a_crap_library_which_uses_atexit( ) \ |
|---|
| 169 | | if (vlc_module_set (p_submodule, VLC_MODULE_UNLOADABLE, NULL)) goto error |
|---|
| | 167 | if (vlc_module_set (p_submodule, VLC_MODULE_NO_UNLOAD)) \ |
|---|
| | 168 | goto error |
|---|
| 170 | 169 | |
|---|
| | 170 | VLC_EXPORT( module_t *, vlc_module_create, ( vlc_object_t * ) ); |
|---|
| | 171 | VLC_EXPORT( module_t *, vlc_submodule_create, ( module_t * ) ); |
|---|
| | 172 | VLC_EXPORT( int, vlc_module_set, (module_t *module, int propid, ...) ); |
|---|
| | 173 | |
|---|
| | 174 | enum vlc_module_properties |
|---|
| | 175 | { |
|---|
| | 176 | /* DO NOT EVER REMOVE, INSERT OR REPLACE ANY ITEM! It would break the ABI! |
|---|
| | 177 | * Append new items at the end ONLY. */ |
|---|
| | 178 | VLC_MODULE_CPU_REQUIREMENT, |
|---|
| | 179 | VLC_MODULE_SHORTCUT, |
|---|
| | 180 | VLC_MODULE_SHORTNAME, |
|---|
| | 181 | VLC_MODULE_DESCRIPTION, |
|---|
| | 182 | VLC_MODULE_HELP, |
|---|
| | 183 | VLC_MODULE_CAPABILITY, |
|---|
| | 184 | VLC_MODULE_SCORE, |
|---|
| | 185 | VLC_MODULE_PROGRAM, |
|---|
| | 186 | VLC_MODULE_CB_OPEN, |
|---|
| | 187 | VLC_MODULE_CB_CLOSE, |
|---|
| | 188 | VLC_MODULE_NO_UNLOAD, |
|---|
| | 189 | VLC_MODULE_NAME, |
|---|
| | 190 | }; |
|---|
| | 191 | #endif |
|---|
| rf864df7 |
rd2a0694 |
|
| 2 | 2 | * entry.c : Callbacks for module entry point |
|---|
| 3 | 3 | ***************************************************************************** |
|---|
| 4 | | * Copyright (C) 2001-2007 the VideoLAN team |
|---|
| | 4 | * Copyright (C) 2007 the VideoLAN team |
|---|
| | 5 | * Copyright © 2007-2008 Rémi Denis-Courmont |
|---|
| 5 | 6 | * |
|---|
| 6 | 7 | * This program is free software; you can redistribute it and/or modify |
|---|
| … | … | |
| 80 | 81 | |
|---|
| 81 | 82 | |
|---|
| 82 | | int vlc_module_set (module_t *module, int propid, void *value) |
|---|
| | 83 | int vlc_module_set (module_t *module, int propid, ...) |
|---|
| 83 | 84 | { |
|---|
| | 85 | va_list ap; |
|---|
| | 86 | int ret = VLC_SUCCESS; |
|---|
| | 87 | |
|---|
| | 88 | va_start (ap, propid); |
|---|
| 84 | 89 | switch (propid) |
|---|
| 85 | 90 | { |
|---|
| 86 | 91 | case VLC_MODULE_CPU_REQUIREMENT: |
|---|
| 87 | 92 | assert (!module->b_submodule); |
|---|
| 88 | | module->i_cpu |= (intptr_t)value; |
|---|
| | 93 | module->i_cpu |= va_arg (ap, int); |
|---|
| 89 | 94 | break; |
|---|
| 90 | 95 | |
|---|
| … | … | |
| 94 | 99 | for (i = 0; module->pp_shortcuts[i] != NULL; i++); |
|---|
| 95 | 100 | if (i >= (MODULE_SHORTCUT_MAX - 1)) |
|---|
| 96 | | return VLC_ENOMEM; |
|---|
| 97 | | |
|---|
| 98 | | module->pp_shortcuts[i] = (char *)value; |
|---|
| | 101 | { |
|---|
| | 102 | ret = VLC_ENOMEM; |
|---|
| | 103 | break; |
|---|
| | 104 | } |
|---|
| | 105 | |
|---|
| | 106 | module->pp_shortcuts[i] = va_arg (ap, char *); |
|---|
| 99 | 107 | break; |
|---|
| 100 | 108 | } |
|---|
| 101 | 109 | |
|---|
| 102 | 110 | case VLC_MODULE_SHORTNAME: |
|---|
| 103 | | module->psz_shortname = (char *)value; |
|---|
| | 111 | module->psz_shortname = va_arg (ap, char *); |
|---|
| 104 | 112 | break; |
|---|
| 105 | 113 | |
|---|
| 106 | 114 | case VLC_MODULE_DESCRIPTION: |
|---|
| 107 | | module->psz_longname = (char *)value; |
|---|
| | 115 | module->psz_longname = va_arg (ap, char *); |
|---|
| 108 | 116 | break; |
|---|
| 109 | 117 | |
|---|
| 110 | 118 | case VLC_MODULE_HELP: |
|---|
| 111 | | module->psz_help = (char *)value; |
|---|
| | 119 | module->psz_help = va_arg (ap, char *); |
|---|
| 112 | 120 | break; |
|---|
| 113 | 121 | |
|---|
| 114 | 122 | case VLC_MODULE_CAPABILITY: |
|---|
| 115 | | module->psz_capability = (char *)value; |
|---|
| | 123 | module->psz_capability = va_arg (ap, char *); |
|---|
| 116 | 124 | break; |
|---|
| 117 | 125 | |
|---|
| 118 | 126 | case VLC_MODULE_SCORE: |
|---|
| 119 | | module->i_score = (intptr_t)value; |
|---|
| | 127 | module->i_score = va_arg (ap, int); |
|---|
| 120 | 128 | break; |
|---|
| 121 | 129 | |
|---|
| 122 | 130 | case VLC_MODULE_CB_OPEN: |
|---|
| 123 | | module->pf_activate = (int (*) (vlc_object_t *))value; |
|---|
| | 131 | module->pf_activate = va_arg (ap, int (*) (vlc_object_t *)); |
|---|
| 124 | 132 | break; |
|---|
| 125 | 133 | |
|---|
| 126 | 134 | case VLC_MODULE_CB_CLOSE: |
|---|
| 127 | | module->pf_deactivate = (void (*) (vlc_object_t *))value; |
|---|
| 128 | | break; |
|---|
| 129 | | |
|---|
| 130 | | case VLC_MODULE_UNLOADABLE: |
|---|
| 131 | | module->b_unloadable = (value != NULL); |
|---|
| | 135 | module->pf_deactivate = va_arg (ap, void (*) (vlc_object_t *)); |
|---|
| | 136 | break; |
|---|
| | 137 | |
|---|
| | 138 | case VLC_MODULE_NO_UNLOAD: |
|---|
| | 139 | module->b_unloadable = false; |
|---|
| 132 | 140 | break; |
|---|
| 133 | 141 | |
|---|
| 134 | 142 | case VLC_MODULE_NAME: |
|---|
| | 143 | { |
|---|
| | 144 | const char *value = va_arg (ap, const char *); |
|---|
| 135 | 145 | free( module->psz_object_name ); |
|---|
| 136 | | module->psz_object_name = strdup( (char *)value ); |
|---|
| 137 | | module->pp_shortcuts[0] = (char *)value; |
|---|
| | 146 | module->psz_object_name = strdup( value ); |
|---|
| | 147 | module->pp_shortcuts[0] = value; |
|---|
| 138 | 148 | if (module->psz_longname == default_name) |
|---|
| 139 | | module->psz_longname = (char *)value; |
|---|
| 140 | | break; |
|---|
| | 149 | module->psz_longname = value; |
|---|
| | 150 | break; |
|---|
| | 151 | } |
|---|
| 141 | 152 | |
|---|
| 142 | 153 | case VLC_MODULE_PROGRAM: |
|---|
| … | … | |
| 147 | 158 | msg_Err (module, "unknown module property %d", propid); |
|---|
| 148 | 159 | msg_Err (module, "LibVLC might be too old to use this module."); |
|---|
| 149 | | return VLC_EGENERIC; |
|---|
| | 160 | ret = VLC_EGENERIC; |
|---|
| | 161 | break; |
|---|
| 150 | 162 | } |
|---|
| 151 | | return 0; |
|---|
| | 163 | va_end (ap); |
|---|
| | 164 | return ret; |
|---|
| 152 | 165 | } |
|---|
| 153 | 166 | |
|---|