commit 6b0b4f604165a9c98c4609bea55df2da74b5b72f
Author: leszek <leszek@koltunski.pl>
Date:   Thu Jun 15 22:04:17 2017 +0100

    Fixes for removing effects.

diff --git a/src/main/java/org/distorted/library/main/DistortedEffects.java b/src/main/java/org/distorted/library/main/DistortedEffects.java
index 058f2aa..2b8dbd5 100644
--- a/src/main/java/org/distorted/library/main/DistortedEffects.java
+++ b/src/main/java/org/distorted/library/main/DistortedEffects.java
@@ -464,7 +464,6 @@ public class DistortedEffects implements DistortedSlave
  */
   public DistortedEffects()
     {
-    android.util.Log.e("distEffects", "constr1");
     mID = ++mNextID;
     initializeEffectLists(this,0);
     }
@@ -481,7 +480,6 @@ public class DistortedEffects implements DistortedSlave
  */
   public DistortedEffects(DistortedEffects dc, int flags)
     {
-    android.util.Log.e("distEffects", "constr2");
     mID = ++mNextID;
     initializeEffectLists(dc,flags);
     }
diff --git a/src/main/java/org/distorted/library/main/EffectQueue.java b/src/main/java/org/distorted/library/main/EffectQueue.java
index 117ff38..ff1bcd2 100644
--- a/src/main/java/org/distorted/library/main/EffectQueue.java
+++ b/src/main/java/org/distorted/library/main/EffectQueue.java
@@ -35,7 +35,8 @@ abstract class EffectQueue implements DistortedSlave
   private static final int DETACH = 1;
   private static final int DETALL = 2;
 
-  protected int mNumEffects;
+  protected int mNumEffects;      // 'ToBe' will be more than mNumEffects if doWork() hasn't
+  protected int mNumEffectsToBe;  // added them yet (or less if it hasn't removed some yet)
   protected float[] mUniforms;
   protected long[] mCurrentDuration;
   protected Effect[] mEffects;
@@ -48,22 +49,18 @@ abstract class EffectQueue implements DistortedSlave
 
   private ArrayList<DistortedNode> mNodes = null;
   private long mID;
-  private int mNumEffectsToBe; // this will be more than mNumEffects if doWork hasn't really added them yet
   private static boolean mCreated;
   private int mIndex;
-  private int mNumUniforms;
 
   private class Job
     {
     int type;
-    int index;
     boolean notify;
     Effect effect;
 
-    Job(int t, int i, boolean n, Effect e)
+    Job(int t, boolean n, Effect e)
       {
       type  = t;
-      index = i;
       notify= n;
       effect= e;
       }
@@ -85,13 +82,12 @@ abstract class EffectQueue implements DistortedSlave
     mNumEffectsToBe     = 0;
     mDistortedEffectsID = id;
     mIndex              = index;
-    mNumUniforms        = numUniforms;
 
     int max = mMax[mIndex];
 
     if( max>0 )
       {
-      mUniforms        = new float[mNumUniforms*max];
+      mUniforms        = new float[numUniforms*max];
       mCurrentDuration = new long[max];
       mEffects         = new Effect[max];
       mName            = new int[max];
@@ -198,9 +194,6 @@ abstract class EffectQueue implements DistortedSlave
       mEffects[j]         = mEffects[j+1];
       mCurrentDuration[j] = mCurrentDuration[j+1];
       mName[j]            = mName[j+1];
-
-      for(int k=0; k<mNumUniforms; k++)
-        mUniforms[mNumUniforms*j+k] = mUniforms[mNumUniforms*(j+1)+k];
       }
 
     mEffects[mNumEffects] = null;
@@ -213,18 +206,24 @@ abstract class EffectQueue implements DistortedSlave
 
   synchronized int removeByName(EffectName name)
     {
+    int ret = 0;
+
     for(int i=0; i<mNumEffects; i++)
       {
       if( mEffects[i].getName() == name )
         {
-        mJobs.add(new Job(DETACH,i,true,null));
-        DistortedMaster.newSlave(this);
-        mNumEffectsToBe--;
-        return 1;
+        mJobs.add(new Job(DETACH,true,mEffects[i]));
+        ret++;
         }
       }
 
-    return 0;
+    if( ret>0 )
+      {
+      DistortedMaster.newSlave(this);
+      mNumEffectsToBe-=ret;
+      }
+
+    return ret;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -235,7 +234,7 @@ abstract class EffectQueue implements DistortedSlave
       {
       if( mEffects[i].getID() == id )
         {
-        mJobs.add(new Job(DETACH,i,true,null));
+        mJobs.add(new Job(DETACH,true,mEffects[i]));
         DistortedMaster.newSlave(this);
         mNumEffectsToBe--;
         return 1;
@@ -253,7 +252,7 @@ abstract class EffectQueue implements DistortedSlave
       {
       if( mEffects[i]==effect )
         {
-        mJobs.add(new Job(DETACH,i,true,null));
+        mJobs.add(new Job(DETACH,true,mEffects[i]));
         DistortedMaster.newSlave(this);
         mNumEffectsToBe--;
         return 1;
@@ -269,7 +268,7 @@ abstract class EffectQueue implements DistortedSlave
 
   synchronized int abortAll(boolean notify)
     {
-    mJobs.add(new Job(DETALL,0,notify,null));
+    mJobs.add(new Job(DETALL,notify,null));
     DistortedMaster.newSlave(this);
     mNumEffectsToBe = 0;
     return mNumEffects;
@@ -284,7 +283,7 @@ abstract class EffectQueue implements DistortedSlave
       //android.util.Log.e("queue", "scheduling future add of "+effect.getName().name()+" to "+mNumEffectsToBe+" id="+effect.getID());
       //android.util.Log.e("queue", "queue id="+mDistortedEffectsID);
 
-      mJobs.add(new Job(ATTACH,mNumEffectsToBe,false,effect));
+      mJobs.add(new Job(ATTACH,false,effect));
       DistortedMaster.newSlave(this);
       mNumEffectsToBe++;
       return true;
@@ -312,15 +311,30 @@ abstract class EffectQueue implements DistortedSlave
 
       switch(job.type)
         {
-        case ATTACH: android.util.Log.e("queue", "DistortedEffects ID: "+mDistortedEffectsID+" bank:"+job.index+
-                                        " attaching effectID="+job.effect.getID()+" ("+job.effect.getName().name()+")");
+        case ATTACH: //android.util.Log.e("queue", "DisEffects ID: "+mDistortedEffectsID+" bank:"+mNumEffects+
+                     //                   " attaching effectID="+job.effect.getID()+" ("+job.effect.getName().name()+")");
 
-                     mCurrentDuration[job.index] = 0;
-                     mEffects[job.index] = job.effect;
-                     mName[job.index] = job.effect.getName().ordinal();
+                     mCurrentDuration[mNumEffects] = 0;
+                     mEffects[mNumEffects] = job.effect;
+                     mName[mNumEffects] = job.effect.getName().ordinal();
                      mNumEffects++;
+                     //android.util.Log.d("queue", "DisEffects ID: "+mDistortedEffectsID+
+                     //        " success attaching, num to be:"+mNumEffectsToBe+" num:"+mNumEffects);
+
                      break;
-        case DETACH: remove(job.index);
+        case DETACH: //android.util.Log.e("queue", "DisEffects ID: "+mDistortedEffectsID+" detaching effect "+
+                     //                             job.effect.getID());
+                     for(int j=0; j<mNumEffects; j++)
+                       {
+                       if (mEffects[j] == job.effect)
+                         {
+                         remove(j);
+                         //android.util.Log.d("queue", "DisEffects ID: "+mDistortedEffectsID+
+                         //    " success detaching, num to be:"+mNumEffectsToBe+" num:"+mNumEffects);
+
+                         break;
+                         }
+                       }
                      break;
         case DETALL: for(int j=0; j<mNumEffects; j++ )
                        {
diff --git a/src/main/java/org/distorted/library/main/EffectQueueFragment.java b/src/main/java/org/distorted/library/main/EffectQueueFragment.java
index 74b57a7..230a5b5 100644
--- a/src/main/java/org/distorted/library/main/EffectQueueFragment.java
+++ b/src/main/java/org/distorted/library/main/EffectQueueFragment.java
@@ -71,6 +71,7 @@ class EffectQueueFragment extends EffectQueue
         if( mEffects[i].isUnity( mUniforms, NUM_UNIFORMS*i) )
           {
           remove(i--);
+          mNumEffectsToBe--;
           continue;
           }
         }
diff --git a/src/main/java/org/distorted/library/main/EffectQueueMatrix.java b/src/main/java/org/distorted/library/main/EffectQueueMatrix.java
index 5d04257..79d3c50 100644
--- a/src/main/java/org/distorted/library/main/EffectQueueMatrix.java
+++ b/src/main/java/org/distorted/library/main/EffectQueueMatrix.java
@@ -302,7 +302,10 @@ class EffectQueueMatrix extends EffectQueue
           EffectMessageSender.newMessage( mListeners.get(j), EffectMessage.EFFECT_FINISHED, mEffects[i].getID(), mDistortedEffectsID);
 
         if( mEffects[i].isUnity( mUniforms, NUM_UNIFORMS*i) )
+          {
           remove(i--);
+          mNumEffectsToBe--;
+          }
         }
       }
      
diff --git a/src/main/java/org/distorted/library/main/EffectQueuePostprocess.java b/src/main/java/org/distorted/library/main/EffectQueuePostprocess.java
index fdcda91..4248d08 100644
--- a/src/main/java/org/distorted/library/main/EffectQueuePostprocess.java
+++ b/src/main/java/org/distorted/library/main/EffectQueuePostprocess.java
@@ -192,6 +192,7 @@ class EffectQueuePostprocess extends EffectQueue
         if( mEffects[i].isUnity( mUniforms, NUM_UNIFORMS*i) )
           {
           remove(i--);
+          mNumEffectsToBe--;
           continue;
           }
         }
diff --git a/src/main/java/org/distorted/library/main/EffectQueueVertex.java b/src/main/java/org/distorted/library/main/EffectQueueVertex.java
index 39ca632..0c34ca2 100644
--- a/src/main/java/org/distorted/library/main/EffectQueueVertex.java
+++ b/src/main/java/org/distorted/library/main/EffectQueueVertex.java
@@ -71,6 +71,7 @@ class EffectQueueVertex extends EffectQueue
         if( mEffects[i].isUnity( mUniforms, NUM_UNIFORMS*i) )
           {
           remove(i--);
+          mNumEffectsToBe--;
           continue;
           }
         }
