55 static pthread_mutex_t
mutex = PTHREAD_MUTEX_INITIALIZER;
56 static pthread_cond_t
cond = PTHREAD_COND_INITIALIZER;
73 GDK_WINDOW_TYPE_HINT_DIALOG);
74 gtk_window_set_title ((GtkWindow *)
status_window,
_(
"Searching ..."));
76 gtk_container_set_border_width ((GtkContainer *)
status_window, 6);
78 GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
85 PANGO_ELLIPSIZE_MIDDLE);
99 pthread_mutex_lock (&
mutex);
102 snprintf (scratch,
sizeof scratch, dngettext (PACKAGE,
"%d file found",
107 printf (
"Searching, %s ...\r", scratch);
116 pthread_mutex_unlock (&
mutex);
122 pthread_mutex_lock (&
mutex);
130 pthread_mutex_unlock (&
mutex);
150 for (
int i = 0; i < count; i ++)
159 for (
int i = 0; i < count; i ++)
221 g_return_if_fail (filename);
222 if (filter && ! filter (filename, user))
230 if (! tuple && ! decoder)
233 if (validate && ! decoder)
248 for (
int sub = 0; sub < n_subtunes; sub ++)
250 char * subname =
str_printf (
"%s?%d", filename,
268 g_return_if_fail (filename);
269 if (filter && ! filter (filename, user))
284 GList * files =
NULL;
285 DIR * folder = opendir (unix_name);
289 struct dirent *
entry;
290 while ((entry = readdir (folder)))
292 if (entry->d_name[0] !=
'.')
293 files = g_list_prepend (files, g_build_filename (unix_name, entry->d_name,
NULL));
303 if (lstat (files->data, & info) < 0)
305 if (stat (files->data, & info) < 0)
309 if (S_ISREG (info.st_mode))
318 else if (S_ISDIR (info.st_mode))
329 g_free (files->data);
330 files = g_list_delete_link (files, files);
341 g_return_if_fail (filename);
342 if (filter && ! filter (filename, user))
352 if (!
playlist_load (filename, & title, & filenames, & tuples))
359 for (
int i = 0; i < count; i ++)
361 NULL, NULL, filter, user, result,
FALSE);
373 g_return_if_fail (filename);
387 pthread_mutex_lock (&
mutex);
399 if (result->
at < 0 || result->
at > count)
429 pthread_mutex_unlock (&
mutex);
437 pthread_mutex_lock (&
mutex);
451 pthread_mutex_unlock (&
mutex);
460 for (
int i = 0; i < count; i ++)
473 pthread_mutex_lock (&
mutex);
482 pthread_mutex_unlock (&
mutex);
488 pthread_mutex_lock (&
mutex);
491 pthread_mutex_unlock (&
mutex);
496 pthread_mutex_lock (&
mutex);
498 pthread_cond_broadcast (&
cond);
499 pthread_mutex_unlock (&
mutex);
538 g_return_if_fail (playlist_id >= 0);
542 pthread_mutex_lock (&
mutex);
544 pthread_cond_broadcast (&
cond);
545 pthread_mutex_unlock (&
mutex);
550 pthread_mutex_lock (&
mutex);
556 for (GList * node =
add_tasks; node; node = node->next)
558 if (((
AddTask *) node->data)->playlist_id == playlist_id)
565 for (GList * node =
add_results; node; node = node->next)
567 if (((
AddResult *) node->data)->playlist_id == playlist_id)
577 pthread_mutex_unlock (&
mutex);
581 pthread_mutex_unlock (&
mutex);
bool_t(* PlaylistFilterFunc)(const char *filename, void *user)
static GtkWidget * status_count_label
static void index_free_tuples(Index *tuples)
static GList * add_results
static bool_t add_finish(void *unused)
void playlist_entry_insert(int playlist, int at, const char *filename, Tuple *tuple, bool_t play)
int playlist_get_unique_id(int playlist_num)
int playlist_by_unique_id(int id)
static void status_update(const char *filename, int found)
EXPORT Index * index_new(void)
EXPORT char * uri_to_filename(const char *uri)
void playlist_entry_insert_batch_raw(int playlist_num, int at, Index *filenames, Index *tuples, Index *decoders)
PluginHandle * file_find_decoder(const char *filename, bool_t fast)
static void add_file(char *filename, Tuple *tuple, PluginHandle *decoder, PlaylistFilterFunc filter, void *user, AddResult *result, bool_t validate)
static pthread_t add_thread
int playlist_entry_count(int playlist_num)
bool_t playlist_add_in_progress(int playlist)
static AddResult * add_result_new(int playlist_id, int at, bool_t play)
EXPORT int index_count(Index *index)
char * str_printf(const char *format,...)
static void * add_worker(void *unused)
static void add_result_free(AddResult *result)
EXPORT int string_compare(const char *ap, const char *bp)
static void add_task_free(AddTask *task)
void playlist_entry_insert_filtered(int playlist, int at, Index *filenames, Index *tuples, PlaylistFilterFunc filter, void *user, bool_t play)
static char status_path[512]
bool_t filename_is_playlist(const char *filename)
static int current_playlist_id
PlaylistFilterFunc filter
EXPORT void * index_get(Index *index, int at)
EXPORT void index_append(Index *index, void *value)
static void status_done_locked(void)
EXPORT void tuple_unref(Tuple *tuple)
bool_t get_bool(const char *section, const char *name)
static pthread_mutex_t mutex
EXPORT int tuple_get_nth_subtune(Tuple *tuple, int n)
static void add_generic(char *filename, Tuple *tuple, PlaylistFilterFunc filter, void *user, AddResult *result)
void str_unref(char *str)
EXPORT void index_free(Index *index)
static pthread_cond_t cond
static GtkWidget * status_window
bool_t playlist_load(const char *filename, char **title, Index **filenames_p, Index **tuples_p)
void playlist_entry_insert_batch(int playlist, int at, Index *filenames, Index *tuples, bool_t play)
void playlist_set_position(int playlist_num, int entry_num)
static void add_playlist(char *filename, PlaylistFilterFunc filter, void *user, AddResult *result)
EXPORT void index_set(Index *index, int at, void *value)
EXPORT void hook_call(const char *name, void *data)
static void index_free_filenames(Index *filenames)
bool_t input_plugin_has_subtunes(PluginHandle *plugin)
EXPORT char * filename_to_uri(const char *name)
static GtkWidget * status_path_label
EXPORT int tuple_get_n_subtunes(Tuple *tuple)
static bool_t status_cb(void *unused)
char * str_get(const char *str)
void drct_play_playlist(int playlist)
EXPORT bool_t vfs_file_test(const char *path, int test)
Wrapper for g_file_test().
static void add_folder(char *filename, PlaylistFilterFunc filter, void *user, AddResult *result)
static AddTask * add_task_new(int playlist_id, int at, bool_t play, Index *filenames, Index *tuples, PlaylistFilterFunc filter, void *user)