Changeset 5511:e2207bedaf0e in roaraudio
- Timestamp:
- 05/28/12 12:25:20 (11 years ago)
- Branch:
- default
- Phase:
- public
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
ChangeLog
r5506 r5511 4 4 * Added simple UUID interface (Closes: #230) 5 5 * Improved random number generator. 6 * Added a way to register plugin parts with a universal API (Closes: #245) 6 7 7 8 v. 1.0beta1 - Sat May 12 2012 11:49 CEST -
include/libroar/roardl.h
r5501 r5511 48 48 #define ROAR_DL_HANDLE_DEFAULT ((struct roar_dl_lhandle*)(void*)0) 49 49 #define ROAR_DL_HANDLE_NEXT ((struct roar_dl_lhandle*)(void*)1) 50 51 #define ROAR_DL_FN_DSTR 0 52 #define ROAR_DL_FN_CDRIVER 1 53 #define ROAR_DL_FN_TRANSCODER 2 54 #define ROAR_DL_FN_DRIVER 3 55 #define ROAR_DL_FN_SOURCE 4 56 #define ROAR_DL_FN_FILTER 5 57 #define ROAR_DL_FN_FF 6 /* file format */ 58 #define ROAR_DL_FN_AUTH 7 59 #define ROAR_DL_FN_BRIDGE 8 60 #define ROAR_DL_FN_ROARDSCHED 9 61 #define ROAR_DL_FN_APPSCHED 10 62 #define ROAR_DL_FN_PROTO 11 63 #define ROAR_DL_FN_NOTIFY 12 50 #define ROAR_DL_HANDLE_LIBROAR ((struct roar_dl_lhandle*)(void*)2) 51 #define ROAR_DL_HANDLE_APPLICATION ((struct roar_dl_lhandle*)(void*)3) 52 53 #define ROAR_DL_FN_DSTR 0 /* VIO and DSTR drivers */ 54 #define ROAR_DL_FN_CDRIVER 1 /* Client drivers, libroareio */ 55 #define ROAR_DL_FN_TRANSCODER 2 /* Transcoder, libroardsp */ 56 #define ROAR_DL_FN_DRIVER 3 /* Driver, roard? */ 57 #define ROAR_DL_FN_SOURCE 4 /* Sources, roard? */ 58 #define ROAR_DL_FN_FILTER 5 /* Filter, libroardsp */ 59 #define ROAR_DL_FN_FF 6 /* file format??? */ 60 #define ROAR_DL_FN_AUTH 7 /* Auth */ 61 #define ROAR_DL_FN_BRIDGE 8 /* Bridges, roard? */ 62 #define ROAR_DL_FN_ROARDSCHED 9 /* Like appsched, but roard specific, old */ 63 #define ROAR_DL_FN_APPSCHED 10 /* AppSched, old interface */ 64 #define ROAR_DL_FN_PROTO 11 /* Protocols, roard? */ 65 #define ROAR_DL_FN_NOTIFY 12 /* ??? */ 64 66 #define ROAR_DL_FN_INIT 13 /* global plugin instance init. should be avoided */ 67 #define ROAR_DL_FN_REGFN 14 /* FN Registrations */ 68 #define ROAR_DL_FN_APPLICATION 15 /* Application specific stuff */ 65 69 //#define ROAR_DL_FN_ 9 66 70 #define ROAR_DL_FN_MAX 24 … … 296 300 int roar_dl_appsched_trigger(struct roar_dl_lhandle * lhandle, enum roar_dl_appsched_trigger trigger); 297 301 302 // FN Registration: 303 304 // Actions objects can emit: 305 enum roar_dl_fnreg_action { 306 ROAR_DL_FNREG = 1, // The object is been registered 307 ROAR_DL_FNUNREG = 2 // The object is been unregistered 308 }; 309 310 // Callback for registering/unregistering objects: 311 struct roar_dl_fnreg { 312 int fn; // Filter: The FN of the registering object or -1 for any. 313 int subtype; // Filter: The subtype of the registering object or -1 for any. 314 int version; // Filter: The version of the registering object or -1 for any. 315 int (*callback)( // Callback to call on register/unregister. 316 enum roar_dl_fnreg_action action, // The action happening 317 int fn, // The FN of the object 318 int subtype, // The subtype of the object 319 const void * object, // Pointer to the object 320 size_t objectlen, // Length of the object 321 int version, // Version of the object 322 int options, // Object Options. 323 void * userdata, // User data for the callback. 324 struct roar_dl_lhandle * lhandle // The registering handle. 325 // This is valid until the object is unregistered. 326 // Only roar_dl_context_restore() and roar_dl_context_store() 327 // may be used on this object. Result of all other functions 328 // is undefined. 329 ); 330 void * userdata; // The user data pointer passed to the callback. 331 }; 332 333 // Parameters for FNREG registration: 334 #define ROAR_DL_FNREG_SUBTYPE 0 335 #define ROAR_DL_FNREG_VERSION 0 336 #define ROAR_DL_FNREG_SIZE sizeof(struct roar_dl_fnreg) 337 338 339 // Reg FN: 340 341 // Options: 342 #define ROAR_DL_FNREG_OPT_NONE 0 /* no options */ 343 344 // Register an FN. 345 int roar_dl_register_fn(struct roar_dl_lhandle * lhandle, int fn, int subtype, const void * object, size_t objectlen, int version, int options); 346 347 // Unregister FN for the given plugin. 348 // This should not be called directly and is called internally when needed. 349 int roar_dl_unregister_fn(struct roar_dl_lhandle * lhandle); 350 298 351 #endif 299 352 -
libroar/roardl.c
r5503 r5511 68 68 }; 69 69 70 // TODO: this should be removed on next SONAME change. 71 static struct roar_dl_lhandle * __currently_inited = NULL; 70 72 71 73 struct roar_dl_librarypara * roar_dl_para_new(const char * args, void * binargv, … … 193 195 ROAR_DBG("_roardl2ldl(lhandle=%p) = ?", lhandle); 194 196 195 if ( lhandle == ROAR_DL_HANDLE_DEFAULT ) { 196 ROAR_DBG("_roardl2ldl(lhandle=%p) = %p", lhandle, (void*)RTLD_DEFAULT); 197 return RTLD_DEFAULT; 198 } 199 200 if ( lhandle == ROAR_DL_HANDLE_NEXT ) { 201 ROAR_DBG("_roardl2ldl(lhandle=%p) = %p", lhandle, (void*)RTLD_NEXT); 202 return RTLD_NEXT; 197 if ( (void*)lhandle < (void*)128 ) { 198 switch ((int)(void*)lhandle) { 199 case (int)(void*)ROAR_DL_HANDLE_DEFAULT: 200 case (int)(void*)ROAR_DL_HANDLE_LIBROAR: 201 case (int)(void*)ROAR_DL_HANDLE_APPLICATION: 202 ROAR_DBG("_roardl2ldl(lhandle=%p) = %p", lhandle, (void*)RTLD_DEFAULT); 203 return RTLD_DEFAULT; 204 break; 205 case (int)(void*)ROAR_DL_HANDLE_NEXT: 206 ROAR_DBG("_roardl2ldl(lhandle=%p) = %p", lhandle, (void*)RTLD_NEXT); 207 return RTLD_NEXT; 208 break; 209 } 203 210 } 204 211 … … 464 471 } 465 472 473 roar_dl_unregister_fn(lhandle); 474 466 475 if ( lhandle->lib != NULL && lhandle->lib->unload != NULL ) { 467 476 roar_dl_context_restore(lhandle); … … 528 537 const char * prefix, 529 538 struct roar_dl_librarypara * para) { 539 struct roar_dl_lhandle * old_init; 530 540 #define _SUFFIX "_roaraudio_library_init" 531 541 char name[80] = _SUFFIX; … … 626 636 } 627 637 638 old_init = __currently_inited; 639 __currently_inited = lhandle; 628 640 for (i = 0; i < ROAR_DL_FN_MAX; i++) { 629 641 if ( lib->func[i] != NULL ) 630 642 lib->func[i](para, lib); 631 643 } 644 __currently_inited = old_init; 645 632 646 633 647 if ( lib->global_data_pointer != NULL ) { … … 838 852 } 839 853 854 855 #define __MAX_FNREGS 24 856 static struct __fnregs { 857 struct roar_dl_lhandle * lhandle; 858 int subtype; 859 const void * object; 860 size_t objectlen; 861 int version; 862 int options; 863 } __fnrefs[ROAR_DL_FN_MAX][__MAX_FNREGS]; 864 865 static int __fnreg_check_trigger(const struct __fnregs * handle) { 866 if ( handle->subtype != ROAR_DL_FNREG_SUBTYPE ) 867 return -1; 868 if ( handle->version != ROAR_DL_FNREG_VERSION ) 869 return -1; 870 if ( handle->objectlen != ROAR_DL_FNREG_SIZE ) 871 return -1; 872 873 return 0; 874 } 875 876 static void __fnreg_trigger_if_match(const struct roar_dl_fnreg * callback, 877 const struct __fnregs * reg, 878 int fn, 879 enum roar_dl_fnreg_action action) { 880 if ( callback->fn != -1 && callback->fn != fn ) 881 return; 882 if ( callback->subtype != -1 && callback->subtype != reg->subtype ) 883 return; 884 if ( callback->version != -1 && callback->version != reg->version ) 885 return; 886 887 if ( callback->callback == NULL ) 888 return; 889 890 callback->callback(action, fn, reg->subtype, reg->object, reg->objectlen, reg->version, reg->options, callback->userdata, reg->lhandle); 891 } 892 893 static void __fnreg_trigger_by_reg(const struct __fnregs * reg, enum roar_dl_fnreg_action action, int fn) { 894 size_t j; 895 896 for (j = 0; j < __MAX_FNREGS; j++) { 897 if ( __fnrefs[ROAR_DL_FN_REGFN][j].lhandle != NULL ) { 898 if ( __fnreg_check_trigger(&(__fnrefs[ROAR_DL_FN_REGFN][j])) == -1 ) 899 continue; 900 __fnreg_trigger_if_match(__fnrefs[ROAR_DL_FN_REGFN][j].object, reg, fn, action); 901 } 902 } 903 } 904 905 static void __fnreg_trigger_by_handler(const struct __fnregs * handle, enum roar_dl_fnreg_action action) { 906 size_t i, j; 907 908 if ( __fnreg_check_trigger(handle) == -1 ) 909 return; 910 911 for (i = 0; i < ROAR_DL_FN_MAX; i++) { 912 for (j = 0; j < __MAX_FNREGS; j++) { 913 if ( __fnrefs[i][j].lhandle != NULL ) { 914 __fnreg_trigger_if_match(handle->object, &(__fnrefs[i][j]), i, action); 915 } 916 } 917 } 918 } 919 920 int roar_dl_register_fn(struct roar_dl_lhandle * lhandle, int fn, int subtype, const void * object, size_t objectlen, int version, int options) { 921 struct __fnregs * c = NULL; 922 size_t i; 923 924 if ( lhandle == NULL ) 925 lhandle = __currently_inited; 926 927 if ( lhandle == NULL ) { 928 roar_err_set(ROAR_ERROR_FAULT); 929 return -1; 930 } 931 932 if ( fn < 0 || fn >= ROAR_DL_FN_MAX ) { 933 roar_err_set(ROAR_ERROR_RANGE); 934 return -1; 935 } 936 937 if ( object == NULL || objectlen == 0 ) { 938 roar_err_set(ROAR_ERROR_INVAL); 939 return -1; 940 } 941 942 for (i = 0; i < __MAX_FNREGS; i++) { 943 if ( __fnrefs[fn][i].lhandle != NULL ) 944 continue; 945 c = &(__fnrefs[fn][i]); 946 break; 947 } 948 949 if ( c == NULL ) { 950 roar_err_set(ROAR_ERROR_NOSPC); 951 return -1; 952 } 953 954 c->lhandle = lhandle; 955 c->subtype = subtype; 956 c->object = object; 957 c->objectlen = objectlen; 958 c->version = version; 959 960 if ( fn == ROAR_DL_FN_REGFN ) { 961 __fnreg_trigger_by_handler(c, ROAR_DL_FNREG); 962 } else { 963 __fnreg_trigger_by_reg(c, ROAR_DL_FNREG, fn); 964 } 965 966 return 0; 967 } 968 969 int roar_dl_unregister_fn(struct roar_dl_lhandle * lhandle) { 970 size_t i, j; 971 972 //} __fnrefs[ROAR_DL_FN_MAX][__MAX_FNREGS]; 973 974 if ( lhandle == NULL ) { 975 roar_err_set(ROAR_ERROR_FAULT); 976 return -1; 977 } 978 979 for (i = 0; i < ROAR_DL_FN_MAX; i++) { 980 for (j = 0; j < __MAX_FNREGS; j++) { 981 if ( __fnrefs[i][j].lhandle == lhandle ) { 982 if ( i == ROAR_DL_FN_REGFN ) { 983 __fnreg_trigger_by_handler(&(__fnrefs[i][j]), ROAR_DL_FNUNREG); 984 } else { 985 __fnreg_trigger_by_reg(&(__fnrefs[i][j]), ROAR_DL_FNUNREG, i); 986 } 987 memset(&(__fnrefs[i][j]), 0, sizeof(__fnrefs[i][j])); 988 __fnrefs[i][j].lhandle = NULL; 989 } 990 } 991 } 992 993 return 0; 994 } 995 840 996 //ll
Note: See TracChangeset
for help on using the changeset viewer.