diff options
author | Alexey Yakovenko <waker@users.sourceforge.net> | 2013-11-04 20:20:19 +0100 |
---|---|---|
committer | Alexey Yakovenko <waker@users.sourceforge.net> | 2013-11-04 20:20:19 +0100 |
commit | a98476f7163c1f6e0aea295a2c2c5374d4b18908 (patch) | |
tree | 6028142d925f895f16622944b09cd5963aad5e91 | |
parent | e62acd10103783e1d4c51d4b041530400137521a (diff) |
file adding API WIP
-rw-r--r-- | deadbeef.h | 93 | ||||
-rw-r--r-- | playlist.c | 48 | ||||
-rw-r--r-- | playlist.h | 22 | ||||
-rw-r--r-- | plugins.c | 7 |
4 files changed, 135 insertions, 35 deletions
@@ -58,10 +58,13 @@ extern "C" { // // please DON'T release plugins without version requirement // -// to ensure compatibility, use the following macro: +// to ensure compatibility, use the following before including deadbeef.h: // #define DDB_API_LEVEL x // where x is the minor API version number. // that way, you'll get errors or warnings when using incompatible stuff. +// +// if you also want to get the deprecation warnings, use the following: +// #define DDB_WARN_DEPRECATED 1 // api version history: // 9.9 -- devel @@ -90,12 +93,42 @@ extern "C" { #define DDB_API_LEVEL DB_API_VERSION_MINOR #endif -#if (DDB_API_LEVEL >= 5) +#if (DDB_WARN_DEPRECATED && DDB_API_LEVEL >= 5) #define DEPRECATED_15 __attribute__ ((deprecated("since deadbeef API 1.5"))) #else #define DEPRECATED_15 #endif +#if (DDB_WARN_DEPRECATED && DDB_API_LEVEL >= 4) +#define DEPRECATED_14 __attribute__ ((deprecated("since deadbeef API 1.4"))) +#else +#define DEPRECATED_14 +#endif + +#if (DDB_WARN_DEPRECATED && DDB_API_LEVEL >= 3) +#define DEPRECATED_13 __attribute__ ((deprecated("since deadbeef API 1.3"))) +#else +#define DEPRECATED_13 +#endif + +#if (DDB_WARN_DEPRECATED && DDB_API_LEVEL >= 2) +#define DEPRECATED_12 __attribute__ ((deprecated("since deadbeef API 1.2"))) +#else +#define DEPRECATED_12 +#endif + +#if (DDB_WARN_DEPRECATED && DDB_API_LEVEL >= 1) +#define DEPRECATED_11 __attribute__ ((deprecated("since deadbeef API 1.1"))) +#else +#define DEPRECATED_11 +#endif + +#if (DDB_WARN_DEPRECATED && DDB_API_LEVEL >= 0) +#define DEPRECATED __attribute__ ((deprecated)) +#else +#define DEPRECATED +#endif + #define DDB_PLUGIN_SET_API_VERSION\ .plugin.api_vmajor = DB_API_VERSION_MAJOR,\ .plugin.api_vminor = DB_API_VERSION_MINOR, @@ -605,40 +638,39 @@ typedef struct { // they are marked with DEPRECATED comment // DEPRECATED: please use plt_get_item_idx - int (*pl_get_idx_of) (DB_playItem_t *it); - int (*pl_get_idx_of_iter) (DB_playItem_t *it, int iter); + int (*pl_get_idx_of) (DB_playItem_t *it) DEPRECATED; + int (*pl_get_idx_of_iter) (DB_playItem_t *it, int iter) DEPRECATED; // DEPRECATED: please use plt_get_item_for_idx - DB_playItem_t * (*pl_get_for_idx) (int idx); - DB_playItem_t * (*pl_get_for_idx_and_iter) (int idx, int iter); + DB_playItem_t * (*pl_get_for_idx) (int idx) DEPRECATED; + DB_playItem_t * (*pl_get_for_idx_and_iter) (int idx, int iter) DEPRECATED; // DEPRECATED: please use plt_get_totaltime - float (*pl_get_totaltime) (void); + float (*pl_get_totaltime) (void) DEPRECATED; // DEPRECATED: please use plt_get_item_count - int (*pl_getcount) (int iter); + int (*pl_getcount) (int iter) DEPRECATED; // DEPRECATED: please use plt_delete_selected - int (*pl_delete_selected) (void); + int (*pl_delete_selected) (void) DEPRECATED; // DEPRECATED: please use plt_set_cursor - void (*pl_set_cursor) (int iter, int cursor); + void (*pl_set_cursor) (int iter, int cursor) DEPRECATED; // DEPRECATED: please use plt_get_cursor - int (*pl_get_cursor) (int iter); + int (*pl_get_cursor) (int iter) DEPRECATED; // DEPRECATED: please use plt_crop_selected - void (*pl_crop_selected) (void); + void (*pl_crop_selected) (void) DEPRECATED; // DEPRECATED: please use plt_getselcount - int (*pl_getselcount) (void); + int (*pl_getselcount) (void) DEPRECATED; // DEPRECATED: please use plt_get_first - DB_playItem_t *(*pl_get_first) (int iter); + DB_playItem_t *(*pl_get_first) (int iter) DEPRECATED; // DEPRECATED: please use plt_get_last - DB_playItem_t *(*pl_get_last) (int iter); - + DB_playItem_t *(*pl_get_last) (int iter) DEPRECATED; void (*pl_set_selected) (DB_playItem_t *it, int sel); int (*pl_is_selected) (DB_playItem_t *it); @@ -895,19 +927,30 @@ typedef struct { // register file added callback // the callback will be called for each file // the visibility is taken from plt_add_* arguments - + // the callback must return 0 to continue, or -1 to abort the operation. void (*listen_file_added) (int (*callback)(ddb_fileadd_data_t *data, void *user_data), void *user_data); void (*unlisten_file_added) (int (*callback)(ddb_fileadd_data_t *data, void *user_data), void *user_data); - // visibility is a number, which tells listeners about the caller - // 0 is reserved for callers which want the GUI to intercept the calls, - // and show visual updates. + // visibility is a number, which tells listeners about the caller. + // the value DDB_FILEADD_VISIBILITY_GUI (or 0) is reserved for callers which + // want the GUI to intercept the calls and show visual updates. + // // this is the default value passed from plt_load, plt_add_dir, plt_add_file. - DB_playItem_t * (*plt_load2) (int visibility, ddb_playlist_t *plt, ddb_playItem_t *after, const char *fname, int *pabort); - int (*plt_add_file2) (int visibility, ddb_playlist_t *plt, const char *fname); - int (*plt_add_dir2) (int visibility, ddb_playlist_t *plt, const char *dirname); - ddb_playItem_t * (*plt_insert_file2) (int visibility, ddb_playlist_t *playlist, ddb_playItem_t *after, const char *fname, int *pabort); - ddb_playItem_t *(*plt_insert_dir2) (int visibility, ddb_playlist_t *plt, ddb_playItem_t *after, const char *dirname, int *pabort); + // + // the values up to 10 are registered for deadbeef itself, so please avoid + // using them in your plugins, unless you really know what you're doing. + // any values above 10 are free for any use. + // + // the "callback", if not NULL, will be called with the passed "user_data", + // for each track. + // + // the registered listeners will be called too, the ddb_fileadd_data_t + // has the visibility + DB_playItem_t * (*plt_load2) (int visibility, ddb_playlist_t *plt, ddb_playItem_t *after, const char *fname, int *pabort, int (*callback)(DB_playItem_t *it, void *user_data), void *user_data); + int (*plt_add_file2) (int visibility, ddb_playlist_t *plt, const char *fname, int (*callback)(DB_playItem_t *it, void *user_data), void *user_data); + int (*plt_add_dir2) (int visibility, ddb_playlist_t *plt, const char *dirname, int (*callback)(DB_playItem_t *it, void *user_data), void *user_data); + ddb_playItem_t * (*plt_insert_file2) (int visibility, ddb_playlist_t *playlist, ddb_playItem_t *after, const char *fname, int *pabort, int (*callback)(DB_playItem_t *it, void *user_data), void *user_data); + ddb_playItem_t *(*plt_insert_dir2) (int visibility, ddb_playlist_t *plt, ddb_playItem_t *after, const char *dirname, int *pabort, int (*callback)(DB_playItem_t *it, void *user_data), void *user_data); #endif } DB_functions_t; @@ -3939,30 +3939,58 @@ plt_save_config (playlist_t *plt) { return plt_save_n (i); } +typedef struct ddb_fileadd_listener_s { + int (*callback)(ddb_fileadd_data_t *data, void *user_data); + void *user_data; + struct ddb_fileadd_listener_s *next; +} ddb_fileadd_listener_t; + +static ddb_fileadd_listener_t *file_add_listeners; + void listen_file_added (int (*callback)(ddb_fileadd_data_t *data, void *user_data), void *user_data) { + ddb_fileadd_listener_t *l = malloc (sizeof (ddb_fileadd_listener_t)); + memset (l, 0, sizeof (ddb_fileadd_listener_t)); + l->callback = callback; + l->user_data = user_data; + l->next = file_add_listeners; + file_add_listeners = l; + } void unlisten_file_added (int (*callback)(ddb_fileadd_data_t *data, void *user_data), void *user_data) { + ddb_fileadd_listener_t *prev = NULL; + for (ddb_fileadd_listener_t *l = file_add_listeners; l; prev = l, l = l->next) { + if (l->callback == callback && l->user_data == user_data) { + if (prev) { + prev->next = l->next; + } + else { + file_add_listeners = l->next; + } + free (l); + break; + } + } } DB_playItem_t * -plt_load2 (int visibility, playlist_t *plt, playItem_t *after, const char *fname, int *pabort) { - plt_load_int (visibility, plt, after, fname, pabort, NULL, NULL); +plt_load2 (int visibility, playlist_t *plt, playItem_t *after, const char *fname, int *pabort, int (*callback)(playItem_t *it, void *user_data), void *user_data) { + plt_load_int (visibility, plt, after, fname, pabort, callback, user_data); } int -plt_add_file2 (int visibility, playlist_t *plt, const char *fname) { - return plt_add_file_int (visibility, plt, fname, NULL, NULL); +plt_add_file2 (int visibility, playlist_t *plt, const char *fname, int (*callback)(playItem_t *it, void *user_data), void *user_data) { + return plt_add_file_int (visibility, plt, fname, callback, user_data); } int -plt_add_dir2 (int visibility, playlist_t *plt, const char *dirname) { +plt_add_dir2 (int visibility, playlist_t *plt, const char *dirname, int (*callback)(playItem_t *it, void *user_data), void *user_data) { follow_symlinks = conf_get_int ("add_folders_follow_symlinks", 0); ignore_archives = conf_get_int ("ignore_archives", 1); int abort = 0; - playItem_t *it = plt_insert_dir_int (visibility, plt, NULL, plt->tail[PL_MAIN], dirname, &abort, NULL, NULL); + playItem_t *it = plt_insert_dir_int (visibility, plt, NULL, plt->tail[PL_MAIN], dirname, &abort, callback, user_data); if (it) { // pl_insert_file doesn't hold reference, don't unref here return 0; @@ -3971,11 +3999,11 @@ plt_add_dir2 (int visibility, playlist_t *plt, const char *dirname) { } playItem_t * -plt_insert_file2 (int visibility, playlist_t *playlist, playItem_t *after, const char *fname, int *pabort) { - return plt_insert_file_int (visibility, playlist, after, fname, pabort, NULL, NULL); +plt_insert_file2 (int visibility, playlist_t *playlist, playItem_t *after, const char *fname, int *pabort, int (*callback)(playItem_t *it, void *user_data), void *user_data) { + return plt_insert_file_int (visibility, playlist, after, fname, pabort, callback, user_data); } playItem_t * -plt_insert_dir2 (int visibility, playlist_t *plt, playItem_t *after, const char *dirname, int *pabort) { - return plt_insert_dir_int (visibility, plt, NULL, after, dirname, pabort, NULL, NULL); +plt_insert_dir2 (int visibility, playlist_t *plt, playItem_t *after, const char *dirname, int *pabort, int (*callback)(playItem_t *it, void *user_data), void *user_data) { + return plt_insert_dir_int (visibility, plt, NULL, after, dirname, pabort, callback, user_data); } @@ -30,6 +30,7 @@ #include <stdint.h> #include <time.h> +#include "deadbeef.h" #define PL_MAX_ITERATORS 2 @@ -485,4 +486,25 @@ plt_get_idx (playlist_t *plt); int plt_save_config (playlist_t *plt); +void +listen_file_added (int (*callback)(ddb_fileadd_data_t *data, void *user_data), void *user_data); + +void +unlisten_file_added (int (*callback)(ddb_fileadd_data_t *data, void *user_data), void *user_data); + +DB_playItem_t * +plt_load2 (int visibility, playlist_t *plt, playItem_t *after, const char *fname, int *pabort, int (*callback)(playItem_t *it, void *user_data), void *user_data); + +int +plt_add_file2 (int visibility, playlist_t *plt, const char *fname, int (*callback)(playItem_t *it, void *user_data), void *user_data); + +int +plt_add_dir2 (int visibility, playlist_t *plt, const char *dirname, int (*callback)(playItem_t *it, void *user_data), void *user_data); + +playItem_t * +plt_insert_file2 (int visibility, playlist_t *playlist, playItem_t *after, const char *fname, int *pabort, int (*callback)(playItem_t *it, void *user_data), void *user_data); + +playItem_t * +plt_insert_dir2 (int visibility, playlist_t *plt, playItem_t *after, const char *dirname, int *pabort, int (*callback)(playItem_t *it, void *user_data), void *user_data); + #endif // __PLAYLIST_H @@ -353,6 +353,13 @@ static DB_functions_t deadbeef_api = { .plt_get_idx = (int (*)(ddb_playlist_t *))plt_get_idx, .plt_save_n = plt_save_n, .plt_save_config = (int (*)(ddb_playlist_t *))plt_save_config, + .listen_file_added = listen_file_added, + .unlisten_file_added = unlisten_file_added, + .plt_load2 = (DB_playItem_t * (*) (int visibility, ddb_playlist_t *plt, ddb_playItem_t *after, const char *fname, int *pabort, int (*callback)(DB_playItem_t *it, void *user_data), void *user_data))plt_load2, + .plt_add_file2 = (int (*) (int visibility, ddb_playlist_t *plt, const char *fname, int (*callback)(DB_playItem_t *it, void *user_data), void *user_data))plt_add_file2, + .plt_add_dir2 = (int (*) (int visibility, ddb_playlist_t *plt, const char *dirname, int (*callback)(DB_playItem_t *it, void *user_data), void *user_data))plt_add_dir2, + .plt_insert_file2 = (ddb_playItem_t * (*) (int visibility, ddb_playlist_t *playlist, ddb_playItem_t *after, const char *fname, int *pabort, int (*callback)(DB_playItem_t *it, void *user_data), void *user_data))plt_insert_file2, + .plt_insert_dir2 = (ddb_playItem_t *(*) (int visibility, ddb_playlist_t *plt, ddb_playItem_t *after, const char *dirname, int *pabort, int (*callback)(DB_playItem_t *it, void *user_data), void *user_data))plt_insert_dir2, }; DB_functions_t *deadbeef = &deadbeef_api; |