nkeynes@1024: /** nkeynes@1024: * $Id$ nkeynes@1024: * nkeynes@1024: * Plugin declarations and support. nkeynes@1024: * nkeynes@1024: * Note plugins mainly exist to make binary packagers' lives easier, nkeynes@1024: * nkeynes@1024: * Copyright (c) 2009 Nathan Keynes. nkeynes@1024: * nkeynes@1024: * This program is free software; you can redistribute it and/or modify nkeynes@1024: * it under the terms of the GNU General Public License as published by nkeynes@1024: * the Free Software Foundation; either version 2 of the License, or nkeynes@1024: * (at your option) any later version. nkeynes@1024: * nkeynes@1024: * This program is distributed in the hope that it will be useful, nkeynes@1024: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@1024: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@1024: * GNU General Public License for more details. nkeynes@1024: */ nkeynes@1024: nkeynes@1024: #ifndef lxdream_plugin_H nkeynes@1024: #define lxdream_plugin_H nkeynes@1024: nkeynes@1024: #include "lxdream.h" nkeynes@1024: nkeynes@1024: #ifdef __cplusplus nkeynes@1024: extern "C" { nkeynes@1024: #endif nkeynes@1024: nkeynes@1024: enum plugin_type { nkeynes@1024: PLUGIN_NONE = 0, nkeynes@1024: PLUGIN_AUDIO_DRIVER = 1, nkeynes@1024: PLUGIN_INPUT_DRIVER = 2, nkeynes@1024: }; nkeynes@1024: nkeynes@1024: #define PLUGIN_MIN_TYPE 1 nkeynes@1024: #define PLUGIN_MAX_TYPE PLUGIN_INPUT_DRIVER nkeynes@1024: nkeynes@1024: struct plugin_struct { nkeynes@1024: enum plugin_type type; nkeynes@1024: const char *name; nkeynes@1024: const char *version; nkeynes@1024: nkeynes@1024: /** nkeynes@1024: * Plugin registration function, called at load time (dynamic modules) or nkeynes@1024: * startup (static modules). This should register with the appropriate nkeynes@1024: * driver list. nkeynes@1024: * @return TRUE on success, FALSE on failure (although exactly how this nkeynes@1024: * can fail is unclear). nkeynes@1024: */ nkeynes@1024: gboolean (*register_plugin)(void); nkeynes@1024: }; nkeynes@1024: nkeynes@1024: #define CONSTRUCTOR __attribute__((constructor)) nkeynes@1024: nkeynes@1024: #ifdef PLUGIN nkeynes@1024: #define DEFINE_PLUGIN(type,name,fn) struct plugin_struct lxdream_plugin_entry = { type, name, VERSION, fn } nkeynes@1024: #define AUDIO_DRIVER(name, driver) static gboolean __lxdream_plugin_init(void) { return audio_register_driver(&(driver)); } \ nkeynes@1024: DEFINE_PLUGIN(PLUGIN_AUDIO_DRIVER, name, __lxdream_plugin_init) nkeynes@1024: nkeynes@1024: #else /* !ENABLE_SHARED */ nkeynes@1024: #define AUDIO_DRIVER(name,driver) static void CONSTRUCTOR __lxdream_static_constructor(void) { audio_register_driver(&(driver)); } nkeynes@1024: #define DEFINE_PLUGIN(type,name,fn) static void CONSTRUCTOR __lxdream_static_constructor(void) { fn(); } nkeynes@1024: nkeynes@1024: #endif /* ENABLE_SHARED */ nkeynes@1024: nkeynes@1027: gboolean plugin_init(); nkeynes@1024: nkeynes@1024: #ifdef __cplusplus nkeynes@1024: } nkeynes@1024: #endif nkeynes@1024: nkeynes@1169: #endif /* !lxdream_plugin_H */