summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar waker <wakeroid@gmail.com>2009-07-07 00:03:36 +0200
committerGravatar waker <wakeroid@gmail.com>2009-07-07 00:17:39 +0200
commita6aabe9020889e508fff49666cfc1c8506fcfe45 (patch)
tree2ae64f5d998366903f6485d9be427a03f06b35c8
parent2b3143e6fc601a2c3402a8f4791f0c4d2c9152ad (diff)
added more threading safeguards
-rw-r--r--deadbeef.glade6
-rw-r--r--gtkplaylist.c43
-rw-r--r--gtkplaylist.h3
-rw-r--r--interface.c6
-rw-r--r--main.c5
-rw-r--r--messages.h1
6 files changed, 53 insertions, 11 deletions
diff --git a/deadbeef.glade b/deadbeef.glade
index 6ce1b779..7ac05591 100644
--- a/deadbeef.glade
+++ b/deadbeef.glade
@@ -232,7 +232,6 @@
<child>
<widget class="GtkButton" id="stopbtn">
<property name="visible">True</property>
- <property name="can_focus">True</property>
<property name="relief">GTK_RELIEF_NONE</property>
<property name="focus_on_click">True</property>
<signal name="clicked" handler="on_stopbtn_clicked" last_modification_time="Sun, 05 Jul 2009 10:48:41 GMT"/>
@@ -259,7 +258,6 @@
<child>
<widget class="GtkButton" id="playbtn">
<property name="visible">True</property>
- <property name="can_focus">True</property>
<property name="relief">GTK_RELIEF_NONE</property>
<property name="focus_on_click">True</property>
<signal name="clicked" handler="on_playbtn_clicked" last_modification_time="Sun, 05 Jul 2009 10:48:53 GMT"/>
@@ -286,7 +284,6 @@
<child>
<widget class="GtkButton" id="pausebtn">
<property name="visible">True</property>
- <property name="can_focus">True</property>
<property name="relief">GTK_RELIEF_NONE</property>
<property name="focus_on_click">True</property>
<signal name="clicked" handler="on_pausebtn_clicked" last_modification_time="Sun, 05 Jul 2009 10:49:01 GMT"/>
@@ -313,7 +310,6 @@
<child>
<widget class="GtkButton" id="prevbtn">
<property name="visible">True</property>
- <property name="can_focus">True</property>
<property name="relief">GTK_RELIEF_NONE</property>
<property name="focus_on_click">True</property>
<signal name="clicked" handler="on_prevbtn_clicked" last_modification_time="Sun, 05 Jul 2009 10:49:08 GMT"/>
@@ -340,7 +336,6 @@
<child>
<widget class="GtkButton" id="nextbtn">
<property name="visible">True</property>
- <property name="can_focus">True</property>
<property name="relief">GTK_RELIEF_NONE</property>
<property name="focus_on_click">True</property>
<signal name="clicked" handler="on_nextbtn_clicked" last_modification_time="Sun, 05 Jul 2009 10:49:12 GMT"/>
@@ -367,7 +362,6 @@
<child>
<widget class="GtkButton" id="playrand">
<property name="visible">True</property>
- <property name="can_focus">True</property>
<property name="relief">GTK_RELIEF_NONE</property>
<property name="focus_on_click">True</property>
<signal name="clicked" handler="on_playrand_clicked" last_modification_time="Sun, 05 Jul 2009 10:49:16 GMT"/>
diff --git a/gtkplaylist.c b/gtkplaylist.c
index c5d040d2..02b7cd04 100644
--- a/gtkplaylist.c
+++ b/gtkplaylist.c
@@ -11,6 +11,7 @@
#include "support.h"
#include "playlist.h"
#include "psdl.h"
+#include "codec.h"
#include "common.h"
#include "messagepump.h"
#include "messages.h"
@@ -204,6 +205,7 @@ gtkps_mouse1_clicked (GtkWidget *widget, int ex, int ey, double time) {
&& fabs(ps_lastpos[1] - ey) < 3) {
// doubleclick - play this item
if (playlist_row != -1) {
+#if 0
playItem_t *it = ps_get_for_idx (playlist_row);
if (it) {
playItem_t *prev = playlist_current;
@@ -212,14 +214,11 @@ gtkps_mouse1_clicked (GtkWidget *widget, int ex, int ey, double time) {
if (prev) {
redraw_ps_row (widget, ps_get_idx_of (prev));
}
-// if (playlist_current) {
-// redraw_ps_row (widget, ps_get_idx_of (playlist_current));
-// }
}
messagepump_push (M_PLAYSONG, 0, 0, 0);
-// psdl_stop ();
-// psdl_play (it);
}
+#endif
+ messagepump_push (M_PLAYSONGNUM, 0, playlist_row, 0);
}
@@ -249,8 +248,10 @@ gtkps_playsong (void) {
}
else if (playlist_current) {
printf ("restart\n");
+ codec_lock ();
psdl_stop ();
psdl_play (playlist_current);
+ codec_unlock ();
GtkWidget *widget = lookup_widget (mainwin, "playlist");
redraw_ps_row (widget, ps_get_idx_of (playlist_current));
}
@@ -258,8 +259,10 @@ gtkps_playsong (void) {
printf ("start under cursor\n");
playItem_t *it = ps_get_for_idx (playlist_row);
if (it) {
+ codec_lock ();
psdl_stop ();
psdl_play (it);
+ codec_unlock ();
playlist_current = it;
}
GtkWidget *widget = lookup_widget (mainwin, "playlist");
@@ -269,8 +272,10 @@ gtkps_playsong (void) {
printf ("play 1st in list\n");
playlist_current = playlist_head;
if (playlist_current) {
+ codec_lock ();
psdl_stop ();
psdl_play (playlist_current);
+ codec_unlock ();
GtkWidget *widget = lookup_widget (mainwin, "playlist");
redraw_ps_row (widget, ps_get_idx_of (playlist_current));
}
@@ -313,8 +318,10 @@ gtkps_nextsong (void) {
playlist_current = playlist_head;
}
if (playlist_current) {
+ codec_lock ();
psdl_stop ();
psdl_play (playlist_current);
+ codec_unlock ();
}
if (playlist_current != prev) {
if (prev) {
@@ -342,8 +349,10 @@ gtkps_randomsong (void) {
playlist_current = NULL;
}
if (playlist_current) {
+ codec_lock ();
psdl_stop ();
psdl_play (playlist_current);
+ codec_unlock ();
}
if (playlist_current != prev) {
if (prev) {
@@ -369,3 +378,27 @@ gtkps_pausesong (void) {
psdl_pause ();
}
}
+
+void
+gtkps_playsongnum (int idx) {
+ playItem_t *it = ps_get_for_idx (playlist_row);
+ if (it) {
+ if (it != playlist_current) {
+ GtkWidget *widget = lookup_widget (mainwin, "playlist");
+ int prev = -1;
+ if (playlist_current) {
+ prev = ps_get_idx_of (playlist_current);
+ }
+ playlist_current = it;
+ if (prev != -1) {
+ redraw_ps_row (widget, prev);
+ }
+ redraw_ps_row (widget, idx);
+ }
+ codec_lock ();
+ psdl_stop ();
+ psdl_play (playlist_current);
+ codec_unlock ();
+ }
+}
+
diff --git a/gtkplaylist.h b/gtkplaylist.h
index 5bc952d1..4a632982 100644
--- a/gtkplaylist.h
+++ b/gtkplaylist.h
@@ -52,4 +52,7 @@ gtkps_randomsong (void);
void
gtkps_pausesong (void);
+void
+gtkps_playsongnum (int idx);
+
#endif
diff --git a/interface.c b/interface.c
index abe2d8b2..c914989b 100644
--- a/interface.c
+++ b/interface.c
@@ -198,6 +198,7 @@ create_mainwin (void)
stopbtn = gtk_button_new ();
gtk_widget_show (stopbtn);
gtk_box_pack_start (GTK_BOX (hbox3), stopbtn, FALSE, FALSE, 0);
+ GTK_WIDGET_UNSET_FLAGS (stopbtn, GTK_CAN_FOCUS);
gtk_button_set_relief (GTK_BUTTON (stopbtn), GTK_RELIEF_NONE);
image1 = gtk_image_new_from_stock ("gtk-media-stop", GTK_ICON_SIZE_BUTTON);
@@ -207,6 +208,7 @@ create_mainwin (void)
playbtn = gtk_button_new ();
gtk_widget_show (playbtn);
gtk_box_pack_start (GTK_BOX (hbox3), playbtn, FALSE, FALSE, 0);
+ GTK_WIDGET_UNSET_FLAGS (playbtn, GTK_CAN_FOCUS);
gtk_button_set_relief (GTK_BUTTON (playbtn), GTK_RELIEF_NONE);
image2 = gtk_image_new_from_stock ("gtk-media-play", GTK_ICON_SIZE_BUTTON);
@@ -216,6 +218,7 @@ create_mainwin (void)
pausebtn = gtk_button_new ();
gtk_widget_show (pausebtn);
gtk_box_pack_start (GTK_BOX (hbox3), pausebtn, FALSE, FALSE, 0);
+ GTK_WIDGET_UNSET_FLAGS (pausebtn, GTK_CAN_FOCUS);
gtk_button_set_relief (GTK_BUTTON (pausebtn), GTK_RELIEF_NONE);
image3 = gtk_image_new_from_stock ("gtk-media-pause", GTK_ICON_SIZE_BUTTON);
@@ -225,6 +228,7 @@ create_mainwin (void)
prevbtn = gtk_button_new ();
gtk_widget_show (prevbtn);
gtk_box_pack_start (GTK_BOX (hbox3), prevbtn, FALSE, FALSE, 0);
+ GTK_WIDGET_UNSET_FLAGS (prevbtn, GTK_CAN_FOCUS);
gtk_button_set_relief (GTK_BUTTON (prevbtn), GTK_RELIEF_NONE);
image4 = gtk_image_new_from_stock ("gtk-media-previous", GTK_ICON_SIZE_BUTTON);
@@ -234,6 +238,7 @@ create_mainwin (void)
nextbtn = gtk_button_new ();
gtk_widget_show (nextbtn);
gtk_box_pack_start (GTK_BOX (hbox3), nextbtn, FALSE, FALSE, 0);
+ GTK_WIDGET_UNSET_FLAGS (nextbtn, GTK_CAN_FOCUS);
gtk_button_set_relief (GTK_BUTTON (nextbtn), GTK_RELIEF_NONE);
image5 = gtk_image_new_from_stock ("gtk-media-next", GTK_ICON_SIZE_BUTTON);
@@ -243,6 +248,7 @@ create_mainwin (void)
playrand = gtk_button_new ();
gtk_widget_show (playrand);
gtk_box_pack_start (GTK_BOX (hbox3), playrand, FALSE, FALSE, 0);
+ GTK_WIDGET_UNSET_FLAGS (playrand, GTK_CAN_FOCUS);
gtk_button_set_relief (GTK_BUTTON (playrand), GTK_RELIEF_NONE);
alignment1 = gtk_alignment_new (0.5, 0.5, 0, 0);
diff --git a/main.c b/main.c
index d95fffd4..8068e6ec 100644
--- a/main.c
+++ b/main.c
@@ -38,6 +38,11 @@ psdl_thread (uintptr_t ctx) {
gtkps_playsong ();
GDK_THREADS_LEAVE();
break;
+ case M_PLAYSONGNUM:
+ GDK_THREADS_ENTER();
+ gtkps_playsongnum (p1);
+ GDK_THREADS_LEAVE();
+ break;
case M_STOPSONG:
GDK_THREADS_ENTER();
gtkps_stopsong ();
diff --git a/messages.h b/messages.h
index a9d3419e..a46d38dc 100644
--- a/messages.h
+++ b/messages.h
@@ -6,6 +6,7 @@ enum {
M_NEXTSONG,
M_PREVSONG,
M_PLAYSONG,
+ M_PLAYSONGNUM,
M_STOPSONG,
M_PAUSESONG,
M_PLAYRANDOM,