956ec70
diff -Nur audacious-plugins-fedora-2.1-orig/src/musepack/libmpc.cxx audacious-plugins-fedora-2.1-musepack/src/musepack/libmpc.cxx
956ec70
--- audacious-plugins-fedora-2.1-orig/src/musepack/libmpc.cxx	2009-07-07 00:40:36.000000000 +0200
efe8268
+++ audacious-plugins-fedora-2.1-musepack/src/musepack/libmpc.cxx	2009-11-30 11:49:47.000000000 +0100
4e8f14f
@@ -48,8 +48,7 @@
1ef2bed
 static MpcDecoder   mpcDecoder   = {0};
1ef2bed
 static TrackInfo    track        = {0};
1ef2bed
 
1ef2bed
-static GThread            *threadHandle;
4e8f14f
-static GStaticMutex threadMutex = G_STATIC_MUTEX_INIT;
4e8f14f
+/* static GStaticMutex threadMutex = G_STATIC_MUTEX_INIT; */
1ef2bed
 
1ef2bed
 /*
4e8f14f
  * VFS callback implementation, adapted from mpc_reader.c.
efe8268
@@ -301,24 +300,16 @@
1ef2bed
     mpcDecoder.isAlive  = true;
1ef2bed
     mpcDecoder.isOutput = false;
1ef2bed
     mpcDecoder.isPause  = false;
1ef2bed
-    threadHandle = g_thread_self();
62a66f2
-    data->set_pb_ready(data);
1ef2bed
     decodeStream(data);
956ec70
+    data->playing = FALSE;
1ef2bed
 }
956ec70
 
1ef2bed
 static void mpcStop(InputPlayback *data)
1ef2bed
 {
efe8268
+    data->playing = FALSE;
efe8268
+    mpcDecoder.isPause = false;
efe8268
+    mpcDecoder.offset = -1;
1ef2bed
     setAlive(false);
1ef2bed
-    if (threadHandle)
1ef2bed
-    {
1ef2bed
-        g_thread_join(threadHandle);
efe8268
-        if (mpcDecoder.isOutput)
efe8268
-        {
efe8268
-            data->output->buffer_free();
efe8268
-            data->output->close_audio();
efe8268
-            mpcDecoder.isOutput = false;
efe8268
-        }
1ef2bed
-    }
1ef2bed
 }
1ef2bed
 
1ef2bed
 static void mpcPause(InputPlayback *data, short p_Pause)
efe8268
@@ -823,7 +814,9 @@
4e8f14f
     lockRelease();
4e8f14f
 
4e8f14f
     gint counter = 2 * track.sampleFreq / 3;
4e8f14f
-    while (isAlive())
62a66f2
+    data->playing = TRUE;
62a66f2
+    data->set_pb_ready(data);
4e8f14f
+    while (isAlive() && data->playing)
4e8f14f
     {
4e8f14f
         if (getOffset() != -1)
4e8f14f
         {
efe8268
@@ -832,18 +825,19 @@
4e8f14f
         }
1ef2bed
 
1ef2bed
         lockAcquire();
4e8f14f
-        short iPlaying = data->output->buffer_playing()? 1 : 0;
1ef2bed
-        gint iFree = data->output->buffer_free();
1ef2bed
-        if (!mpcDecoder.isPause && iFree >= ((1152 * 4) << iPlaying))
1ef2bed
+        if (!mpcDecoder.isPause)
1ef2bed
         {
4e8f14f
-            unsigned status = processBuffer(data, sampleBuffer, xmmsBuffer, decoder);
4e8f14f
-            if (status == (unsigned) (-1))
4e8f14f
+            guint status = processBuffer(data, sampleBuffer, xmmsBuffer, decoder);
4e8f14f
+            if (status == (guint)(-1))
4e8f14f
             {
4e8f14f
                 mpcDecoder.isError = g_strdup_printf("[xmms-musepack] error from internal decoder on %s", filename);
efe8268
-                return endThread(filename, input, true);
efe8268
+                break;
efe8268
+            }
4e8f14f
+            if (status == 0) {
4e8f14f
+                data->eof = TRUE;
4e8f14f
+                data->playing = FALSE;
efe8268
+                break;
efe8268
             }
efe8268
-            if (status == 0 && iPlaying == 0)
efe8268
-                return endThread(filename, input, true);
4e8f14f
 
1ef2bed
             lockRelease();
4e8f14f
 
efe8268
@@ -863,16 +857,22 @@
efe8268
             g_usleep(10000);
efe8268
         }
efe8268
     }
efe8268
+    data->output->buffer_free();
efe8268
+    data->output->close_audio();
efe8268
+    mpcDecoder.isOutput = false;
1ef2bed
     return endThread(filename, input, false);
4e8f14f
 }
4e8f14f
 
4e8f14f
-static int processBuffer(InputPlayback *playback, 
4e8f14f
+static guint processBuffer(InputPlayback *playback, 
4e8f14f
     MPC_SAMPLE_FORMAT* sampleBuffer, char* xmmsBuffer, mpc_decoder& decoder)
4e8f14f
 {
4e8f14f
     mpc_uint32_t vbrAcc = 0;
4e8f14f
     mpc_uint32_t vbrUpd = 0;
4e8f14f
 
4e8f14f
-    unsigned status  = mpc_decoder_decode(&decoder, sampleBuffer, &vbrAcc, &vbrUpd);
4e8f14f
+    guint status = mpc_decoder_decode(&decoder, sampleBuffer, &vbrAcc, &vbrUpd);
62a66f2
+    if (status == (guint)(-1)) {
62a66f2
+        return status;
62a66f2
+    }
4e8f14f
     copyBuffer(sampleBuffer, xmmsBuffer, status);
4e8f14f
 
4e8f14f
     if (pluginConfig.dynamicBitrate)
62a66f2
@@ -911,12 +911,12 @@
1ef2bed
 
1ef2bed
 inline static void lockAcquire()
1ef2bed
 {
1ef2bed
-    g_static_mutex_lock(&threadMutex);
1ef2bed
+    /*    g_static_mutex_lock(&threadMutex);  */
1ef2bed
 }
1ef2bed
 
1ef2bed
 inline static void lockRelease()
1ef2bed
 {
1ef2bed
-    g_static_mutex_unlock(&threadMutex);
1ef2bed
+    /*    g_static_mutex_unlock(&threadMutex);  */
1ef2bed
 }
1ef2bed
 
1ef2bed
 inline static bool isAlive()
4e8f14f
diff -Nur audacious-plugins-fedora-2.1-orig/src/musepack/libmpc.h audacious-plugins-fedora-2.1-musepack/src/musepack/libmpc.h
4e8f14f
--- audacious-plugins-fedora-2.1-orig/src/musepack/libmpc.h	2009-07-07 00:40:36.000000000 +0200
62a66f2
+++ audacious-plugins-fedora-2.1-musepack/src/musepack/libmpc.h	2009-11-17 22:43:37.323774131 +0100
4e8f14f
@@ -123,7 +123,7 @@
4e8f14f
 static void       lockAcquire();
4e8f14f
 static void       lockRelease();
4e8f14f
 static void*      decodeStream(InputPlayback*);
4e8f14f
-static int        processBuffer(InputPlayback*, MPC_SAMPLE_FORMAT*, char*, mpc_decoder&);
4e8f14f
+static guint      processBuffer(InputPlayback*, MPC_SAMPLE_FORMAT*, char*, mpc_decoder&);
4e8f14f
 //static void*      endThread(char*, FILE*, bool);
4e8f14f
 static bool       isAlive();
4e8f14f
 static void       setAlive(bool);