source: roaraudio/include/libroar/roardl.h @ 5313:fe152a3ff8a0

Last change on this file since 5313:fe152a3ff8a0 was 5313:fe152a3ff8a0, checked in by phi, 12 years ago

another set of small improvements

File size: 10.2 KB
Line 
1//roardl.h:
2
3/*
4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2010-2011
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
21 *  the Free Software Foundation, 51 Franklin Street, Fifth Floor,
22 *  Boston, MA 02110-1301, USA.
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
41#define ROAR_DL_FLAG_DEFAUTS           -1
42
43#define ROAR_DL_HANDLE_DEFAULT          ((struct roar_dl_lhandle*)(void*)0)
44#define ROAR_DL_HANDLE_NEXT             ((struct roar_dl_lhandle*)(void*)1)
45
46#define ROAR_DL_FN_DSTR                 0
47#define ROAR_DL_FN_CDRIVER              1
48#define ROAR_DL_FN_TRANSCODER           2
49#define ROAR_DL_FN_DRIVER               3
50#define ROAR_DL_FN_SOURCE               4
51#define ROAR_DL_FN_FILTER               5
52#define ROAR_DL_FN_FF                   6 /* file format */
53#define ROAR_DL_FN_AUTH                 7
54#define ROAR_DL_FN_BRIDGE               8
55#define ROAR_DL_FN_ROARDSCHED           9
56#define ROAR_DL_FN_APPSCHED            10
57#define ROAR_DL_FN_PROTO               11
58#define ROAR_DL_FN_NOTIFY              12
59//#define ROAR_DL_FN_               9
60#define ROAR_DL_FN_MAX                 24
61
62#define ROAR_DL_LIBPARA_VERSION         1
63#define ROAR_DL_LIBNAME_VERSION         0
64#define ROAR_DL_LIBINST_VERSION         1
65
66#define ROAR_DL_PLUGIN(lib) struct roar_dl_libraryinst *                                          \
67                             _##lib##_roaraudio_library_init(struct roar_dl_librarypara * para);  \
68                            struct roar_dl_libraryinst *                                          \
69                             _roaraudio_library_init(struct roar_dl_librarypara * para) {         \
70                              return _##lib##_roaraudio_library_init(para);                       \
71                            }                                                                     \
72                            struct roar_dl_libraryinst *                                          \
73                             _##lib##_roaraudio_library_init(struct roar_dl_librarypara * para)   \
74
75#define ROAR_DL_PLUGIN_START(xlib) ROAR_DL_PLUGIN(xlib) {                                         \
76                                     static int _inited = 0;                                      \
77                                     static struct roar_dl_libraryinst lib;                       \
78                                     static struct roar_dl_libraryname libname;                   \
79                                     (void)para;                                                  \
80                                     if ( _inited )                                               \
81                                      return &lib;                                                \
82                                     memset(&lib, 0, sizeof(lib));                                \
83                                     lib.version = ROAR_DL_LIBINST_VERSION;                       \
84                                     lib.len     = sizeof(lib);                                   \
85                                     memset(&libname, 0, sizeof(libname));                        \
86                                     libname.version = ROAR_DL_LIBNAME_VERSION;                   \
87                                     libname.len     = sizeof(libname);                           \
88                                     libname.name = #xlib;                                        \
89                                     lib.libname  = &libname;                                     \
90                                     do
91
92#define ROAR_DL_PLUGIN_END          while(0);                                                     \
93                                    _inited = 1;                                                  \
94                                    return &lib;                                                  \
95                                   }
96
97#define ROAR_DL_PLUGIN_ABORT_LOADING(err) roar_err_set((err)); return NULL
98#define ROAR_DL_PLUGIN_CHECK_VERSIONS(app,abi) if ( roar_dl_para_check_version(para, (app), (abi)) == -1 ) return NULL
99#define ROAR_DL_PLUGIN_REG(fn, funcptr) (lib.func[(fn)] = (funcptr))
100#define ROAR_DL_PLUGIN_REG_UNLOAD(func) (lib.unload = (func))
101#define ROAR_DL_PLUGIN_REG_GLOBAL_DATA(ptr,init) lib.global_data_len = sizeof((init)); \
102                                                 lib.global_data_init = &(init);       \
103                                                 lib.global_data_pointer = (void*)&(ptr)
104
105struct roar_dl_librarypara {
106 int version;               // version of this struct type (must be ROAR_DL_LIBPARA_VERSION)
107 size_t len;                // Length of this struct type (must be sizeof(struct roar_dl_librarypara)
108
109 size_t refc;               // Reference counter.
110
111 size_t argc;               // number of elements in argv
112 struct roar_keyval * argv; // Parameter for the plugin
113 void * args_store;         // Storage area for argv's data.
114                            // If not NULL this and argv will be freed.
115                            // If NULL argv will be left untouched.
116
117 void * binargv;            // A pointer with binary data arguments.
118                            // This can be used to pass any non-string data to
119                            // the plugin. Normally this is NULL or the pointer
120                            // to a struct with members of whatever is needed.
121
122 const char * appname;      // application name in common format:
123                            // Product/Version <VendorID/VendorName> (comments)
124                            // Version and comment are optional and should be avoided.
125                            // When no vendor ID is registered use <VendorName>.
126                            // The VendorName MUST NOT contain a slash and SHOULD
127                            // be as unique as possible.
128                            // Examples: roard <0/RoarAudio>, MyAPP <myapp.org>,
129                            //           AnAPP <Musterman GbR>
130 const char * abiversion;   // The ABI version. For libraries this should be the SONAME.
131                            // For applications this should be the version of the release
132                            // which introduced the current ABI.
133                            // Examples: libroar2, 0.5.1
134};
135
136struct roar_dl_libraryname {
137 int      version;
138 size_t   len;
139 const char * name;        //Format: shortname
140 const char * libversion;  //Format: Product/Version <VendorID/VendorName> (comments)
141 const char * description; //Free form.
142 const char * contact;     //Format: first ["']nick["'] last (comment) <email>/OpenPGPkey/Phone/Room
143 const char * authors;     //Other authors as free form.
144 const char * license;     //Format: LicenseName-Version (options)
145                           //Examples: GPL-3.0, LGPL-2.1, LGPL-3.0 (or later).
146};
147
148struct roar_dl_libraryinst {
149 int      version;
150 size_t   len;
151 int    (*unload)(struct roar_dl_librarypara * para, struct roar_dl_libraryinst * lib);
152 int    (*func[ROAR_DL_FN_MAX])(struct roar_dl_librarypara * para, struct roar_dl_libraryinst * lib);
153 struct roar_dl_libraryname * libname;
154 size_t  global_data_len;
155 void *  global_data_init;
156 void ** global_data_pointer;
157};
158
159struct roar_dl_appsched {
160 int (*init)  (struct roar_dl_librarypara * para, struct roar_dl_libraryinst * lib);
161 int (*free)  (struct roar_dl_librarypara * para, struct roar_dl_libraryinst * lib);
162 int (*update)(struct roar_dl_librarypara * para, struct roar_dl_libraryinst * lib);
163};
164
165// parameter functions:
166struct roar_dl_librarypara * roar_dl_para_new(const char * args, void * binargv,
167                                              const char * appname, const char * abiversion);
168int roar_dl_para_ref                    (struct roar_dl_librarypara * para);
169int roar_dl_para_unref                  (struct roar_dl_librarypara * para);
170int roar_dl_para_check_version          (struct roar_dl_librarypara * para,
171                                         const char * appname, const char * abiversion);
172
173// 'core' dynamic loader functions.
174struct roar_dl_lhandle * roar_dl_open   (const char * filename, int flags,
175                                         int ra_init, struct roar_dl_librarypara * para);
176int                      roar_dl_close  (struct roar_dl_lhandle * lhandle);
177
178void                   * roar_dl_getsym (struct roar_dl_lhandle * lhandle, const char * sym, int type);
179
180int                      roar_dl_ra_init(struct roar_dl_lhandle * lhandle,
181                                         const char * prefix,
182                                         struct roar_dl_librarypara * para);
183
184const char *             roar_dl_errstr (struct roar_dl_lhandle * lhandle);
185
186// getting meta data:
187struct roar_dl_librarypara       * roar_dl_getpara(struct roar_dl_lhandle * lhandle);
188const struct roar_dl_libraryname * roar_dl_getlibname(struct roar_dl_lhandle * lhandle);
189
190// context switching:
191// _restore() is to switch from main to library context. _store() is to store library context
192// and switch back to main context.
193int                      roar_dl_context_restore(struct roar_dl_lhandle * lhandle);
194int                      roar_dl_context_store(struct roar_dl_lhandle * lhandle);
195
196#endif
197
198//ll
Note: See TracBrowser for help on using the repository browser.