693cbcd
diff -Nur audacious-plugins-fedora-1.5.1-orig/src/sndfile/plugin.c audacious-plugins-fedora-1.5.1/src/sndfile/plugin.c
693cbcd
--- audacious-plugins-fedora-1.5.1-orig/src/sndfile/plugin.c	2008-06-08 10:37:44.000000000 +0200
81c465b
+++ audacious-plugins-fedora-1.5.1/src/sndfile/plugin.c	2009-06-05 00:35:29.000000000 +0200
693cbcd
@@ -47,6 +47,7 @@
693cbcd
 static gint song_length;
693cbcd
 static gint bit_rate = 0;
693cbcd
 static glong seek_time = -1;
693cbcd
+static volatile char pause_flag;
693cbcd
 
693cbcd
 static GThread *decode_thread;
693cbcd
 static GMutex *decode_mutex;
693cbcd
@@ -121,6 +122,7 @@
693cbcd
 plugin_init (void)
693cbcd
 {
693cbcd
     seek_time = -1;
693cbcd
+    pause_flag = 0;
693cbcd
 
693cbcd
     decode_mutex = g_mutex_new();
693cbcd
     decode_cond = g_cond_new();
693cbcd
@@ -362,6 +364,22 @@
693cbcd
     return TRUE;
693cbcd
 }
693cbcd
 
693cbcd
+static void do_seek (InputPlayback * playback) {
693cbcd
+   playback->output->flush (seek_time);
693cbcd
+   sf_seek (sndfile, (long long) seek_time * sfinfo.samplerate / 1000, SEEK_SET);
693cbcd
+   seek_time = -1;
693cbcd
+}
693cbcd
+
693cbcd
+static void do_pause (InputPlayback * playback) {
693cbcd
+   playback->output->pause (1);
693cbcd
+   while (pause_flag) {
693cbcd
+      if (seek_time != -1)
693cbcd
+         do_seek (playback);
693cbcd
+      g_usleep(50000);
693cbcd
+   }
693cbcd
+   playback->output->pause (0);
693cbcd
+}
693cbcd
+
693cbcd
 static gpointer
693cbcd
 play_loop (gpointer arg)
693cbcd
 {
81c465b
@@ -407,17 +425,13 @@
81c465b
             playback->eof = TRUE;
81c465b
             playback->playing = FALSE;
81c465b
 
81c465b
-            g_mutex_unlock(decode_mutex);
693cbcd
             break;
693cbcd
         }
693cbcd
 
693cbcd
-        /* Do seek if seek_time is valid. */
693cbcd
-        if (seek_time >= 0) {
693cbcd
-            sf_seek (sndfile, (sf_count_t)((gint64)seek_time * (gint64)sfinfo.samplerate / 1000L),
693cbcd
-                     SEEK_SET);
693cbcd
-            playback->output->flush (seek_time);
693cbcd
-            seek_time = -1;
693cbcd
-        }
693cbcd
+        if (seek_time != -1)
693cbcd
+           do_seek (playback);
693cbcd
+        if (pause_flag)
693cbcd
+           do_pause (playback);
693cbcd
 
693cbcd
         if (playback->playing == FALSE)
693cbcd
             break;
81c465b
@@ -477,7 +491,7 @@
693cbcd
 static void
693cbcd
 play_pause (InputPlayback *playback, gshort p)
693cbcd
 {
693cbcd
-    playback->output->pause(p);
693cbcd
+   pause_flag = p;
693cbcd
 }
693cbcd
 
693cbcd
 static void