diff options
author | 2009-08-08 14:40:50 +0200 | |
---|---|---|
committer | 2009-08-08 14:40:50 +0200 | |
commit | 65fa3ad73a984a9761afc36e31e33804cc471025 (patch) | |
tree | dcf94eb0502c2be15589cdf2cba12f2c646f072c | |
parent | ebce9029317b1a9cc793728eefc8f844de184876 (diff) |
playlist order and looping mode + GUI
-rw-r--r-- | callbacks.c | 48 | ||||
-rw-r--r-- | callbacks.h | 24 | ||||
-rw-r--r-- | deadbeef.glade | 103 | ||||
-rw-r--r-- | interface.c | 95 | ||||
-rw-r--r-- | main.c | 2 | ||||
-rw-r--r-- | playlist.c | 57 | ||||
-rw-r--r-- | playlist.h | 9 | ||||
-rw-r--r-- | streamer.c | 8 |
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"); @@ -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: @@ -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; +} @@ -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 @@ -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; } } |