aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/conf.c18
-rw-r--r--src/conf.h5
-rw-r--r--src/decoder/ffmpeg_decoder_plugin.c13
-rw-r--r--src/inotify_update.c41
-rw-r--r--src/inotify_update.h4
-rw-r--r--src/main.c3
6 files changed, 70 insertions, 14 deletions
diff --git a/src/conf.c b/src/conf.c
index cf78bb29c..ab7be10a7 100644
--- a/src/conf.c
+++ b/src/conf.c
@@ -94,6 +94,7 @@ static struct config_entry config_entries[] = {
{ .name = CONF_GAPLESS_MP3_PLAYBACK, false, false },
{ .name = CONF_PLAYLIST_PLUGIN, true, true },
{ .name = CONF_AUTO_UPDATE, false, false },
+ { .name = CONF_AUTO_UPDATE_DEPTH, false, false },
{ .name = "filter", true, true },
};
@@ -504,6 +505,23 @@ config_get_path(const char *name)
}
unsigned
+config_get_unsigned(const char *name, unsigned default_value)
+{
+ const struct config_param *param = config_get_param(name);
+ long value;
+ char *endptr;
+
+ if (param == NULL)
+ return default_value;
+
+ value = strtol(param->value, &endptr, 0);
+ if (*endptr != 0 || value < 0)
+ g_error("Not a valid non-negative number in line %i", param->line);
+
+ return (unsigned)value;
+}
+
+unsigned
config_get_positive(const char *name, unsigned default_value)
{
const struct config_param *param = config_get_param(name);
diff --git a/src/conf.h b/src/conf.h
index 7ffa6e44a..d79a673cc 100644
--- a/src/conf.h
+++ b/src/conf.h
@@ -70,6 +70,7 @@
#define CONF_GAPLESS_MP3_PLAYBACK "gapless_mp3_playback"
#define CONF_PLAYLIST_PLUGIN "playlist_plugin"
#define CONF_AUTO_UPDATE "auto_update"
+#define CONF_AUTO_UPDATE_DEPTH "auto_update_depth"
#define DEFAULT_PLAYLIST_MAX_LENGTH (1024*16)
#define DEFAULT_PLAYLIST_SAVE_ABSOLUTE_PATHS false
@@ -164,6 +165,10 @@ config_get_path(const char *name);
G_GNUC_PURE
unsigned
+config_get_unsigned(const char *name, unsigned default_value);
+
+G_GNUC_PURE
+unsigned
config_get_positive(const char *name, unsigned default_value);
G_GNUC_PURE
diff --git a/src/decoder/ffmpeg_decoder_plugin.c b/src/decoder/ffmpeg_decoder_plugin.c
index d4d6224d2..4f956f555 100644
--- a/src/decoder/ffmpeg_decoder_plugin.c
+++ b/src/decoder/ffmpeg_decoder_plugin.c
@@ -67,11 +67,16 @@ static void
mpd_ffmpeg_log_callback(G_GNUC_UNUSED void *ptr, int level,
const char *fmt, va_list vl)
{
- const AVClass *cls = *(const AVClass *const*)ptr;
- char *domain = g_strconcat(G_LOG_DOMAIN, "/", cls->item_name(ptr), NULL);
+ const AVClass * cls = NULL;
- g_logv(domain, level_ffmpeg_to_glib(level), fmt, vl);
- g_free(domain);
+ if (ptr != NULL)
+ cls = *(const AVClass *const*)ptr;
+
+ if (cls != NULL) {
+ char *domain = g_strconcat(G_LOG_DOMAIN, "/", cls->item_name(ptr), NULL);
+ g_logv(domain, level_ffmpeg_to_glib(level), fmt, vl);
+ g_free(domain);
+ }
}
#endif /* !OLD_FFMPEG_INCLUDES */
diff --git a/src/inotify_update.c b/src/inotify_update.c
index 00600dfb1..218440110 100644
--- a/src/inotify_update.c
+++ b/src/inotify_update.c
@@ -56,6 +56,7 @@ struct watch_directory {
static struct mpd_inotify_source *inotify_source;
+static unsigned inotify_max_depth;
static struct watch_directory inotify_root;
static GTree *inotify_directories;
@@ -140,15 +141,21 @@ static bool skip_path(const char *path)
static void
recursive_watch_subdirectories(struct watch_directory *directory,
- const char *path_fs)
+ const char *path_fs, unsigned depth)
{
GError *error = NULL;
DIR *dir;
struct dirent *ent;
assert(directory != NULL);
+ assert(depth <= inotify_max_depth);
assert(path_fs != NULL);
+ ++depth;
+
+ if (depth > inotify_max_depth)
+ return;
+
dir = opendir(path_fs);
if (dir == NULL) {
g_warning("Failed to open directory %s: %s",
@@ -209,13 +216,26 @@ recursive_watch_subdirectories(struct watch_directory *directory,
tree_add_watch_directory(child);
- recursive_watch_subdirectories(child, child_path_fs);
+ recursive_watch_subdirectories(child, child_path_fs, depth);
g_free(child_path_fs);
}
closedir(dir);
}
+G_GNUC_PURE
+static unsigned
+watch_directory_depth(const struct watch_directory *d)
+{
+ assert(d != NULL);
+
+ unsigned depth = 0;
+ while ((d = d->parent) != NULL)
+ ++depth;
+
+ return depth;
+}
+
static void
mpd_inotify_callback(int wd, unsigned mask,
G_GNUC_UNUSED const char *name, G_GNUC_UNUSED void *ctx)
@@ -250,12 +270,17 @@ mpd_inotify_callback(int wd, unsigned mask,
} else
path_fs = root;
- recursive_watch_subdirectories(directory, path_fs);
+ recursive_watch_subdirectories(directory, path_fs,
+ watch_directory_depth(directory));
g_free(path_fs);
}
- if ((mask & (IN_CLOSE_WRITE|IN_MOVE|IN_DELETE)) != 0) {
- /* a file was changed, or a direectory was
+ if ((mask & (IN_CLOSE_WRITE|IN_MOVE|IN_DELETE)) != 0 ||
+ /* at the maximum depth, we watch out for newly created
+ directories */
+ (watch_directory_depth(directory) == inotify_max_depth &&
+ (mask & (IN_CREATE|IN_ISDIR)) == (IN_CREATE|IN_ISDIR))) {
+ /* a file was changed, or a directory was
moved/deleted: queue a database update */
char *uri_utf8 = uri_fs != NULL
? fs_charset_to_utf8(uri_fs)
@@ -271,7 +296,7 @@ mpd_inotify_callback(int wd, unsigned mask,
}
void
-mpd_inotify_init(void)
+mpd_inotify_init(unsigned max_depth)
{
struct directory *root;
char *path;
@@ -300,6 +325,8 @@ mpd_inotify_init(void)
return;
}
+ inotify_max_depth = max_depth;
+
inotify_root.name = path;
inotify_root.descriptor = mpd_inotify_source_add(inotify_source, path,
IN_MASK, &error);
@@ -315,7 +342,7 @@ mpd_inotify_init(void)
inotify_directories = g_tree_new(compare);
tree_add_watch_directory(&inotify_root);
- recursive_watch_subdirectories(&inotify_root, path);
+ recursive_watch_subdirectories(&inotify_root, path, 0);
mpd_inotify_queue_init();
diff --git a/src/inotify_update.h b/src/inotify_update.h
index ee6fbcfd8..92b4e0cc6 100644
--- a/src/inotify_update.h
+++ b/src/inotify_update.h
@@ -25,7 +25,7 @@
#ifdef HAVE_INOTIFY_INIT
void
-mpd_inotify_init(void);
+mpd_inotify_init(unsigned max_depth);
void
mpd_inotify_finish(void);
@@ -33,7 +33,7 @@ mpd_inotify_finish(void);
#else /* !HAVE_INOTIFY_INIT */
static inline void
-mpd_inotify_init(void)
+mpd_inotify_init(G_GNUC_UNUSED unsigned max_depth)
{
}
diff --git a/src/main.c b/src/main.c
index 80102968e..c93a3f615 100644
--- a/src/main.c
+++ b/src/main.c
@@ -379,7 +379,8 @@ int main(int argc, char *argv[])
success = config_get_bool(CONF_AUTO_UPDATE, false);
#ifdef ENABLE_INOTIFY
if (success && mapper_has_music_directory())
- mpd_inotify_init();
+ mpd_inotify_init(config_get_unsigned(CONF_AUTO_UPDATE_DEPTH,
+ G_MAXUINT));
#else
if (success)
g_warning("inotify: auto_update was disabled. enable during compilation phase");