Here's the unified version:


--- base/src/playlist.cpp.orig  Wed Jun 27 13:05:59 2001
+++ base/src/playlist.cpp       Wed Jun 27 13:11:29 2001
@@ -429,44 +429,24 @@
         toBeShuffled = &m_shuffleList;
 
     int max = toBeShuffled->size();
-    vector<PlaylistItem *> tempShuffled;
+    vector<PlaylistItem *> tempShuffled (max, (PlaylistItem*)0);
 
     srand((unsigned int)time(NULL));
-    
-    int i;
-    vector<bool> usedList;
-    for (i = 0; i < max; i++)
-    {
-        usedList.push_back(false);
-    }
-
-    bool used = true;
+   
     int  index = 0;
-    int  lastindex = 0;
-
-    for (i = 0; i < max; i++) 
+    for (int i = 0; i < max; i++)
     {
-        while (used)
-        {
-            index = (int)((double)rand() / (RAND_MAX + 1.0) * max);
-            if (usedList[index] == false)
-                used = false;
-            if (max - i > 50 && abs(index - lastindex) < 10)
-                used = true;
-        } 
-        usedList[index] = true;
-        PlaylistItem *dupe = (*toBeShuffled)[index];
-        tempShuffled.push_back(dupe);
-        used = true;
-        lastindex = index;
+       index = (int)((double)rand() / (RAND_MAX + 1.0) * max);
+       do {
+                index ++;
+                if (index == max) index=0;
+       } while (tempShuffled[index]);
+       tempShuffled[index] = (*toBeShuffled)[i];
     }
-
-    toBeShuffled->erase(toBeShuffled->begin(), toBeShuffled->end());
-    vector<PlaylistItem *>::iterator iter = tempShuffled.begin();
-    for (; iter != tempShuffled.end(); iter++) 
-        toBeShuffled->push_back(*iter);
+    (*toBeShuffled).swap (tempShuffled);
 }
 
+
 Error PlaylistManager::SetCurrentItem(PlaylistItem* item)
 {
     return SetCurrentIndex(IndexOf(item));
@@ -493,8 +473,9 @@
 {
    m_mutex.Acquire();
    index = CheckIndex(index);
-   if(m_shuffle)
-      index = InternalIndexOf(&m_shuffleList, ItemAt(index));
+//    index is always the internal index (never an index to the shuffle list).
+//   if(m_shuffle)
+//      index = InternalIndexOf(&m_shuffleList, ItemAt(index));
    InternalSetCurrentIndex(index);
    m_mutex.Release();
    return kError_NoErr;
@@ -537,19 +518,15 @@
         {
             index++;
 
-            if( (index >= count) && 
-                (m_repeatMode == kPlaylistMode_RepeatAll || userAction))
+            if( (index >= count) )
             {
-                index = 0;
-
-                if(m_shuffle)
-                {
-                    ShuffleIt();
-                }
-            }
-            else if(index >= count)
-            {
-                index = m_current;
+               if(m_repeatMode == kPlaylistMode_RepeatAll || userAction)
+               {
+                  index = 0;
+                  if (m_shuffle) ShuffleIt();
+               }
+               else
+                  index = m_current;
             }
         }
 
@@ -576,19 +553,16 @@
     {
         if(!(kPlaylistMode_RepeatOne == m_repeatMode) || userAction)
         {
-            if( (index == 0) && 
-                (m_repeatMode == kPlaylistMode_RepeatAll || userAction))
+            index--;
+            if (index < 0)
             {
-                index = count - 1;
-
-                if(m_shuffle)
+                if  (m_repeatMode == kPlaylistMode_RepeatAll || userAction)
                 {
-                    ShuffleIt();
+                    index = count - 1;
+                    if(m_shuffle)  ShuffleIt();
                 }
-            }
-            else if(index != 0)
-            {
-                index--;
+                else
+                   index = 0;
             }
         }
 

-- 
Kristian G. Kvilekval
email:[EMAIL PROTECTED] office:(805)893-4178 http://www.cs.ucsb.edu/~kris
_______________________________________________
[EMAIL PROTECTED]
http://www.freeamp.org/mailman/listinfo/freeamp-dev

Reply via email to