add single instance mode
[uwplayer.git] / application / playlist.c
index 06172c3..89c276b 100644 (file)
 
 #include "playlist.h"
 
+#include <stdlib.h>
+
 #include "player.h"
 #include "utils.h"
 
+#include <cx/array_list.h>
+#include <cx/linked_list.h>
+
 void PlayListInit(MainWindow *win) {
+    win->playlist.tracks = cxArrayListCreate(cxDefaultAllocator, NULL, CX_STORE_POINTERS, 64);
+    win->playlist.tracks->simple_destructor = free;
     win->playlist.current_track = -1;
 }
 
 void PlayListAddFile(MainWindow *win, const char *file) {
     char *f = strdup(file);
-    win->playlist.tracks = ucx_list_append(win->playlist.tracks, f);
+    cxListAdd(win->playlist.tracks, f);
 }
 
 void PlayListPlayNext(MainWindow *win, bool force) {
-    UcxList *tracks = win->playlist.tracks;
+    CxList *tracks = win->playlist.tracks;
     if(!tracks) return;
-    size_t len = ucx_list_size(tracks);
+    size_t len = tracks->size;
     
     int current = win->playlist.current_track;
     if(win->playlist.repeatTrack) {
         if(force) {
             current++;
         }
+    } else if(win->playlist.random) {
+        current = random() % len;
     } else if(current < len) {
         current++;
     } else if(win->playlist.autoplayFolder) {
         char *next_file = util_find_next_file(win->file);
-        win->playlist.tracks = ucx_list_append(win->playlist.tracks, next_file);
+        cxListAdd(win->playlist.tracks, next_file);
         current = len;
     } else {
         current = 0;
     }
     
-    win->playlist.current_track = current;
-    
-    UcxList *fileElm = ucx_list_get(tracks, current);
-    if(!fileElm) {
-        return;
+    PlayListPlayTrack(win, current);
+}
+
+void PlayListPlayTrack(MainWindow *win, int i) {
+    CxList *tracks = win->playlist.tracks;
+    if(i < tracks->size) {
+        char *file = cxListAt(tracks, i);
+        if(file) {
+            win->playlist.current_track = i;
+            win->file = file;
+            PlayerOpenFile(win);
+            win->playlist.current_track = i;
+        }
     }
-    win->file = fileElm->data;
-    
-    PlayerOpenFile(win);
+}
+
+void PlayListClear(MainWindow *win) {
+    cxListClear(win->playlist.tracks);
 }