summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar waker <wakeroid@gmail.com>2009-08-08 14:40:50 +0200
committerGravatar waker <wakeroid@gmail.com>2009-08-08 14:40:50 +0200
commit65fa3ad73a984a9761afc36e31e33804cc471025 (patch)
treedcf94eb0502c2be15589cdf2cba12f2c646f072c
parentebce9029317b1a9cc793728eefc8f844de184876 (diff)
playlist order and looping mode + GUI
-rw-r--r--callbacks.c48
-rw-r--r--callbacks.h24
-rw-r--r--deadbeef.glade103
-rw-r--r--interface.c95
-rw-r--r--main.c2
-rw-r--r--playlist.c57
-rw-r--r--playlist.h9
-rw-r--r--streamer.c8
8 files changed, 330 insertions, 16 deletions
diff --git a/callbacks.c b/callbacks.c
index 1a5fa460..5637c9bb 100644
--- a/callbacks.c
+++ b/callbacks.c
@@ -513,3 +513,51 @@ on_voice5_clicked (GtkButton *button,
+
+void
+on_order_linear_activate (GtkMenuItem *menuitem,
+ gpointer user_data)
+{
+ ps_set_order (0);
+}
+
+
+void
+on_order_shuffle_activate (GtkMenuItem *menuitem,
+ gpointer user_data)
+{
+ ps_set_order (1);
+}
+
+
+void
+on_order_random_activate (GtkMenuItem *menuitem,
+ gpointer user_data)
+{
+ ps_set_order (2);
+}
+
+
+void
+on_loop_all_activate (GtkMenuItem *menuitem,
+ gpointer user_data)
+{
+ ps_set_loop_mode (0);
+}
+
+
+void
+on_loop_single_activate (GtkMenuItem *menuitem,
+ gpointer user_data)
+{
+ ps_set_loop_mode (2);
+}
+
+
+void
+on_loop_disable_activate (GtkMenuItem *menuitem,
+ gpointer user_data)
+{
+ ps_set_loop_mode (1);
+}
+
diff --git a/callbacks.h b/callbacks.h
index 88dfc9ea..87335205 100644
--- a/callbacks.h
+++ b/callbacks.h
@@ -233,3 +233,27 @@ gboolean
on_header_button_release_event (GtkWidget *widget,
GdkEventButton *event,
gpointer user_data);
+
+void
+on_order_linear_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
+
+void
+on_order_shuffle_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
+
+void
+on_order_random_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
+
+void
+on_loop_all_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
+
+void
+on_loop_single_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
+
+void
+on_loop_disable_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
diff --git a/deadbeef.glade b/deadbeef.glade
index c7607107..dacaa716 100644
--- a/deadbeef.glade
+++ b/deadbeef.glade
@@ -181,6 +181,109 @@
</child>
<child>
+ <widget class="GtkMenuItem" id="playlist1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Playlist</property>
+ <property name="use_underline">True</property>
+
+ <child>
+ <widget class="GtkMenu" id="playlist1_menu">
+
+ <child>
+ <widget class="GtkMenuItem" id="order1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Order</property>
+ <property name="use_underline">True</property>
+
+ <child>
+ <widget class="GtkMenu" id="order1_menu">
+
+ <child>
+ <widget class="GtkRadioMenuItem" id="order_linear">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Linear</property>
+ <property name="use_underline">True</property>
+ <property name="active">False</property>
+ <signal name="activate" handler="on_order_linear_activate" last_modification_time="Sat, 08 Aug 2009 12:26:33 GMT"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkRadioMenuItem" id="order_shuffle">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Shuffle</property>
+ <property name="use_underline">True</property>
+ <property name="active">False</property>
+ <property name="group">order_linear</property>
+ <signal name="activate" handler="on_order_shuffle_activate" last_modification_time="Sat, 08 Aug 2009 12:26:33 GMT"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkRadioMenuItem" id="order_random">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Random</property>
+ <property name="use_underline">True</property>
+ <property name="active">False</property>
+ <property name="group">order_linear</property>
+ <signal name="activate" handler="on_order_random_activate" last_modification_time="Sat, 08 Aug 2009 12:26:33 GMT"/>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="looping1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Looping</property>
+ <property name="use_underline">True</property>
+
+ <child>
+ <widget class="GtkMenu" id="looping1_menu">
+
+ <child>
+ <widget class="GtkRadioMenuItem" id="loop_all">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Loop All</property>
+ <property name="use_underline">True</property>
+ <property name="active">False</property>
+ <signal name="activate" handler="on_loop_all_activate" last_modification_time="Sat, 08 Aug 2009 12:26:33 GMT"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkRadioMenuItem" id="loop_single">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Loop Single Song</property>
+ <property name="use_underline">True</property>
+ <property name="active">False</property>
+ <property name="group">loop_all</property>
+ <signal name="activate" handler="on_loop_single_activate" last_modification_time="Sat, 08 Aug 2009 12:26:33 GMT"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkRadioMenuItem" id="loop_disable">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Don't Loop</property>
+ <property name="use_underline">True</property>
+ <property name="active">False</property>
+ <property name="group">loop_all</property>
+ <signal name="activate" handler="on_loop_disable_activate" last_modification_time="Sat, 08 Aug 2009 12:26:33 GMT"/>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
<widget class="GtkMenuItem" id="menuitem4">
<property name="visible">True</property>
<property name="label" translatable="yes">_Help</property>
diff --git a/interface.c b/interface.c
index a7e52767..8a2aefe4 100644
--- a/interface.c
+++ b/interface.c
@@ -51,6 +51,20 @@ create_mainwin (void)
GtkWidget *selection1_menu;
GtkWidget *remove1;
GtkWidget *crop1;
+ GtkWidget *playlist1;
+ GtkWidget *playlist1_menu;
+ GtkWidget *order1;
+ GtkWidget *order1_menu;
+ GSList *order_linear_group = NULL;
+ GtkWidget *order_linear;
+ GtkWidget *order_shuffle;
+ GtkWidget *order_random;
+ GtkWidget *looping1;
+ GtkWidget *looping1_menu;
+ GSList *loop_all_group = NULL;
+ GtkWidget *loop_all;
+ GtkWidget *loop_single;
+ GtkWidget *loop_disable;
GtkWidget *menuitem4;
GtkWidget *menuitem4_menu;
GtkWidget *about1;
@@ -178,6 +192,57 @@ create_mainwin (void)
gtk_widget_show (crop1);
gtk_container_add (GTK_CONTAINER (selection1_menu), crop1);
+ playlist1 = gtk_menu_item_new_with_mnemonic ("Playlist");
+ gtk_widget_show (playlist1);
+ gtk_container_add (GTK_CONTAINER (menubar1), playlist1);
+
+ playlist1_menu = gtk_menu_new ();
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (playlist1), playlist1_menu);
+
+ order1 = gtk_menu_item_new_with_mnemonic ("Order");
+ gtk_widget_show (order1);
+ gtk_container_add (GTK_CONTAINER (playlist1_menu), order1);
+
+ order1_menu = gtk_menu_new ();
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (order1), order1_menu);
+
+ order_linear = gtk_radio_menu_item_new_with_mnemonic (order_linear_group, "Linear");
+ order_linear_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (order_linear));
+ gtk_widget_show (order_linear);
+ gtk_container_add (GTK_CONTAINER (order1_menu), order_linear);
+
+ order_shuffle = gtk_radio_menu_item_new_with_mnemonic (order_linear_group, "Shuffle");
+ order_linear_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (order_shuffle));
+ gtk_widget_show (order_shuffle);
+ gtk_container_add (GTK_CONTAINER (order1_menu), order_shuffle);
+
+ order_random = gtk_radio_menu_item_new_with_mnemonic (order_linear_group, "Random");
+ order_linear_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (order_random));
+ gtk_widget_show (order_random);
+ gtk_container_add (GTK_CONTAINER (order1_menu), order_random);
+
+ looping1 = gtk_menu_item_new_with_mnemonic ("Looping");
+ gtk_widget_show (looping1);
+ gtk_container_add (GTK_CONTAINER (playlist1_menu), looping1);
+
+ looping1_menu = gtk_menu_new ();
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (looping1), looping1_menu);
+
+ loop_all = gtk_radio_menu_item_new_with_mnemonic (loop_all_group, "Loop All");
+ loop_all_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (loop_all));
+ gtk_widget_show (loop_all);
+ gtk_container_add (GTK_CONTAINER (looping1_menu), loop_all);
+
+ loop_single = gtk_radio_menu_item_new_with_mnemonic (loop_all_group, "Loop Single Song");
+ loop_all_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (loop_single));
+ gtk_widget_show (loop_single);
+ gtk_container_add (GTK_CONTAINER (looping1_menu), loop_single);
+
+ loop_disable = gtk_radio_menu_item_new_with_mnemonic (loop_all_group, "Don't Loop");
+ loop_all_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (loop_disable));
+ gtk_widget_show (loop_disable);
+ gtk_container_add (GTK_CONTAINER (looping1_menu), loop_disable);
+
menuitem4 = gtk_menu_item_new_with_mnemonic ("_Help");
gtk_widget_show (menuitem4);
gtk_container_add (GTK_CONTAINER (menubar1), menuitem4);
@@ -379,6 +444,24 @@ create_mainwin (void)
g_signal_connect ((gpointer) crop1, "activate",
G_CALLBACK (on_crop1_activate),
NULL);
+ g_signal_connect ((gpointer) order_linear, "activate",
+ G_CALLBACK (on_order_linear_activate),
+ NULL);
+ g_signal_connect ((gpointer) order_shuffle, "activate",
+ G_CALLBACK (on_order_shuffle_activate),
+ NULL);
+ g_signal_connect ((gpointer) order_random, "activate",
+ G_CALLBACK (on_order_random_activate),
+ NULL);
+ g_signal_connect ((gpointer) loop_all, "activate",
+ G_CALLBACK (on_loop_all_activate),
+ NULL);
+ g_signal_connect ((gpointer) loop_single, "activate",
+ G_CALLBACK (on_loop_single_activate),
+ NULL);
+ g_signal_connect ((gpointer) loop_disable, "activate",
+ G_CALLBACK (on_loop_disable_activate),
+ NULL);
g_signal_connect ((gpointer) about1, "activate",
G_CALLBACK (on_about1_activate),
NULL);
@@ -514,6 +597,18 @@ create_mainwin (void)
GLADE_HOOKUP_OBJECT (mainwin, selection1_menu, "selection1_menu");
GLADE_HOOKUP_OBJECT (mainwin, remove1, "remove1");
GLADE_HOOKUP_OBJECT (mainwin, crop1, "crop1");
+ GLADE_HOOKUP_OBJECT (mainwin, playlist1, "playlist1");
+ GLADE_HOOKUP_OBJECT (mainwin, playlist1_menu, "playlist1_menu");
+ GLADE_HOOKUP_OBJECT (mainwin, order1, "order1");
+ GLADE_HOOKUP_OBJECT (mainwin, order1_menu, "order1_menu");
+ GLADE_HOOKUP_OBJECT (mainwin, order_linear, "order_linear");
+ GLADE_HOOKUP_OBJECT (mainwin, order_shuffle, "order_shuffle");
+ GLADE_HOOKUP_OBJECT (mainwin, order_random, "order_random");
+ GLADE_HOOKUP_OBJECT (mainwin, looping1, "looping1");
+ GLADE_HOOKUP_OBJECT (mainwin, looping1_menu, "looping1_menu");
+ GLADE_HOOKUP_OBJECT (mainwin, loop_all, "loop_all");
+ GLADE_HOOKUP_OBJECT (mainwin, loop_single, "loop_single");
+ GLADE_HOOKUP_OBJECT (mainwin, loop_disable, "loop_disable");
GLADE_HOOKUP_OBJECT (mainwin, menuitem4, "menuitem4");
GLADE_HOOKUP_OBJECT (mainwin, menuitem4_menu, "menuitem4_menu");
GLADE_HOOKUP_OBJECT (mainwin, about1, "about1");
diff --git a/main.c b/main.c
index f5a85a65..f7e81628 100644
--- a/main.c
+++ b/main.c
@@ -48,7 +48,7 @@ psdl_thread (uintptr_t ctx) {
case M_NEXTSONG:
GDK_THREADS_ENTER();
p_stop ();
- ps_nextsong ();
+ ps_nextsong (1);
GDK_THREADS_LEAVE();
break;
case M_PREVSONG:
diff --git a/playlist.c b/playlist.c
index 88a3f724..2d1a687e 100644
--- a/playlist.c
+++ b/playlist.c
@@ -29,8 +29,8 @@ playItem_t *playlist_shuffle_head;
playItem_t playlist_current;
playItem_t *playlist_current_ptr;
static int ps_count = 0;
-static int ps_mode = 0; // 0 = linear, 1 = shuffle, 2 = random
-static int ps_loop_mode = 0; // 0 = loop, 1 = don't loop
+static int ps_order = 0; // 0 = linear, 1 = shuffle, 2 = random
+static int ps_loop_mode = 0; // 0 = loop, 1 = don't loop, 2 = loop single
void
ps_free (void) {
@@ -613,9 +613,9 @@ ps_set_current (playItem_t *it) {
int
ps_prevsong (void) {
- if (ps_mode == 1) { // shuffle
+ if (ps_order == 1) { // shuffle
if (!playlist_current_ptr) {
- return ps_nextsong ();
+ return ps_nextsong (1);
}
else {
playItem_t *it = NULL;
@@ -628,7 +628,9 @@ ps_prevsong (void) {
}
if (!it && last) {
// means we were on 1st song, jump to tail
- it = last;
+ if (ps_loop_mode == 0) {
+ it = last;
+ }
}
if (!it) {
return -1;
@@ -638,13 +640,15 @@ ps_prevsong (void) {
return 0;
}
}
- else if (ps_mode == 0) { // linear
+ else if (ps_order == 0) { // linear
playItem_t *it = NULL;
if (playlist_current_ptr) {
it = playlist_current_ptr->prev;
}
if (!it) {
- it = playlist_tail;
+ if (ps_loop_mode == 0) {
+ it = playlist_tail;
+ }
}
if (!it) {
return -1;
@@ -653,15 +657,15 @@ ps_prevsong (void) {
streamer_set_nextsong (r, 1);
return 0;
}
- else if (ps_mode == 2) { // random
+ else if (ps_order == 2) { // random
ps_randomsong ();
}
return -1;
}
int
-ps_nextsong (void) {
- if (ps_mode == 1) { // shuffle
+ps_nextsong (int reason) {
+ if (ps_order == 1) { // shuffle
if (!playlist_current_ptr) {
playItem_t *it = playlist_shuffle_head;
if (!it) {
@@ -672,6 +676,11 @@ ps_nextsong (void) {
return 0;
}
else {
+ if (reason == 0 && ps_loop_mode == 2) {
+ int r = ps_get_idx_of (playlist_current_ptr);
+ streamer_set_nextsong (r, 1);
+ return 0;
+ }
playItem_t *it = playlist_current_ptr->shufflenext;
if (!it) {
if (ps_loop_mode == 0) { // loop
@@ -689,13 +698,20 @@ ps_nextsong (void) {
return 0;
}
}
- else if (ps_mode == 0) { // linear
+ else if (ps_order == 0) { // linear
playItem_t *it = NULL;
if (playlist_current_ptr) {
+ if (reason == 0 && ps_loop_mode == 2) {
+ int r = ps_get_idx_of (playlist_current_ptr);
+ streamer_set_nextsong (r, 1);
+ return 0;
+ }
it = playlist_current_ptr->next;
}
if (!it) {
- it = playlist_head;
+ if (ps_loop_mode == 0) {
+ it = playlist_head;
+ }
}
if (!it) {
return -1;
@@ -704,7 +720,12 @@ ps_nextsong (void) {
streamer_set_nextsong (r, 1);
return 0;
}
- else if (ps_mode == 2) { // random
+ else if (ps_order == 2) { // random
+ if (reason == 0 && ps_loop_mode == 2 && playlist_current_ptr) {
+ int r = ps_get_idx_of (playlist_current_ptr);
+ streamer_set_nextsong (r, 1);
+ return 0;
+ }
return ps_randomsong ();
}
return -1;
@@ -896,3 +917,13 @@ ps_shuffle (void) {
}
#endif
}
+
+void
+ps_set_order (int order) {
+ ps_order = order;
+}
+
+void
+ps_set_loop_mode (int mode) {
+ ps_loop_mode = mode;
+}
diff --git a/playlist.h b/playlist.h
index d59c87a1..1313a23e 100644
--- a/playlist.h
+++ b/playlist.h
@@ -74,8 +74,9 @@ int
ps_set_current (playItem_t *it);
// returns -1 if theres no next song, or playlist finished
+// reason 0 means "song finished", 1 means "user clicked next"
int
-ps_nextsong (void);
+ps_nextsong (int reason);
int
ps_prevsong (void);
@@ -103,4 +104,10 @@ ps_delete_selected (void);
void
ps_shuffle (void);
+void
+ps_set_order (int order);
+
+void
+ps_set_loop_mode (int mode);
+
#endif // __PLAYLIST_H
diff --git a/streamer.c b/streamer.c
index 7796b3e2..02d8694d 100644
--- a/streamer.c
+++ b/streamer.c
@@ -48,11 +48,14 @@ streamer_thread (uintptr_t ctx) {
//streambuffer_fill = 0;
codecleft = 0;
codec_unlock ();
+ ps_set_current (ps_get_for_idx (sng));
+#if 0
if (ps_set_current (ps_get_for_idx (sng)) < 0) {
while (ps_nextsong () < 0) {
usleep (3000);
}
}
+#endif
if (pstate == 0) {
p_stop ();
}
@@ -221,9 +224,12 @@ streamer_read_async (char *bytes, int size) {
}
else {
// that means EOF
- while (ps_nextsong () < 0) {
+ ps_nextsong (0);
+#if 0
+ while (ps_nextsong (0) < 0) {
usleep (3000);
}
+#endif
break;
}
}