diff src/audacious/playlist.c @ 2548:68d1e9761cc5 trunk

[svn] - highly experimental code to speed up loading huge playlist. let me know if it breaks something.
author yaz
date Sun, 18 Feb 2007 20:42:53 -0800
parents 610d85b8a22b
children ef59b072a5d2
line wrap: on
line diff
--- a/src/audacious/playlist.c	Sun Feb 18 20:40:14 2007 -0800
+++ b/src/audacious/playlist.c	Sun Feb 18 20:42:53 2007 -0800
@@ -615,22 +615,37 @@
 			       TitleInput *tuple,
 			       InputPlugin * dec)
 {
-    GList *node;
     PlaylistEntry *entry;
 
     g_return_if_fail(playlist != NULL);
     g_return_if_fail(filename != NULL);
 
+    entry = playlist_entry_new(filename, tuple->track_name, tuple->length, dec);
+    if(!playlist->tail)
+        playlist->tail = g_list_last(playlist->entries);
+
     PLAYLIST_LOCK(playlist->mutex);
-    playlist->entries = g_list_insert(playlist->entries,
-                             playlist_entry_new(filename, tuple->track_name, tuple->length, dec),
-                             pos);
-
-    if (pos < 0)
-	    pos = g_list_length(playlist->entries) - 1; /* last element. */
-
-    node = g_list_nth(playlist->entries, pos);
-    entry = PLAYLIST_ENTRY(node->data);
+
+    if(pos == -1) { // the common case
+        GList *element;
+        element = g_list_alloc();
+        element->data = entry;
+        element->prev = playlist->tail; // NULL is allowed here.
+        element->next = NULL;
+
+        if(!playlist->entries) { // this is the first element
+            playlist->entries = element;
+            playlist->tail = element;
+        }
+        else { // the rests
+            g_return_if_fail(playlist->tail != NULL);
+            playlist->tail->next = element;
+            playlist->tail = element;
+        }
+    }
+    else {
+        playlist->entries = g_list_insert(playlist->entries, entry, pos);
+    }
 
     if (tuple != NULL) {
         entry->title = xmms_get_titlestring(tuple->formatter != NULL ? tuple->formatter : xmms_get_gentitle_format(), tuple);