source: roaraudio/include/libroar/roardl.h @ 5347:1d76e45ebfd1

Last change on this file since 5347:1d76e45ebfd1 was 5347:1d76e45ebfd1, checked in by phi, 12 years ago

added some support and handling code for libdeps. currently it can be parsed and if there is libdep info in a file loading is canceled because we can not load additional stuff at the moment

File size: 14.5 KB
RevLine 
[3297]1//roardl.h:
2
3/*
[4708]4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2010-2011
[3297]5 *
6 *  This file is part of libroar a part of RoarAudio,
7 *  a cross-platform sound system for both, home and professional use.
8 *  See README for details.
9 *
10 *  This file is free software; you can redistribute it and/or modify
11 *  it under the terms of the GNU General Public License version 3
12 *  as published by the Free Software Foundation.
13 *
14 *  libroar is distributed in the hope that it will be useful,
15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 *  GNU General Public License for more details.
18 *
19 *  You should have received a copy of the GNU General Public License
20 *  along with this software; see the file COPYING.  If not, write to
[3517]21 *  the Free Software Foundation, 51 Franklin Street, Fifth Floor,
22 *  Boston, MA 02110-1301, USA.
[3297]23 *
24 *  NOTE for everyone want's to change something and send patches:
25 *  read README and HACKING! There a addition information on
26 *  the license of this document you need to read before you send
27 *  any patches.
28 *
29 *  NOTE for uses of non-GPL (LGPL,...) software using libesd, libartsc
30 *  or libpulse*:
31 *  The libs libroaresd, libroararts and libroarpulse link this lib
32 *  and are therefore GPL. Because of this it may be illigal to use
33 *  them with any software that uses libesd, libartsc or libpulse*.
34 */
35
36#ifndef _LIBROARROARDL_H_
37#define _LIBROARROARDL_H_
38
39#include "libroar.h"
40
[5317]41#define ROAR_DL_FLAG_DEFAULTS          -1
42#define ROAR_DL_FLAG_NONE               0x0000
43#define ROAR_DL_FLAG_STATIC             0x0001 /* plugins are linked statically -lfoo */
[5344]44#define ROAR_DL_FLAG_LAZY               0x0002
[3303]45
[3297]46#define ROAR_DL_HANDLE_DEFAULT          ((struct roar_dl_lhandle*)(void*)0)
47#define ROAR_DL_HANDLE_NEXT             ((struct roar_dl_lhandle*)(void*)1)
48
[3299]49#define ROAR_DL_FN_DSTR                 0
50#define ROAR_DL_FN_CDRIVER              1
51#define ROAR_DL_FN_TRANSCODER           2
52#define ROAR_DL_FN_DRIVER               3
53#define ROAR_DL_FN_SOURCE               4
54#define ROAR_DL_FN_FILTER               5
55#define ROAR_DL_FN_FF                   6 /* file format */
56#define ROAR_DL_FN_AUTH                 7
57#define ROAR_DL_FN_BRIDGE               8
58#define ROAR_DL_FN_ROARDSCHED           9
59#define ROAR_DL_FN_APPSCHED            10
[3360]60#define ROAR_DL_FN_PROTO               11
[5313]61#define ROAR_DL_FN_NOTIFY              12
[5317]62#define ROAR_DL_FN_INIT                13 /* global plugin instance init. should be avoided */
[3299]63//#define ROAR_DL_FN_               9
[5275]64#define ROAR_DL_FN_MAX                 24
[3300]65
[5275]66#define ROAR_DL_LIBPARA_VERSION         1
67#define ROAR_DL_LIBNAME_VERSION         0
68#define ROAR_DL_LIBINST_VERSION         1
[5347]69#define ROAR_DL_LIBDEP_VERSION          0
[3300]70
71#define ROAR_DL_PLUGIN(lib) struct roar_dl_libraryinst *                                          \
[3306]72                             _##lib##_roaraudio_library_init(struct roar_dl_librarypara * para);  \
73                            struct roar_dl_libraryinst *                                          \
[3300]74                             _roaraudio_library_init(struct roar_dl_librarypara * para) {         \
75                              return _##lib##_roaraudio_library_init(para);                       \
76                            }                                                                     \
77                            struct roar_dl_libraryinst *                                          \
78                             _##lib##_roaraudio_library_init(struct roar_dl_librarypara * para)   \
[3299]79
[3308]80#define ROAR_DL_PLUGIN_START(xlib) ROAR_DL_PLUGIN(xlib) {                                         \
81                                     static int _inited = 0;                                      \
82                                     static struct roar_dl_libraryinst lib;                       \
[5275]83                                     static struct roar_dl_libraryname libname;                   \
[4681]84                                     (void)para;                                                  \
[3308]85                                     if ( _inited )                                               \
86                                      return &lib;                                                \
87                                     memset(&lib, 0, sizeof(lib));                                \
88                                     lib.version = ROAR_DL_LIBINST_VERSION;                       \
89                                     lib.len     = sizeof(lib);                                   \
[5275]90                                     memset(&libname, 0, sizeof(libname));                        \
91                                     libname.version = ROAR_DL_LIBNAME_VERSION;                   \
92                                     libname.len     = sizeof(libname);                           \
93                                     libname.name = #xlib;                                        \
94                                     lib.libname  = &libname;                                     \
[3308]95                                     do
96
97#define ROAR_DL_PLUGIN_END          while(0);                                                     \
98                                    _inited = 1;                                                  \
99                                    return &lib;                                                  \
100                                   }
101
[5335]102// general stuff:
[5275]103#define ROAR_DL_PLUGIN_ABORT_LOADING(err) roar_err_set((err)); return NULL
104#define ROAR_DL_PLUGIN_CHECK_VERSIONS(app,abi) if ( roar_dl_para_check_version(para, (app), (abi)) == -1 ) return NULL
[5335]105
106// register stuff:
[3363]107#define ROAR_DL_PLUGIN_REG(fn, funcptr) (lib.func[(fn)] = (funcptr))
[3360]108#define ROAR_DL_PLUGIN_REG_UNLOAD(func) (lib.unload = (func))
[5317]109#define ROAR_DL_PLUGIN_REG_APPSCHED(sched) (lib.appsched = (sched))
[5313]110#define ROAR_DL_PLUGIN_REG_GLOBAL_DATA(ptr,init) lib.global_data_len = sizeof((init)); \
111                                                 lib.global_data_init = &(init);       \
112                                                 lib.global_data_pointer = (void*)&(ptr)
[5347]113#define ROAR_DL_PLUGIN_REG_LIBDEP(deps) (((lib.libdep = deps) == NULL) ? \
114                                           (ssize_t)-1 : \
115                                           (ssize_t)(lib.libdep_len = sizeof(deps)/sizeof(struct roar_dl_librarydep)))
[3314]116
[5335]117// meta data stuff:
118#define ROAR_DL_PLUGIN_META_PRODUCT(x)      (libname.libname     = (x))
119#define ROAR_DL_PLUGIN_META_PRODUCT_NV(name,vendor)      ROAR_DL_PLUGIN_META_PRODUCT(name " <" vendor ">")
[5338]120#define ROAR_DL_PLUGIN_META_PRODUCT_NIV_REAL(name,id,vendor)  ROAR_DL_PLUGIN_META_PRODUCT(name " <" #id "/" vendor ">")
121#define ROAR_DL_PLUGIN_META_PRODUCT_NIV(name,id,vendor)  ROAR_DL_PLUGIN_META_PRODUCT_NIV_REAL(name,id,vendor)
[5335]122#define ROAR_DL_PLUGIN_META_VERSION(x)      (libname.libversion  = (x))
123#define ROAR_DL_PLUGIN_META_ABI(x)          (libname.abiversion  = (x))
124#define ROAR_DL_PLUGIN_META_DESC(x)         (libname.description = (x))
125#define ROAR_DL_PLUGIN_META_CONTACT(x)      (libname.contact = (x))
126#define ROAR_DL_PLUGIN_META_CONTACT_FL(first,last)        ROAR_DL_PLUGIN_META_CONTACT(first " " last)
127#define ROAR_DL_PLUGIN_META_CONTACT_FLE(first,last,email) ROAR_DL_PLUGIN_META_CONTACT(first " " last " <" email ">")
128#define ROAR_DL_PLUGIN_META_CONTACT_FLNE(first,last,nick,email) ROAR_DL_PLUGIN_META_CONTACT(first " \"" nick "\" " last " <" email ">")
129#define ROAR_DL_PLUGIN_META_AUTHORS(x)      (libname.authors = (x))
130#define ROAR_DL_PLUGIN_META_LICENSE(x)      (libname.license = (x))
131#define ROAR_DL_PLUGIN_META_LICENSE_TAG(x)  ROAR_DL_PLUGIN_META_LICENSE(ROAR_LICENSE_ ## x)
132
[5322]133enum roar_dl_loadercmd {
[5327]134 ROAR_DL_LOADER_NOOP = 0,
135 ROAR_DL_LOADER_PRELOAD,
136 ROAR_DL_LOADER_LOAD,
137 ROAR_DL_LOADER_POSTLOAD,
138 ROAR_DL_LOADER_PREUNLOAD,
139 ROAR_DL_LOADER_UNLOAD,
140 ROAR_DL_LOADER_POSTUNLOAD
[5322]141};
142
[5335]143struct roar_plugincontainer;
144
[3297]145struct roar_dl_librarypara {
[5275]146 int version;               // version of this struct type (must be ROAR_DL_LIBPARA_VERSION)
147 size_t len;                // Length of this struct type (must be sizeof(struct roar_dl_librarypara)
148
149 size_t refc;               // Reference counter.
150
151 size_t argc;               // number of elements in argv
152 struct roar_keyval * argv; // Parameter for the plugin
153 void * args_store;         // Storage area for argv's data.
154                            // If not NULL this and argv will be freed.
155                            // If NULL argv will be left untouched.
156
157 void * binargv;            // A pointer with binary data arguments.
158                            // This can be used to pass any non-string data to
159                            // the plugin. Normally this is NULL or the pointer
160                            // to a struct with members of whatever is needed.
161
162 const char * appname;      // application name in common format:
163                            // Product/Version <VendorID/VendorName> (comments)
164                            // Version and comment are optional and should be avoided.
165                            // When no vendor ID is registered use <VendorName>.
166                            // The VendorName MUST NOT contain a slash and SHOULD
167                            // be as unique as possible.
168                            // Examples: roard <0/RoarAudio>, MyAPP <myapp.org>,
169                            //           AnAPP <Musterman GbR>
170 const char * abiversion;   // The ABI version. For libraries this should be the SONAME.
171                            // For applications this should be the version of the release
172                            // which introduced the current ABI.
173                            // Examples: libroar2, 0.5.1
[5317]174 struct roar_notify_core * notifycore;
[5335]175 struct roar_plugincontainer * container;
176 int (*loader)(struct roar_dl_librarypara * lhandle, void * loader_userdata, enum roar_dl_loadercmd cmd, void * argp);
177 void * loader_userdata;
[5275]178};
179
180struct roar_dl_libraryname {
181 int      version;
182 size_t   len;
183 const char * name;        //Format: shortname
[5317]184 const char * libname;     //This is the same as appname in struct roar_dl_librarypara.
185                           //Format: Product <VendorID/VendorName> (comments)
186 const char * libversion;  //This is the pure version number of the library.
187 const char * abiversion;  //This is the same as abiversion in struct roar_dl_librarypara.
188                           //Format: Version
[5275]189 const char * description; //Free form.
190 const char * contact;     //Format: first ["']nick["'] last (comment) <email>/OpenPGPkey/Phone/Room
191 const char * authors;     //Other authors as free form.
192 const char * license;     //Format: LicenseName-Version (options)
193                           //Examples: GPL-3.0, LGPL-2.1, LGPL-3.0 (or later).
[3297]194};
195
[5317]196struct roar_dl_librarydep {
197 int      version;
198 size_t   len;
[5335]199 uint32_t flags;
[5317]200 const char * name;
201 const char * libname;
202 const char * abiversion;
203};
204
[5347]205#define ROAR_DL_DEP(__flags,__name,__libname,__abiversion) \
206                                                   {.version    = ROAR_DL_LIBDEP_VERSION,            \
207                                                    .len        = sizeof(struct roar_dl_librarydep), \
208                                                    .flags      = __flags,                           \
209                                                    .name       = __name,                            \
210                                                    .libname    = __libname,                         \
211                                                    .abiversion = __abiversion}
212
[3297]213struct roar_dl_libraryinst {
[3299]214 int      version;
215 size_t   len;
[3301]216 int    (*unload)(struct roar_dl_librarypara * para, struct roar_dl_libraryinst * lib);
[3299]217 int    (*func[ROAR_DL_FN_MAX])(struct roar_dl_librarypara * para, struct roar_dl_libraryinst * lib);
[5275]218 struct roar_dl_libraryname * libname;
[5312]219 size_t  global_data_len;
220 void *  global_data_init;
221 void ** global_data_pointer;
[5317]222 struct roar_dl_librarydep * libdep;
223 size_t libdep_len;
224 struct roar_dl_appsched * appsched;
[3297]225};
226
[5313]227struct roar_dl_appsched {
[5317]228 int (*init)  (struct roar_dl_librarypara * para);
229 int (*free)  (struct roar_dl_librarypara * para);
230 int (*update)(struct roar_dl_librarypara * para);
[5335]231 int (*tick)  (struct roar_dl_librarypara * para);
232 int (*wait)  (struct roar_dl_librarypara * para);
[5317]233};
234
235enum roar_dl_appsched_trigger {
236 ROAR_DL_APPSCHED_INIT = 1,
237#define ROAR_DL_APPSCHED_INIT ROAR_DL_APPSCHED_INIT
238 ROAR_DL_APPSCHED_FREE,
239#define ROAR_DL_APPSCHED_FREE ROAR_DL_APPSCHED_FREE
[5335]240 ROAR_DL_APPSCHED_UPDATE,
[5317]241#define ROAR_DL_APPSCHED_UPDATE ROAR_DL_APPSCHED_UPDATE
[5335]242 ROAR_DL_APPSCHED_TICK,
243#define ROAR_DL_APPSCHED_TICK ROAR_DL_APPSCHED_TICK
244 ROAR_DL_APPSCHED_WAIT
245#define ROAR_DL_APPSCHED_WAIT ROAR_DL_APPSCHED_WAIT
[5313]246};
247
[5312]248// parameter functions:
[5275]249struct roar_dl_librarypara * roar_dl_para_new(const char * args, void * binargv,
250                                              const char * appname, const char * abiversion);
251int roar_dl_para_ref                    (struct roar_dl_librarypara * para);
252int roar_dl_para_unref                  (struct roar_dl_librarypara * para);
253int roar_dl_para_check_version          (struct roar_dl_librarypara * para,
254                                         const char * appname, const char * abiversion);
255
[5312]256// 'core' dynamic loader functions.
[5275]257struct roar_dl_lhandle * roar_dl_open   (const char * filename, int flags,
258                                         int ra_init, struct roar_dl_librarypara * para);
[5321]259int                      roar_dl_ref    (struct roar_dl_lhandle * lhandle);
260int                      roar_dl_unref  (struct roar_dl_lhandle * lhandle);
261#define roar_dl_close(x) roar_dl_unref((x))
[3301]262
[5275]263void                   * roar_dl_getsym (struct roar_dl_lhandle * lhandle, const char * sym, int type);
[3297]264
[5275]265int                      roar_dl_ra_init(struct roar_dl_lhandle * lhandle,
266                                         const char * prefix,
267                                         struct roar_dl_librarypara * para);
[3297]268
[5275]269const char *             roar_dl_errstr (struct roar_dl_lhandle * lhandle);
[3297]270
[5312]271// getting meta data:
[5275]272struct roar_dl_librarypara       * roar_dl_getpara(struct roar_dl_lhandle * lhandle);
273const struct roar_dl_libraryname * roar_dl_getlibname(struct roar_dl_lhandle * lhandle);
[3364]274
[5312]275// context switching:
276// _restore() is to switch from main to library context. _store() is to store library context
277// and switch back to main context.
278int                      roar_dl_context_restore(struct roar_dl_lhandle * lhandle);
279int                      roar_dl_context_store(struct roar_dl_lhandle * lhandle);
280
[5317]281// appsched:
282int                      roar_dl_appsched_trigger(struct roar_dl_lhandle * lhandle, enum roar_dl_appsched_trigger trigger);
283
[3297]284#endif
285
286//ll
Note: See TracBrowser for help on using the repository browser.