summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--deadbeef.h93
-rw-r--r--playlist.c48
-rw-r--r--playlist.h22
-rw-r--r--plugins.c7
4 files changed, 135 insertions, 35 deletions
diff --git a/deadbeef.h b/deadbeef.h
index 4c31f809..30debb15 100644
--- a/deadbeef.h
+++ b/deadbeef.h
@@ -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;
diff --git a/playlist.c b/playlist.c
index 0f8c1899..8cbe26f5 100644
--- a/playlist.c
+++ b/playlist.c
@@ -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);
}
diff --git a/playlist.h b/playlist.h
index aa76c49a..75374848 100644
--- a/playlist.h
+++ b/playlist.h
@@ -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
diff --git a/plugins.c b/plugins.c
index b906b7c6..6ea534f6 100644
--- a/plugins.c
+++ b/plugins.c
@@ -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;