traverso-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Traverso-commit] traverso CMakeLists.txt src/commands/Import.cpp...


From: Remon Sijrier
Subject: [Traverso-commit] traverso CMakeLists.txt src/commands/Import.cpp...
Date: Mon, 19 Nov 2007 11:18:55 +0000

CVSROOT:        /sources/traverso
Module name:    traverso
Changes by:     Remon Sijrier <r_sijrier>       07/11/19 11:18:55

Modified files:
        .              : CMakeLists.txt 
        src/commands   : Import.cpp 
        src/common     : APILinkedList.h AudioProcessingItem.h 
        src/core       : AudioClip.cpp AudioClip.h CMakeLists.txt 
                         core.pro Curve.cpp Curve.h CurveNode.h 
                         FadeCurve.cpp FadeCurve.h Song.cpp Song.h 
                         Track.cpp Track.h 
        src/engine     : AudioDevice.cpp Client.h 
        src/plugins/native: GainEnvelope.cpp GainEnvelope.h 
        src/traverso/dialogs: BusSelectorDialog.cpp 
                              InsertSilenceDialog.cpp 
        src/traverso   : Interface.cpp 
        src/traverso/songcanvas: CurveView.cpp FadeView.cpp SongView.cpp 
                                 TrackView.cpp 
        src/traverso/widgets: InfoWidgets.cpp 

Log message:
        More work on AudioProcessingItemLinkedList (APILinkedList):
        * items can be added and sorted with one call add_and_sort();
        * added a m_last node for faster retrieval of last node in the list
        * added debug function to detect if last node is calculated correctly
        * CurveNode is a APILinkedListNode now, modified Curve to work with it 
correctly
        This makes real time behavior of adding/removing nodes from a Curve 
much better, about 5 times faster then using a QList.
        * AudioClip::process() calculated the wrong startposition for it's gain 
curve, fixed now
        * pass an audio_sample_t** buffer to Curve::process() so when channels 
> 1 the get_vector() only needs to be calculated one time for a Curve for one 
AudioDevice::process cycle!!
        * Updated all other classes that were effected by this change.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/CMakeLists.txt?cvsroot=traverso&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/traverso/src/commands/Import.cpp?cvsroot=traverso&r1=1.30&r2=1.31
http://cvs.savannah.gnu.org/viewcvs/traverso/src/common/APILinkedList.h?cvsroot=traverso&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/traverso/src/common/AudioProcessingItem.h?cvsroot=traverso&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AudioClip.cpp?cvsroot=traverso&r1=1.149&r2=1.150
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AudioClip.h?cvsroot=traverso&r1=1.67&r2=1.68
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/CMakeLists.txt?cvsroot=traverso&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/core.pro?cvsroot=traverso&r1=1.46&r2=1.47
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Curve.cpp?cvsroot=traverso&r1=1.45&r2=1.46
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Curve.h?cvsroot=traverso&r1=1.24&r2=1.25
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/CurveNode.h?cvsroot=traverso&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/FadeCurve.cpp?cvsroot=traverso&r1=1.30&r2=1.31
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/FadeCurve.h?cvsroot=traverso&r1=1.14&r2=1.15
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Song.cpp?cvsroot=traverso&r1=1.153&r2=1.154
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Song.h?cvsroot=traverso&r1=1.72&r2=1.73
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Track.cpp?cvsroot=traverso&r1=1.73&r2=1.74
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Track.h?cvsroot=traverso&r1=1.34&r2=1.35
http://cvs.savannah.gnu.org/viewcvs/traverso/src/engine/AudioDevice.cpp?cvsroot=traverso&r1=1.47&r2=1.48
http://cvs.savannah.gnu.org/viewcvs/traverso/src/engine/Client.h?cvsroot=traverso&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/traverso/src/plugins/native/GainEnvelope.cpp?cvsroot=traverso&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/traverso/src/plugins/native/GainEnvelope.h?cvsroot=traverso&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/dialogs/BusSelectorDialog.cpp?cvsroot=traverso&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/dialogs/InsertSilenceDialog.cpp?cvsroot=traverso&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/Interface.cpp?cvsroot=traverso&r1=1.107&r2=1.108
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/songcanvas/CurveView.cpp?cvsroot=traverso&r1=1.65&r2=1.66
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/songcanvas/FadeView.cpp?cvsroot=traverso&r1=1.20&r2=1.21
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/songcanvas/SongView.cpp?cvsroot=traverso&r1=1.82&r2=1.83
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/songcanvas/TrackView.cpp?cvsroot=traverso&r1=1.36&r2=1.37
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/widgets/InfoWidgets.cpp?cvsroot=traverso&r1=1.46&r2=1.47

Patches:
Index: CMakeLists.txt
===================================================================
RCS file: /sources/traverso/traverso/CMakeLists.txt,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- CMakeLists.txt      9 Nov 2007 14:08:47 -0000       1.12
+++ CMakeLists.txt      19 Nov 2007 11:18:52 -0000      1.13
@@ -21,11 +21,11 @@
 
 OPTION(WANT_JACK       "Include Jack (Jack Audio Connection Kit) support" ON)
 OPTION(WANT_ALSA       "Include ALSA (Advanced Linux Sound Architecture) 
support" ON)
-OPTION(WANT_PORTAUDIO  "Include PortAudio support (Driver support for Mac OS X 
and Windows" ON)
+OPTION(WANT_PORTAUDIO  "Include PortAudio support (Driver support for Mac OS X 
and Windows" OFF)
 OPTION(WANT_LV2                "Include LV2 Plugin support" ON)
-OPTION(USE_SYSTEM_SLV2_LIBRARY "Use system installed slv2 library. If not 
found, the internal one is compiled and used which needs the rdf development 
headers" ON)
+OPTION(USE_SYSTEM_SLV2_LIBRARY "Use system installed slv2 library. If not 
found, the internal one is compiled and used which needs the rdf development 
headers" OFF)
 OPTION(WANT_MP3_DECODE "Include mp3 decoding support, for playing mp3 files" 
ON)
-OPTION(WANT_MP3_ENCODE "Include mp3 encoding support, for creating mp3 files" 
ON)
+OPTION(WANT_MP3_ENCODE "Include mp3 encoding support, for creating mp3 files" 
OFF)
 OPTION(WANT_PCH        "Use precompiled headers" OFF)
 OPTION(WANT_DEBUG      "Debug build" OFF)
 OPTION(WANT_OPENGL     "Build Traverso with OpenGL support" ON)

Index: src/commands/Import.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/commands/Import.cpp,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -b -r1.30 -r1.31
--- src/commands/Import.cpp     22 Oct 2007 18:44:00 -0000      1.30
+++ src/commands/Import.cpp     19 Nov 2007 11:18:52 -0000      1.31
@@ -23,7 +23,6 @@
 
 #include <QFileDialog>
 #include "ReadSource.h"
-#include "AudioClipList.h"
 #include "Import.h"
 #include "Utils.h"
 
@@ -146,7 +145,7 @@
        
        TimeRef startLocation;
        if (!m_hasPosition) {
-               if (AudioClip* lastClip = m_track->get_cliplist().get_last()) {
+               if (AudioClip* lastClip = 
(AudioClip*)m_track->get_cliplist().last()) {
                        startLocation = lastClip->get_track_end_location();
                }
        } else {

Index: src/common/APILinkedList.h
===================================================================
RCS file: /sources/traverso/traverso/src/common/APILinkedList.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- src/common/APILinkedList.h  12 Nov 2007 18:50:48 -0000      1.1
+++ src/common/APILinkedList.h  19 Nov 2007 11:18:53 -0000      1.2
@@ -24,72 +24,107 @@
 
 #include <QDebug>
 
-#include "AudioProcessingItem.h"
+#define apill_foreach(variable, upcasttype, apillist) \
+       for(APILinkedListNode* apillnode = apillist.first(); apillnode!=0; 
apillnode = apillnode->next) \
+               if (variable = (upcasttype*)apillnode) \
+
+
+class APILinkedListNode
+{
+public:
+       APILinkedListNode () : next(0) {}
+       virtual ~APILinkedListNode () {}
+       APILinkedListNode* next;
+       virtual bool is_smaller_then(APILinkedListNode* node) = 0;
+};
 
 class APILinkedList
 {
 public:
-       APILinkedList() : m_size(0), m_head(0) {}
+       APILinkedList() : m_size(0), m_head(0), m_last(0) {}
        ~APILinkedList() {}
        
-       void append(AudioProcessingItem* item);
-       void prepend(AudioProcessingItem * item);
-       void add_after(AudioProcessingItem* after, AudioProcessingItem* item);
-       int remove(AudioProcessingItem* item);
+       void append(APILinkedListNode* item);
+       void add_and_sort(APILinkedListNode* node);
+       void prepend(APILinkedListNode * item);
+       int remove(APILinkedListNode* item);
        
-       AudioProcessingItem* begin() {return m_head;}
-       AudioProcessingItem* get_next(AudioProcessingItem* item) {return 
item->next;}
+       APILinkedListNode* first() const {return m_head;}
+       APILinkedListNode* last() const {return m_last;}
        int size() const {return m_size;}
-
+       void clear() {m_head = 0; m_last = 0; m_size=0;}
+       bool isEmpty() {return m_size == 0 ? true : false;}
+       int indexOf(APILinkedListNode* node);
+       APILinkedListNode* at(int i);
                        
 private:
        int m_size;
-       AudioProcessingItem* m_head;
+       APILinkedListNode* m_head;
+       APILinkedListNode* m_last;
+       APILinkedListNode* slow_last() const;
+
+       void insert(APILinkedListNode* after, APILinkedListNode* item);
 };
 
-inline void APILinkedList::prepend(AudioProcessingItem * item)
+// T = O(1)
+inline void APILinkedList::prepend(APILinkedListNode * item)
 {
        item->next = m_head;
        m_head = item;
+       if (!m_size) {
+               m_last = item;
+               m_last->next = 0;
+       }
+       m_size++;
+       Q_ASSERT(m_last == slow_last());
 }
 
-inline void APILinkedList::append(AudioProcessingItem * item)
+// T = O(1)
+inline void APILinkedList::append(APILinkedListNode * item)
 {
        if(m_head) {
-               AudioProcessingItem *q,*temp;
-               q = m_head;
-               while( q->next != 0 ) {
-                       q = q->next;
-               }
-
-               temp = item;
-               temp->next = 0;
-               q->next = temp;
+               m_last->next = item;
+               m_last = item;
        } else {
                m_head = item;
-               m_head->next = 0;
+               m_last = item;
        }
+       
+       m_last->next = 0;
        m_size++;
+       
+       Q_ASSERT(m_last == slow_last());
 }
 
-inline int APILinkedList::remove(AudioProcessingItem * item)
+// T = O(n)
+inline int APILinkedList::remove(APILinkedListNode * item)
 {
-       AudioProcessingItem *q,*r;
+       Q_ASSERT(item);
+       
+       APILinkedListNode *q,*r;
        q = m_head;
-       if(q == item)
-       {
+       if(q == item) {
                m_head = q->next;
                m_size--;
+               if (m_size == 0) {
+                       m_last = 0;
+               }
+               Q_ASSERT(m_last == slow_last());
                return 1;
        }
 
        r = q;
-       while( q!=0 )
-       {
-               if( q == item )
-               {
+       q = q->next;
+       
+       while( q!=0 ) {
+               if( q == item ) {
                        r->next = q->next;
                        m_size--;
+                       if (!q->next) {
+                               m_last = r;
+                               m_last->next = 0;
+                       }
+                       Q_ASSERT(m_last == slow_last());
                        return 1;
                }
 
@@ -100,16 +135,98 @@
        return 0;
 }
 
-inline void APILinkedList::add_after(AudioProcessingItem* after, 
AudioProcessingItem* item)
+// T = O(1)
+inline void APILinkedList::insert(APILinkedListNode* after, APILinkedListNode* 
item)
 {
        Q_ASSERT(after);
        Q_ASSERT(item);
        
-       AudioProcessingItem* temp;
+       APILinkedListNode* temp;
 
        temp = item;
        temp->next = after->next;
        after->next = temp;
+       
+       if (after == m_last) {
+               m_last = item;
+               m_last->next = 0;
+       }
+       m_size++;
+       
+       Q_ASSERT(m_last == slow_last());
+}
+
+// T = O(n)
+inline APILinkedListNode * APILinkedList::slow_last() const
+{
+       if (!m_head) {
+               return 0;
+       }
+       
+       APILinkedListNode* last = m_head;
+       
+       while(last->next) {
+               last = last->next;
+       }
+       
+       return last;
+}
+
+// T = O(n)
+inline void APILinkedList::add_and_sort(APILinkedListNode * node)
+{
+       if (!m_size) {
+               append(node);
+       } else {
+               APILinkedListNode* q = m_head;
+               if (node->is_smaller_then(q)) {
+                       prepend(node);
+               } else {
+                       APILinkedListNode* afternode = q;
+                       while (q) {
+                               if (!node->is_smaller_then(q)) {
+                                       afternode = q;
+                               } else {
+                                       break;
+                               }
+                               q = q->next;
+                       }
+                       insert(afternode, node);
+               }
+       }
+}
+
+inline int APILinkedList::indexOf(APILinkedListNode* node)
+{
+       Q_ASSERT(node);
+       int index = 0;
+       
+       APILinkedListNode* q = m_head;
+       while (q) {
+               if (q == node) {
+                       return index;
+               }
+               ++index;
+               q = q->next;
+       }
+       return -1;
+}
+
+inline APILinkedListNode * APILinkedList::at(int i)
+{
+       Q_ASSERT(i >= 0);
+       Q_ASSERT(i < m_size);
+       
+       int loopcounter = 0;
+       APILinkedListNode* q = m_head;
+       while (q) {
+               if (loopcounter == i) {
+                       return q;
+               }
+               q = q->next;
+               ++loopcounter;
+       }
+       return 0;
 }
 
 #endif

Index: src/common/AudioProcessingItem.h
===================================================================
RCS file: /sources/traverso/traverso/src/common/AudioProcessingItem.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- src/common/AudioProcessingItem.h    12 Nov 2007 18:50:48 -0000      1.1
+++ src/common/AudioProcessingItem.h    19 Nov 2007 11:18:53 -0000      1.2
@@ -22,19 +22,19 @@
 #ifndef AUDIO_PROCESSING_ITEM_H
 #define AUDIO_PROCESSING_ITEM_H
 
+#include "APILinkedList.h"
+
 class GainEnvelope;
 class PluginChain;
 
-class AudioProcessingItem 
+class AudioProcessingItem : public APILinkedListNode
 {
 public:
        AudioProcessingItem () {}
        ~AudioProcessingItem () {}
        
        bool is_muted() const {return m_isMuted;}
-
-       
-       AudioProcessingItem *next;
+       virtual bool is_smaller_then(APILinkedListNode* node) = 0;
        
 protected:
        GainEnvelope* m_fader;

Index: src/core/AudioClip.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/AudioClip.cpp,v
retrieving revision 1.149
retrieving revision 1.150
diff -u -b -r1.149 -r1.150
--- src/core/AudioClip.cpp      12 Nov 2007 18:52:13 -0000      1.149
+++ src/core/AudioClip.cpp      19 Nov 2007 11:18:53 -0000      1.150
@@ -463,13 +463,12 @@
        }
        
 
-       
-       for (int i=0; i<m_fades.size(); ++i) {
-               m_fades.at(i)->process(mixdown, read_frames, 
bus->get_channel_count());
+       apill_foreach(FadeCurve* fade, FadeCurve, m_fades) {
+               fade->process(mixdown, read_frames, bus->get_channel_count());
        }
        
-       TimeRef startlocation = transportLocation - m_trackStartLocation - 
m_sourceStartLocation;
-       m_fader->process_gain(mixdown, startlocation, upperRange, read_frames, 
bus->get_channel_count());
+       TimeRef endlocation = mix_pos + TimeRef(read_frames, get_rate());
+       m_fader->process_gain(mixdown, mix_pos, endlocation, read_frames, 
bus->get_channel_count());
        
        return 1;
 }
@@ -900,7 +899,7 @@
                fadeOut = 0;
        }
        
-       m_fades.removeAll(fade);
+       m_fades.remove(fade);
 }
 
 void AudioClip::create_fade_in( )

Index: src/core/AudioClip.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/AudioClip.h,v
retrieving revision 1.67
retrieving revision 1.68
diff -u -b -r1.67 -r1.68
--- src/core/AudioClip.h        12 Nov 2007 18:52:13 -0000      1.67
+++ src/core/AudioClip.h        19 Nov 2007 11:18:53 -0000      1.68
@@ -111,23 +111,16 @@
        bool is_locked() const {return m_isLocked;}
        bool has_song() const;
        bool is_readsource_invalid() const {return !m_isReadSourceValid;}
-       int recording_state() const;
+       bool is_smaller_then(APILinkedListNode* node) {return 
((AudioClip*)node)->get_track_start_location() < get_track_start_location();}
 
-       static bool smaller(const AudioClip* left, const AudioClip* right )
-       {
-               return left->get_track_start_location() < 
right->get_track_start_location();
-       }
-       static bool greater(const AudioClip* left, const AudioClip* right )
-       {
-               return left->get_track_start_location() > 
right->get_track_start_location();
-       }
+       int recording_state() const;
 
 private:
        Track*                  m_track;
        Song*                   m_song;
        ReadSource*             m_readSource;
        WriteSource*            m_recorder;
-       QList<FadeCurve* >      m_fades;
+       APILinkedList           m_fades;
        Peak*                   m_peak;
        AudioBus*               m_captureBus;
        FadeCurve*              fadeIn;

Index: src/core/CMakeLists.txt
===================================================================
RCS file: /sources/traverso/traverso/src/core/CMakeLists.txt,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- src/core/CMakeLists.txt     7 Nov 2007 22:02:47 -0000       1.7
+++ src/core/CMakeLists.txt     19 Nov 2007 11:18:53 -0000      1.8
@@ -18,7 +18,6 @@
 ${CMAKE_SOURCE_DIR}/src/common/RingBuffer.cpp
 ${CMAKE_SOURCE_DIR}/src/common/Resampler.cpp
 AudioClip.cpp
-AudioClipList.cpp
 AudioClipManager.cpp
 AudioSource.cpp
 Command.cpp

Index: src/core/core.pro
===================================================================
RCS file: /sources/traverso/traverso/src/core/core.pro,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -b -r1.46 -r1.47
--- src/core/core.pro   7 Nov 2007 22:02:47 -0000       1.46
+++ src/core/core.pro   19 Nov 2007 11:18:53 -0000      1.47
@@ -28,7 +28,6 @@
        ../common/RingBuffer.cpp \
        ../common/Resampler.cpp \
        AudioClip.cpp \
-       AudioClipList.cpp \
        AudioClipManager.cpp \
        AudioSource.cpp \
        Command.cpp \
@@ -68,7 +67,6 @@
        ../common/RingBufferNPT.h \
        ../common/Resampler.h \
        AudioClip.h \
-       AudioClipList.h \
        AudioClipManager.h \
        AudioSource.h \
        Command.h \

Index: src/core/Curve.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/Curve.cpp,v
retrieving revision 1.45
retrieving revision 1.46
diff -u -b -r1.45 -r1.46
--- src/core/Curve.cpp  5 Nov 2007 15:49:30 -0000       1.45
+++ src/core/Curve.cpp  19 Nov 2007 11:18:53 -0000      1.46
@@ -41,6 +41,7 @@
 #include <Command.h>
 #include <CommandGroup.h>
 #include "Mixer.h"
+#include "Information.h"
 
 // Always put me below _all_ includes, this is needed
 // in case we run with memory leak detection enabled!
@@ -114,8 +115,11 @@
 
 Curve::~Curve()
 {
-       foreach(CurveNode* node, m_nodes) {
-               delete node;
+       APILinkedListNode* node = m_nodes.first();
+       while (node) {
+               CurveNode* q = (CurveNode*)node;
+               node = node->next;
+               delete q;
        }
 }
 
@@ -123,11 +127,7 @@
 {
        m_changed = true;
        m_lookup_cache.left = -1;
-       m_lookup_cache.range.first = m_nodes.end();
-
        m_defaultValue = 1.0f;
-       m_defaultInitialValue = 1.0f;   
-       
        m_song = 0;
        
        connect(this, SIGNAL(nodePositionChanged()), this, SLOT(set_changed()));
@@ -141,8 +141,7 @@
        
        QStringList nodesList;
        
-       for (int i=0; i < m_nodes.size(); ++i) {
-               CurveNode* cn = m_nodes.at(i);
+       apill_foreach(CurveNode* cn, CurveNode, m_nodes) {
                nodesList << QString::number(cn->when, 'g', 
24).append(",").append(QString::number(cn->value));
        }
        
@@ -181,26 +180,39 @@
        return 1;
 }
 
-int Curve::process(audio_sample_t * buffer, const TimeRef & startlocation, 
const TimeRef& endlocation, nframes_t nframes)
+int Curve::process(
+       audio_sample_t** buffer,
+       const TimeRef& startlocation,
+       const TimeRef& endlocation,
+       nframes_t nframes,
+       uint channels,
+       float makeupgain
+       )
 {
        if (m_nodes.isEmpty()) {
                return 0;
        }
        
+       CurveNode* lastnode = (CurveNode*)m_nodes.last();
+       
+       float gain = lastnode->value * makeupgain;
+       
        if (endlocation > qint64(get_range())) {
-               if (m_nodes.last()->value == 1.0) {
+               if (gain == 1.0) {
                        return 0;
                }
-               Mixer::apply_gain_to_buffer(buffer, nframes, 
m_nodes.last()->value);
+               for (uint chan=0; chan<channels; ++chan) {
+                       Mixer::apply_gain_to_buffer(buffer[chan], nframes, 
gain);
+               }
                return 1;
        }
        
-       audio_sample_t mixdown[nframes];
-       
-       get_vector(startlocation.universal_frame(), 
endlocation.universal_frame(), mixdown, nframes);
+       get_vector(startlocation.universal_frame(), 
endlocation.universal_frame(), m_song->mixdown, nframes);
        
+       for (uint chan=0; chan<channels; ++chan) {
        for (nframes_t n = 0; n < nframes; ++n) {
-               buffer[n] *= mixdown[n];
+                       buffer[chan][n] *= (m_song->mixdown[n] * gain);
+               }
        }
        
        return 1;
@@ -228,9 +240,12 @@
                uint32_t i;
                QList<CurveNode* >::iterator xx;
 
-               for (i = 0, xx = m_nodes.begin(); xx != m_nodes.end(); ++xx, 
++i) {
-                       x[i] = (double) (*xx)->when;
-                       y[i] = (double) (*xx)->value;
+               CurveNode* cn;
+               i = 0;
+               for(APILinkedListNode* node = m_nodes.first(); node!=0; node = 
node->next, ++i) {
+                       cn = (CurveNode*)node;
+                       x[i] = cn->when;
+                       y[i] = cn->value;
                }
 
                double lp0, lp1, fpone;
@@ -246,9 +261,10 @@
 
                double fplast = 0;
 
-               for (i = 0, xx = m_nodes.begin(); xx != m_nodes.end(); ++xx, 
++i) {
+               i = 0;
+               for(APILinkedListNode* node = m_nodes.first(); node!=0; node = 
node->next, ++i) {
                        
-                       CurveNode* cn = dynamic_cast<CurveNode*>(*xx);
+                       cn = (CurveNode*)node;
 
                        if (cn == 0) {
 /*                             qCritical  << _("programming error: ")
@@ -334,7 +350,6 @@
 
                        fplast = fpi;
                }
-               
        }
 
        m_changed = false;
@@ -357,13 +372,16 @@
 
        /* nodes is now known not to be empty */
 
-       max_x = m_nodes.back()->when;
-       min_x = m_nodes.front()->when;
+       CurveNode* lastnode = (CurveNode*)m_nodes.last();
+       CurveNode* firstnode = (CurveNode*)m_nodes.first();
+
+       max_x = lastnode->when;
+       min_x = firstnode->when;
 
        lx = max (min_x, x0);
 
        if (x1 < 0) {
-               x1 = m_nodes.back()->when;
+               x1 = lastnode->when;
        }
 
        hx = min (max_x, x1);
@@ -383,7 +401,7 @@
                subveclen = min (subveclen, veclen);
 
                for (i = 0; i < subveclen; ++i) {
-                       vec[i] = m_nodes.front()->value;
+                       vec[i] = firstnode->value;
                }
 
                veclen -= subveclen;
@@ -402,7 +420,7 @@
                
                subveclen = min (subveclen, veclen);
 
-               val = m_nodes.back()->value;
+               val = lastnode->value;
 
                i = veclen - subveclen;
 
@@ -420,7 +438,7 @@
        if (npoints == 1 ) {
        
                for (i = 0; i < veclen; ++i) {
-                       vec[i] = m_nodes.front()->value;
+                       vec[i] = firstnode->value;
                }
                return;
        }
@@ -441,11 +459,11 @@
                        dx = 0; // not used
                }
        
-               double slope = (m_nodes.back()->value - m_nodes.front()->value) 
/
-                       (m_nodes.back()->when - m_nodes.front()->when );
+               double slope = (lastnode->value - firstnode->value) /
+                       (lastnode->when - firstnode->when );
                double yfrac = dx*slope;
 
-               vec[0] = m_nodes.front()->value + slope * (lx - 
m_nodes.front()->when);
+               vec[0] = firstnode->value + slope * (lx - firstnode->when);
 
                for (i = 1; i < veclen; ++i) {
                        vec[i] = vec[i-1] + yfrac;
@@ -472,21 +490,107 @@
 
 double Curve::multipoint_eval(double x)
 {      
-       std::pair<QList<CurveNode* >::iterator, QList<CurveNode* >::iterator> 
range;
-
-       
        if ((m_lookup_cache.left < 0) ||
-               ((m_lookup_cache.left > x) || 
-               (m_lookup_cache.range.first == m_nodes.end()) || 
-               ((*m_lookup_cache.range.second)->when < x))) {
+               ((m_lookup_cache.left > x) || 
(m_lookup_cache.range.second->when < x))) {
                
-               Comparator cmp;
                CurveNode cn (this, x, 0.0);
 
-               m_lookup_cache.range = equal_range (m_nodes.begin(), 
m_nodes.end(), &cn, cmp);
+               APILinkedListNode* first = m_nodes.first();
+               APILinkedListNode* last = m_nodes.last();
+               APILinkedListNode* middle;
+               bool validrange = false;
+               int len = m_nodes.size() - 1;
+               int half;
+               
+               while (len > 0) {
+                       half = len >> 1;
+                       middle = first;
+                       // advance middle by half
+                       int n = half;
+                       while (n--) {
+                               middle = middle->next;
+                       }
+                       //start compare
+                       if (((CurveNode*)middle)->when < cn.when) {
+                               first = middle;
+                               first = first->next;
+                               len = len - half - 1;
+                       } else if (cn.when < ((CurveNode*)middle)->when) {
+                               len = half;
+                       } else {
+                               // lower bound (using first/middle)
+                               APILinkedListNode* lbfirst = first;
+                               APILinkedListNode* lblast = middle;
+                               APILinkedListNode* lbmiddle;
+                               // start distance.
+                               int lblen = 0;
+                               APILinkedListNode* temp = lbfirst;
+                               while (temp != lblast) {
+                                       temp = temp->next;
+                                       ++lblen;
+                               }
+                               
+                               int lbhalf;
+                               while (lblen > 0) {
+                                       lbhalf = lblen >> 1;
+                                       lbmiddle = lbfirst;
+                                       // advance middle by half
+                                       n = lbhalf;
+                                       while (n--) {
+                                               lbmiddle = lbmiddle->next;
+                                       }
+                                       if (((CurveNode*)lbmiddle)->when < 
cn.when) {
+                                               lbfirst = lbmiddle;
+                                               lbfirst = lbfirst->next;
+                                               lblen = lblen - lbhalf - 1;
+                                       } else {
+                                               lblen = lbhalf;
+                                       }
+                               }
+                               m_lookup_cache.range.first = 
(CurveNode*)lbfirst;
+                               
+
+                               // upper bound
+                               APILinkedListNode* ubfirst = middle->next;
+                               APILinkedListNode* ublast = last;
+                               APILinkedListNode* ubmiddle;
+                               // start distance.
+                               int ublen = 0;
+                               temp = ubfirst;
+                               while (temp != ublast) {
+                                       temp = temp->next;
+                                       ++ublen;
+                               }
+                               
+                               int ubhalf;
+                               while (ublen > 0) {
+                                       ubhalf = ublen >> 1;
+                                       ubmiddle = ubfirst;
+                                       // advance middle by half
+                                       n = ubhalf;
+                                       while (n--) {
+                                               ubmiddle = ubmiddle->next;
+                                       }
+                                       
+                                       if (cn.when < 
((CurveNode*)ubmiddle)->when) {
+                                               ublen = ubhalf;
+                                       } else {
+                                               ubfirst = ubmiddle;
+                                               ubfirst = ubfirst->next;
+                                               ublen = ublen - ubhalf - 1;
+                                       }
        }
+                               m_lookup_cache.range.second = 
(CurveNode*)ubfirst;
 
-       range = m_lookup_cache.range;
+                               validrange = true;
+                               break;
+                       }
+               }
+               if (!validrange) {
+                       m_lookup_cache.range.first = (CurveNode*)first;
+                       m_lookup_cache.range.second = (CurveNode*)first;
+               }
+       }
 
        /* EITHER 
        
@@ -499,26 +603,14 @@
        
        */
 
-       if (range.first == range.second) {
+       if (m_lookup_cache.range.first == m_lookup_cache.range.second) {
 
                /* x does not exist within the list as a control point */
                
                m_lookup_cache.left = x;
 
-               if (range.first == m_nodes.begin()) {
-                       /* we're before the first point */
-                       // return m_defaultValue;
-                       m_nodes.front()->value;
-               }
-               
-               if (range.second == m_nodes.end()) {
-                       /* we're after the last point */
-                       return m_nodes.back()->value;
-               }
-
                double x2 = x * x;
-               CurveNode* cn = *range.second;
-               
+               CurveNode* cn = m_lookup_cache.range.second;
                
                return cn->coeff[0] + (cn->coeff[1] * x) + (cn->coeff[2] * x2) 
+ (cn->coeff[3] * x2 * x);
        } 
@@ -526,7 +618,7 @@
        /* x is a control point in the data */
        /* invalidate the cached range because its not usable */
        m_lookup_cache.left = -1;
-       return (*range.first)->value;
+       return m_lookup_cache.range.first->value;
 }
 
 void Curve::set_range(double when)
@@ -535,7 +627,10 @@
                printf("Curve::set_range: no nodes!!");
                return;
        }
-       if (m_nodes.last()->when == when) {
+       
+       CurveNode* lastnode = (CurveNode*)m_nodes.last();
+       
+       if (lastnode->when == when) {
 //             printf("Curve::set_range: new range == current range!\n");
                return;
        }
@@ -547,7 +642,7 @@
        
        Q_ASSERT(when >= 0.0);
        
-       double factor = when / m_nodes.last()->when;
+       double factor = when / lastnode->when;
        
        if (factor == 1.0)
                return;
@@ -561,8 +656,7 @@
 {
        Q_ASSERT(factor != 0.0);
        
-       for (int i=0; i < m_nodes.size(); ++i) {
-               CurveNode* node = m_nodes.at(i); 
+       apill_foreach(CurveNode* node, CurveNode, m_nodes) {
                node->set_when(node->when * factor);
        }
 }
@@ -593,6 +687,15 @@
 {
        PENTER2;
        
+       apill_foreach(CurveNode* cn, CurveNode, m_nodes) {
+               if (node->when == cn->when && node->value == cn->value) {
+                       info().warning(tr("There is allready a node at this 
exact position, not adding a new node"));
+                       delete node;
+                       return 0;
+               }
+       }
+
+       
        AddRemove* cmd;
        cmd = new AddRemove(this, node, historable, m_song,
                        "private_add_node(CurveNode*)", "nodeAdded(CurveNode*)",
@@ -625,7 +728,7 @@
        if (m_nodes.size() == 1) {
                MoveNode* cmd;
 
-               cmd = new MoveNode(this, node, 0.0f, m_defaultInitialValue, 
tr("Remove CurveNode"));
+               cmd = new MoveNode(this, node, 0.0f, 1.0f, tr("Remove 
CurveNode"));
 
                return cmd;
        }
@@ -643,15 +746,13 @@
 
 void Curve::private_add_node( CurveNode * node )
 {
-       m_nodes.append(node);
-       qSort(m_nodes.begin(), m_nodes.end(), smallerNode);
-       
+       m_nodes.add_and_sort(node);
        set_changed();
 }
 
 void Curve::private_remove_node( CurveNode * node )
 {
-       m_nodes.removeAll(node);
+       m_nodes.remove(node);
        set_changed();
 }
 

Index: src/core/Curve.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/Curve.h,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -b -r1.24 -r1.25
--- src/core/Curve.h    24 Sep 2007 16:58:38 -0000      1.24
+++ src/core/Curve.h    19 Nov 2007 11:18:53 -0000      1.25
@@ -36,6 +36,8 @@
 #include <QDomDocument>
 
 #include "CurveNode.h"
+#include "defines.h"
+
 
 class Song;
 
@@ -50,62 +52,43 @@
 
        QDomNode get_state(QDomDocument doc, const QString& name);
        virtual int set_state( const QDomNode& node );
-       virtual int process(audio_sample_t* buffer, const TimeRef& 
startlocation, const TimeRef& endlocation, nframes_t nframes);
+       int process(audio_sample_t** buffer, const TimeRef& startlocation, 
const TimeRef& endlocation, nframes_t nframes, uint channels, float 
makeupgain=1.0f);
        
        Command* add_node(CurveNode* node, bool historable=true);
        Command* remove_node(CurveNode* node, bool historable=true);
        
        // Get functions
        double get_range() const;
-       
        void get_vector (double x0, double x1, float *arg, int32_t veclen);
-       
-       QList<CurveNode* >* get_nodes() {return &m_nodes;}
+       APILinkedList& get_nodes() {return m_nodes;}
        Song* get_song() const {return m_song;}
 
-       double get_default_initial_value() {return m_defaultInitialValue;}
-       
        // Set functions
        virtual void set_range(double when);
        void set_song(Song* song);
        
-       static bool smallerNode(const CurveNode* left, const CurveNode* right )
-       {
+       static bool smallerNode(const CurveNode* left, const CurveNode* right ) 
{
                return left->get_when() < right->get_when();
        }
        
-       // The 'GUI' curvenodes have double ownership, so get deleted twice
-       // to avoid this, use this function to not let this happen...
        void clear_curve() {m_nodes.clear();}
 
-       void set_default_initial_value(double val) {m_defaultInitialValue = 
val;}
-
 protected:
-       struct LookupCache {
-               double left;  /* leftmost x coordinate used when finding 
"range" */
-               std::pair<QList<CurveNode* >::iterator, QList<CurveNode* 
>::iterator> range;
-       };
-       
        Song* m_song;
-       QList<CurveNode* > m_nodes;
-       LookupCache m_lookup_cache;
-       bool m_changed;
 
 private :
+       APILinkedList m_nodes;
+       struct LookupCache {
+               double left;  /* leftmost x coordinate used when finding 
"range" */
+               std::pair<CurveNode*, CurveNode*> range;
        
-       
-       struct Comparator {
-               bool operator() (const CurveNode* a, const CurveNode* b) { 
-                       return a->when < b->when;
-               }
        };
-       
-       
+       LookupCache m_lookup_cache;
+       bool m_changed;
        double m_defaultValue;
-       double m_defaultInitialValue;
        
-       double multipoint_eval (double x);
        
+       double multipoint_eval (double x);
        void x_scale(double factor);
        void solve ();
        void init();
@@ -131,8 +114,8 @@
 
 inline double Curve::get_range( ) const
 {
-       if ( ! m_nodes.isEmpty()) {
-               return m_nodes.last()->when;
+       if (m_nodes.size()) {
+               return ((CurveNode*)m_nodes.last())->when;
        }
                
        return 0;

Index: src/core/CurveNode.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/CurveNode.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- src/core/CurveNode.h        2 Apr 2007 09:52:31 -0000       1.8
+++ src/core/CurveNode.h        19 Nov 2007 11:18:53 -0000      1.9
@@ -17,17 +17,17 @@
 along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
 
-$Id: CurveNode.h,v 1.8 2007/04/02 09:52:31 r_sijrier Exp $
+$Id: CurveNode.h,v 1.9 2007/11/19 11:18:53 r_sijrier Exp $
 */
 
 #ifndef CURVENODE_H
 #define CURVENODE_H
 
-#include "defines.h"
+#include "APILinkedList.h"
 
 class Curve;
 
-class CurveNode
+class CurveNode : public APILinkedListNode
 {
 
 public:
@@ -54,6 +54,7 @@
        double get_when() const {return when;}
        double get_value() const {return value;}
 
+       bool is_smaller_then(APILinkedListNode* node) {return 
((CurveNode*)node)->when > when;}
        
        Curve*  m_curve;
        

Index: src/core/FadeCurve.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/FadeCurve.cpp,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -b -r1.30 -r1.31
--- src/core/FadeCurve.cpp      5 Nov 2007 15:49:30 -0000       1.30
+++ src/core/FadeCurve.cpp      19 Nov 2007 11:18:53 -0000      1.31
@@ -17,7 +17,7 @@
 along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
 
-$Id: FadeCurve.cpp,v 1.30 2007/11/05 15:49:30 r_sijrier Exp $
+$Id: FadeCurve.cpp,v 1.31 2007/11/19 11:18:53 r_sijrier Exp $
 */
  
 #include "FadeCurve.h"
@@ -287,14 +287,17 @@
 
        // calculate curve nodes values
        float f = 0.0;
-       QList<CurveNode* >* nodes = get_nodes();
-       for (int i = 1; i < (nodes->size() -1); i++) {
-               f += 1.0/ (nodes->size() - 1);
+       APILinkedList list = get_nodes();
+       int listsize = list.size();
+       if (listsize > 0) {
+               APILinkedListNode* node = list.first()->next;
                
-               CurveNode* node = nodes->at(i);
+               while (node) {
+                       f += 1.0 / (listsize - 1);
                QPointF p = get_curve_point(f);
-               node->set_relative_when_and_value(p.x(), p.y());
-               
+                       ((CurveNode*)node)->set_relative_when_and_value(p.x(), 
p.y());
+                       node = node->next;
+               }
        }
        
        set_changed();

Index: src/core/FadeCurve.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/FadeCurve.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -b -r1.14 -r1.15
--- src/core/FadeCurve.h        24 Sep 2007 16:58:38 -0000      1.14
+++ src/core/FadeCurve.h        19 Nov 2007 11:18:53 -0000      1.15
@@ -17,7 +17,7 @@
 along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
 
-$Id: FadeCurve.h,v 1.14 2007/09/24 16:58:38 r_sijrier Exp $
+$Id: FadeCurve.h,v 1.15 2007/11/19 11:18:53 r_sijrier Exp $
 */
 
 #ifndef FADE_CURVE_H
@@ -33,7 +33,7 @@
 class Song;
 class AudioClip;
 
-class FadeCurve : public Curve
+class FadeCurve : public Curve, public APILinkedListNode
 {
        Q_OBJECT
        
@@ -71,8 +71,9 @@
        QList<QPointF> get_control_points();
        
        bool is_bypassed() const {return m_bypass;}
-       void set_range(double pos);
+       bool is_smaller_then(APILinkedListNode* node) {return false;}
 
+       void set_range(double pos);
        void set_mode(int m);
 
 private:

Index: src/core/Song.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/Song.cpp,v
retrieving revision 1.153
retrieving revision 1.154
diff -u -b -r1.153 -r1.154
--- src/core/Song.cpp   12 Nov 2007 19:05:10 -0000      1.153
+++ src/core/Song.cpp   19 Nov 2007 11:18:53 -0000      1.154
@@ -255,11 +255,8 @@
        
        QDomNode tracksNode = doc.createElement("Tracks");
 
-       AudioProcessingItem* item = m_tracks.begin();
-       while(item) {
-               Track* track = (Track*)item;
+       apill_foreach(Track* track, Track, m_tracks) {
                tracksNode.appendChild(track->get_state(doc, istemplate));
-               item = m_tracks.get_next(item);
        }
 
        songNode.appendChild(tracksNode);
@@ -305,14 +302,11 @@
 
 Command* Song::add_track(Track* track, bool historable)
 {
-       AudioProcessingItem* item = m_tracks.begin();
-       while(item) {
-               Track* existing = (Track*)item;
+       apill_foreach(Track* existing, Track, m_tracks) {
                if (existing->is_solo()) {
                        track->set_muted_by_solo( true );
                        break;
                }
-               item = m_tracks.get_next(item);
        }
 
        return new AddRemove(this, track, historable, this,
@@ -332,12 +326,10 @@
 
 bool Song::any_track_armed()
 {
-       AudioProcessingItem* item = m_tracks.begin();
-       while(item) {
-               if (((Track*)item)->armed()) {
+       apill_foreach(Track* track, Track, m_tracks) {
+               if (track->armed()) {
                        return true;
                }
-               item = m_tracks.get_next(item);
        }
        return false;
 }
@@ -376,9 +368,7 @@
 
        TimeRef endlocation, startlocation;
 
-       AudioProcessingItem* item = m_tracks.begin();
-       while(item) {
-               Track* track = (Track*)item;
+       apill_foreach(Track* track, Track, m_tracks) {
                track->get_render_range(startlocation, endlocation);
 
                if (track->is_solo()) {
@@ -394,8 +384,6 @@
                if (startlocation < spec->startLocation) {
                        spec->startLocation = startlocation;
                }
-               
-               item = m_tracks.get_next(item);
        }
        
        if (spec->isCdExport) {
@@ -650,20 +638,14 @@
        t->set_solo(!wasSolo);
 
        bool hasSolo = false;
-       AudioProcessingItem* item = m_tracks.begin();
-       while(item) {
-               Track* track = (Track*)item;
+       apill_foreach(Track* track, Track, m_tracks) {
                track->set_muted_by_solo(!track->is_solo());
                if (track->is_solo()) hasSolo = true;
-               item = m_tracks.get_next(item);
        }
 
        if (!hasSolo) {
-               AudioProcessingItem* item = m_tracks.begin();
-               while(item) {
-                       Track* track = (Track*)item;
+               apill_foreach(Track* track, Track, m_tracks) {
                        track->set_muted_by_solo(false);
-                       item = m_tracks.get_next(item);
                }
        }
 }
@@ -671,19 +653,13 @@
 Command* Song::toggle_solo()
 {
        bool hasSolo = false;
-       AudioProcessingItem* item = m_tracks.begin();
-       while(item) {
-               Track* track = (Track*)item;
+       apill_foreach(Track* track, Track, m_tracks) {
                if (track->is_solo()) hasSolo = true;
-               item = m_tracks.get_next(item);
        }
 
-       item = m_tracks.begin();
-       while(item) {
-               Track* track = (Track*)item;
+       apill_foreach(Track* track, Track, m_tracks) {
                track->set_solo(!hasSolo);
                track->set_muted_by_solo(false);
-               item = m_tracks.get_next(item);
        }
 
        return (Command*) 0;
@@ -692,18 +668,12 @@
 Command *Song::toggle_mute()
 {
        bool hasMute = false;
-       AudioProcessingItem* item = m_tracks.begin();
-       while(item) {
-               Track* track = (Track*)item;
+       apill_foreach(Track* track, Track, m_tracks) {
                if (track->is_muted()) hasMute = true;
-               item = m_tracks.get_next(item);
        }
 
-       item = m_tracks.begin();
-       while(item) {
-               Track* track = (Track*)item;
+       apill_foreach(Track* track, Track, m_tracks) {
                track->set_muted(!hasMute);
-               item = m_tracks.get_next(item);
        }
 
        return (Command*) 0;
@@ -712,22 +682,16 @@
 Command *Song::toggle_arm()
 {
        bool hasArmed = false;
-       AudioProcessingItem* item = m_tracks.begin();
-       while(item) {
-               Track* track = (Track*)item;
+       apill_foreach(Track* track, Track, m_tracks) {
                if (track->armed()) hasArmed = true;
-               item = m_tracks.get_next(item);
        }
 
-       item = m_tracks.begin();
-       while(item) {
-               Track* track = (Track*)item;
+       apill_foreach(Track* track, Track, m_tracks) {
                if (hasArmed) {
                        track->disarm();
                } else {
                        track->arm();
                }
-               item = m_tracks.get_next(item);
        }
 
        return (Command*) 0;
@@ -806,16 +770,13 @@
 
        int processResult = 0;
 
+
        // Process all Tracks.
-       AudioProcessingItem* item = m_tracks.begin();
-       while(item) {
-               Track* track = (Track*)item;
+       apill_foreach(Track* track, Track, m_tracks) {
                processResult |= track->process(nframes);
-               item = m_tracks.get_next(item);
        }
 
-       // update the m_transportFrame
-//     m_transportFrame += nframes;
+       // update the transport location
        m_transportLocation.add_frames(nframes, 
audiodevice().get_sample_rate());
 
        if (!processResult) {
@@ -841,9 +802,7 @@
        memset (mixdown, 0, sizeof (audio_sample_t) * nframes);
 
        // Process all Tracks.
-       AudioProcessingItem* item = m_tracks.begin();
-       while(item) {
-               Track* track = (Track*)item;
+       apill_foreach(Track* track, Track, m_tracks) {
                track->process(nframes);
        }
 
@@ -982,14 +941,11 @@
        m_renderBus->set_buffer_size(size);
        
        if (updateArmStatus) {
-               AudioProcessingItem* item = m_tracks.begin();
-               while(item) {
-                       Track* track = (Track*)item;
+               apill_foreach(Track* track, Track, m_tracks) {
                        AudioBus* bus = 
audiodevice().get_capture_bus(track->get_bus_in().toAscii());
                        if (bus && track->armed()) {
                                bus->set_monitor_peaks(true);
                        }
-                       item = m_tracks.get_next(item);
                }
        }
 }
@@ -1030,19 +986,6 @@
        return firstVisibleFrame;
 }
 
-QList<Track* > Song::get_tracks( )
-{
-       QList<Track*> list;
-       AudioProcessingItem* item = m_tracks.begin();
-       while(item) {
-               Track* track = (Track*)item;
-               list.append(track);
-               item = m_tracks.get_next(item);
-       }
-
-       return list;
-}
-
 DiskIO * Song::get_diskio( ) const
 {
        return m_diskio;
@@ -1060,15 +1003,12 @@
 
 int Song::get_track_index(qint64 id)
 {
-       AudioProcessingItem* item = m_tracks.begin();
        int i=0;
-       while(item) {
-               Track* track = (Track*)item;
+       apill_foreach(Track* track, Track, m_tracks) {
                if (track->get_id() == id) {
                        return i + 1;
                }
                ++i;
-               item = m_tracks.get_next(item);
        }
        return 0;
 }
@@ -1113,13 +1053,10 @@
 
 Track* Song::get_track(qint64 id)
 {
-       AudioProcessingItem* item = m_tracks.begin();
-       while(item) {
-               Track* track = (Track*)item;
+       apill_foreach(Track* track, Track, m_tracks) {
                if (track->get_id() == id) {
                        return track;
                }
-               item = m_tracks.get_next(item);
        }
        return 0;
 }
@@ -1338,9 +1275,7 @@
        if (m_recording && any_track_armed()) {
                CommandGroup* group = new CommandGroup(this, "");
                int clipcount = 0;
-               AudioProcessingItem* item = m_tracks.begin();
-               while(item) {
-                       Track* track = (Track*)item;
+               apill_foreach(Track* track, Track, m_tracks) {
                        if (track->armed()) {
                                AudioClip* clip = track->init_recording();
                                if (clip) {
@@ -1348,7 +1283,6 @@
                                        clipcount++;
                                }
                        }
-                       item = m_tracks.get_next(item);
                }
                group->setText(tr("Recording to %n Clip(s)", "", clipcount));
                Command::process_command(group);

Index: src/core/Song.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/Song.h,v
retrieving revision 1.72
retrieving revision 1.73
diff -u -b -r1.72 -r1.73
--- src/core/Song.h     12 Nov 2007 18:52:13 -0000      1.72
+++ src/core/Song.h     19 Nov 2007 11:18:53 -0000      1.73
@@ -96,7 +96,7 @@
        QString get_title() const {return title;}
        QString get_artists() const {return artists;}
        QDomNode get_state(QDomDocument doc, bool istemplate=false);
-       QList<Track* > get_tracks();
+       APILinkedList& get_tracks() {return m_tracks;}
        
        DiskIO* get_diskio() const;
        AudioClipManager* get_audioclip_manager() const;
@@ -138,6 +138,7 @@
        bool is_changed() const {return changed;}
        bool is_snap_on() const {return m_isSnapOn;}
        bool is_recording() const {return m_recording;}
+       bool is_smaller_then(APILinkedListNode* node) {return false;}
 
        void disconnect_from_audiodevice();
        void connect_to_audiodevice();

Index: src/core/Track.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/Track.cpp,v
retrieving revision 1.73
retrieving revision 1.74
diff -u -b -r1.73 -r1.74
--- src/core/Track.cpp  12 Nov 2007 18:52:13 -0000      1.73
+++ src/core/Track.cpp  19 Nov 2007 11:18:53 -0000      1.74
@@ -105,9 +105,7 @@
        if (! istemplate ) {
                QDomNode clips = doc.createElement("Clips");
        
-               AudioProcessingItem* item = audioClipList.begin();
-               while(item) {
-                       AudioClip* clip = (AudioClip*)item;
+               apill_foreach(AudioClip* clip, AudioClip, audioClipList) {
                        if (clip->get_length() == qint64(0)) {
                                PERROR("Clip lenght is 0! This shouldn't 
happen!!!!");
                                continue;
@@ -116,8 +114,6 @@
                        QDomElement clipNode = doc.createElement("Clip");
                        clipNode.setAttribute("id", clip->get_id() );
                        clips.appendChild(clipNode);
-                       
-                       item = item->next;
                }
                
                node.appendChild(clips);
@@ -193,14 +189,10 @@
 
 AudioClip* Track::get_clip_after(const TimeRef& pos)
 {
-       AudioProcessingItem* item = audioClipList.begin();
-       while(item) {
-               AudioClip* clip = (AudioClip*)item;
+       apill_foreach(AudioClip* clip, AudioClip, audioClipList) {
                if (clip->get_track_start_location() > pos) {
                        return clip;
                }
-               
-               item = item->next;
        }
        return (AudioClip*) 0;
 }
@@ -208,13 +200,10 @@
 
 AudioClip* Track::get_clip_before(const TimeRef& pos)
 {
-       AudioProcessingItem* item = audioClipList.begin();
-       while(item) {
-               AudioClip* clip = (AudioClip*)item;
+       apill_foreach(AudioClip* clip, AudioClip, audioClipList) {
                if (clip->get_track_start_location() < pos) {
                        return clip;
                }
-               item = item->next;
        }
        return (AudioClip*) 0;
 }
@@ -246,6 +235,15 @@
                tr("Add Clip"));
 }
 
+void Track::private_add_clip(AudioClip* clip)
+{
+       audioClipList.add_and_sort(clip);
+}
+
+void Track::private_remove_clip(AudioClip* clip)
+{
+       audioClipList.remove(clip);
+}
 
 int Track::arm()
 {
@@ -424,13 +422,9 @@
 
        m_pluginChain->process_pre_fader(bus, nframes);
        
-       AudioProcessingItem* item = audioClipList.begin();
-       while(item) {
-               AudioClip* clip = (AudioClip*)item;
-               
+       apill_foreach(AudioClip* clip, AudioClip, audioClipList) {
                if (isArmed && clip->recording_state() == 
AudioClip::NO_RECORDING) {
                        if (m_isMuted || mutedBySolo) {
-                               item = item->next;
                                continue;
                        }
                }
@@ -439,13 +433,10 @@
                result = clip->process(nframes);
                
                if (result <= 0) {
-                       item = item->next;
                        continue;
                }
 
                processResult |= result;
-               
-               item = item->next;
        }
        
        for (int chan=0; chan<bus->get_channel_count(); ++chan) {
@@ -515,10 +506,7 @@
        endlocation = TimeRef();
        startlocation = LONG_LONG_MAX;
        
-       AudioProcessingItem* item = audioClipList.begin();
-       while(item) {
-               AudioClip* clip = (AudioClip*)item;
-               
+       apill_foreach(AudioClip* clip, AudioClip, audioClipList) {
                if (! clip->is_muted() ) {
                        if (clip->get_track_end_location() > endlocation) {
                                endlocation = clip->get_track_end_location();
@@ -528,8 +516,6 @@
                                startlocation = 
clip->get_track_start_location();
                        }
                }
-               
-               item = item->next;
        }
        
 }

Index: src/core/Track.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/Track.h,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -b -r1.34 -r1.35
--- src/core/Track.h    12 Nov 2007 18:52:14 -0000      1.34
+++ src/core/Track.h    19 Nov 2007 11:18:53 -0000      1.35
@@ -29,7 +29,6 @@
 #include <QByteArray>
 
 #include "ContextItem.h"
-#include "AudioClipList.h"
 #include "GainEnvelope.h"
 #include "AudioProcessingItem.h"
 
@@ -76,11 +75,14 @@
        float get_pan() const {return m_pan;}
        Song* get_song() const {return m_song;}
        QString get_name() const {return m_name;}
+       
        int get_total_clips();
        QDomNode get_state(QDomDocument doc, bool istemplate=false);
-       AudioClipList get_cliplist() const {return audioClipList;}
        PluginChain* get_plugin_chain() const {return m_pluginChain;}
+       APILinkedList& get_cliplist() {return audioClipList;}
        int get_sort_index() const;
+       bool is_smaller_then(APILinkedListNode* node) {return 
((Track*)node)->get_sort_index() < get_sort_index();}
+
        
 
        // Set functions:
@@ -117,7 +119,7 @@
 
 private :
        Song*           m_song;
-       AudioClipList   audioClipList;
+       APILinkedList   audioClipList;
 
        float   m_pan;
        int numtakes;
@@ -175,15 +177,5 @@
        return m_fader->get_gain();
 }
 
-inline void Track::private_add_clip(AudioClip* clip)
-{
-       audioClipList.add_clip(clip);
-}
-
-inline void Track::private_remove_clip(AudioClip* clip)
-{
-       audioClipList.remove_clip(clip);
-}
-
 #endif
 

Index: src/engine/AudioDevice.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/engine/AudioDevice.cpp,v
retrieving revision 1.47
retrieving revision 1.48
diff -u -b -r1.47 -r1.48
--- src/engine/AudioDevice.cpp  12 Nov 2007 18:52:14 -0000      1.47
+++ src/engine/AudioDevice.cpp  19 Nov 2007 11:18:54 -0000      1.48
@@ -17,7 +17,7 @@
 along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
 
-$Id: AudioDevice.cpp,v 1.47 2007/11/12 18:52:14 r_sijrier Exp $
+$Id: AudioDevice.cpp,v 1.48 2007/11/19 11:18:54 r_sijrier Exp $
 */
 
 #include "AudioDevice.h"
@@ -264,10 +264,8 @@
                return -1;
        }
 
-       AudioProcessingItem* item = m_clients.begin();
-       while(item) {
-               ((Client*)item)->process(nframes);
-               item = m_clients.get_next(item);
+       apill_foreach(Client* client, Client, m_clients) {
+               client->process(nframes);
        }
 /*     for (int i=0; i<m_clients.size(); ++i) {
                if (m_clients.at(i)->process(nframes) < 0) {
@@ -768,14 +766,9 @@
 #endif 
 
        int result = 0;
-/*     for (int i=0; i<m_clients.size(); ++i) {
-               result = m_clients.at(i)->transport_control(state);
-       }*/
        
-       AudioProcessingItem* item = m_clients.begin();
-       while(item) {
-               result = ((Client*)item)->transport_control(state);
-               item = m_clients.get_next(item);
+       apill_foreach(Client* client, Client, m_clients) {
+               result = client->transport_control(state);
        }
        
        return result;

Index: src/engine/Client.h
===================================================================
RCS file: /sources/traverso/traverso/src/engine/Client.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- src/engine/Client.h 12 Nov 2007 18:52:14 -0000      1.6
+++ src/engine/Client.h 19 Nov 2007 11:18:54 -0000      1.7
@@ -17,7 +17,7 @@
 along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
 
-$Id: Client.h,v 1.6 2007/11/12 18:52:14 r_sijrier Exp $
+$Id: Client.h,v 1.7 2007/11/19 11:18:54 r_sijrier Exp $
 */
 
 #ifndef CLIENT_H
@@ -25,11 +25,11 @@
 
 #include <QString>
 #include <QObject>
-#include "AudioProcessingItem.h"
+#include "APILinkedList.h"
 
 #include "defines.h"
 
-class Client : public QObject, public AudioProcessingItem
+class Client : public QObject, public APILinkedListNode
 {
        Q_OBJECT
 
@@ -39,6 +39,7 @@
 
        void set_process_callback(ProcessCallback call);
        void set_transport_control_callback(TransportControlCallback call);
+       bool is_smaller_then(APILinkedListNode* ) {return false;}
 
        
        ProcessCallback process;

Index: src/plugins/native/GainEnvelope.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/plugins/native/GainEnvelope.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- src/plugins/native/GainEnvelope.cpp 29 Oct 2007 09:00:11 -0000      1.5
+++ src/plugins/native/GainEnvelope.cpp 19 Nov 2007 11:18:54 -0000      1.6
@@ -73,19 +73,6 @@
        return 1;
 }
 
-void GainEnvelope::process_gain(audio_sample_t** buffer, const TimeRef& 
startlocation, const TimeRef& endlocation, nframes_t nframes, uint channels)
-{
-       PluginControlPort* port = m_controlPorts.at(0);
-       
-       for (uint chan=0; chan<channels; ++chan) {
-               Mixer::apply_gain_to_buffer(buffer[chan], nframes, m_gain);
-               
-               if (port->use_automation()) {
-                       port->get_curve()->process(buffer[chan], startlocation, 
endlocation, nframes);
-               }
-       }
-}
-
 QString GainEnvelope::get_name()
 {
        return "Gain Envelope";

Index: src/plugins/native/GainEnvelope.h
===================================================================
RCS file: /sources/traverso/traverso/src/plugins/native/GainEnvelope.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- src/plugins/native/GainEnvelope.h   24 Sep 2007 16:58:38 -0000      1.2
+++ src/plugins/native/GainEnvelope.h   19 Nov 2007 11:18:54 -0000      1.3
@@ -24,9 +24,10 @@
 #define GAIN_ENVELOPE_H
 
 #include "Plugin.h"
+#include "Curve.h"
+#include "Mixer.h"
 
 class Song;
-class Curve;
 
 class GainEnvelope : public Plugin
 {
@@ -53,5 +54,19 @@
 };
 
 
+inline void GainEnvelope::process_gain(audio_sample_t** buffer, const TimeRef& 
startlocation, const TimeRef& endlocation, nframes_t nframes, uint channels)
+{
+       PluginControlPort* port = m_controlPorts.at(0);
+       
+       if (port->use_automation()) {
+               port->get_curve()->process(buffer, startlocation, endlocation, 
nframes, channels, m_gain);
+       } else {
+               for (uint chan=0; chan<channels; ++chan) {
+                       Mixer::apply_gain_to_buffer(buffer[chan], nframes, 
m_gain);
+               }
+       }
+}
+
+
 #endif
 

Index: src/traverso/dialogs/BusSelectorDialog.cpp
===================================================================
RCS file: 
/sources/traverso/traverso/src/traverso/dialogs/BusSelectorDialog.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- src/traverso/dialogs/BusSelectorDialog.cpp  5 Nov 2007 15:53:03 -0000       
1.6
+++ src/traverso/dialogs/BusSelectorDialog.cpp  19 Nov 2007 11:18:54 -0000      
1.7
@@ -173,7 +173,7 @@
        
        Song* song = pm().get_project()->get_current_song();
        
-       foreach(Track* track, song->get_tracks()) {
+       apill_foreach(Track* track, Track, song->get_tracks()) {
                QString fulltitle = QString::number(track->get_sort_index() + 
1) + " " + track->get_name();
                trackComboBox->addItem(fulltitle, track->get_id());
        }

Index: src/traverso/dialogs/InsertSilenceDialog.cpp
===================================================================
RCS file: 
/sources/traverso/traverso/src/traverso/dialogs/InsertSilenceDialog.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- src/traverso/dialogs/InsertSilenceDialog.cpp        5 Nov 2007 15:53:03 
-0000       1.7
+++ src/traverso/dialogs/InsertSilenceDialog.cpp        19 Nov 2007 11:18:54 
-0000      1.8
@@ -53,15 +53,15 @@
 void InsertSilenceDialog::accept()
 {
        Song* song = pm().get_project()->get_current_song();
-       QList<Track* > tracks = song->get_tracks();
+       APILinkedList tracks = song->get_tracks();
 
        // Make sure track is still in the song
        if (m_track){
                Track*  foundTrack = 0;
 
-               for (int i=0; i<tracks.size(); i++) {
-                       if (tracks.at(i) == m_track) {
-                               foundTrack = tracks.at(i);
+               apill_foreach(Track* track, Track, tracks) {
+                       if (track == m_track) {
+                               foundTrack = track;
                        }
                }
                m_track = foundTrack;
@@ -69,11 +69,11 @@
 
        if (song->get_numtracks() > 0) {
                if (!m_track){
-                       Track*  shortestTrack = tracks.at(0);
+                       Track*  shortestTrack = (Track*)tracks.first();
        
-                       for (int i=1; i<tracks.size(); i++) {
-                               if (tracks.at(i)->get_cliplist().get_last() && 
tracks.at(i)->get_cliplist().get_last()->get_track_end_location() > 
shortestTrack->get_cliplist().get_last()->get_track_end_location()) {
-                                       shortestTrack = tracks.at(i);
+                       apill_foreach(Track* track, Track, tracks) {
+                               if (track->get_cliplist().last() && 
((AudioClip*)track->get_cliplist().last())->get_track_end_location() > 
((AudioClip*)shortestTrack->get_cliplist().last())->get_track_end_location()) {
+                                       shortestTrack = track;
                                }
                        }
                        m_track = shortestTrack;

Index: src/traverso/Interface.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/traverso/Interface.cpp,v
retrieving revision 1.107
retrieving revision 1.108
diff -u -b -r1.107 -r1.108
--- src/traverso/Interface.cpp  7 Nov 2007 20:28:57 -0000       1.107
+++ src/traverso/Interface.cpp  19 Nov 2007 11:18:54 -0000      1.108
@@ -922,12 +922,12 @@
 void Interface::import_audio()
 {
        if (currentSongWidget->get_song()->get_numtracks() > 0) {
-               QList<Track* > tracks = 
currentSongWidget->get_song()->get_tracks();
-               Track*  shortestTrack = tracks.at(0);
+               APILinkedList tracks = 
currentSongWidget->get_song()->get_tracks();
+               Track*  shortestTrack = (Track*)tracks.first();
 
-               for (int i=1; i<tracks.size(); i++) {
-                       if (tracks.at(i)->get_cliplist().get_last() && 
tracks.at(i)->get_cliplist().get_last()->get_track_end_location() > 
shortestTrack->get_cliplist().get_last()->get_track_end_location()) {
-                               shortestTrack = tracks.at(i);
+               apill_foreach(Track* track, Track, tracks) {
+                       if (track->get_cliplist().last() && 
((AudioClip*)track->get_cliplist().last())->get_track_end_location() > 
((AudioClip*)shortestTrack->get_cliplist().last())->get_track_end_location()) {
+                               shortestTrack = track;
                        }
                }
 

Index: src/traverso/songcanvas/CurveView.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/traverso/songcanvas/CurveView.cpp,v
retrieving revision 1.65
retrieving revision 1.66
diff -u -b -r1.65 -r1.66
--- src/traverso/songcanvas/CurveView.cpp       5 Nov 2007 15:49:32 -0000       
1.65
+++ src/traverso/songcanvas/CurveView.cpp       19 Nov 2007 11:18:54 -0000      
1.66
@@ -160,9 +160,8 @@
        m_guicurve = new Curve(0);
        m_guicurve->set_song(sv->get_song());
        
-       QList<CurveNode* >* nodes = m_curve->get_nodes();
-       for (int i=0; i < nodes->size(); i++) {
-               add_curvenode_view(nodes->at(i));
+       apill_foreach(CurveNode* node, CurveNode, m_curve->get_nodes()) {
+               add_curvenode_view(node);
        }
        
        connect(&m_blinkTimer, SIGNAL(timeout()), this, 
SLOT(update_blink_color()));
@@ -236,7 +235,7 @@
        // vertically at the exact same x position. The curve line won't be 
painted
        // by the routine above (it doesn't catch the second node position 
obviously)
        // so we add curvenodes _always_ to solve this problem easily :-)
-       foreach(CurveNodeView* view, m_nodeViews) {
+       apill_foreach(CurveNodeView* view, CurveNodeView, m_nodeViews) {
                qreal x = view->x();
                if ( (x > xstart) && x < (xstart + pixelcount)) {
                        polygon <<  QPointF( x + view->boundingRect().width() / 
2,
@@ -266,7 +265,7 @@
 
 int CurveView::get_vector(int xstart, int pixelcount, float* arg)
 {
-       if (m_guicurve->get_nodes()->size() == 1 && 
m_guicurve->get_nodes()->first()->value == 1.0) {
+       if (m_guicurve->get_nodes().size() == 1 && 
((CurveNode*)m_guicurve->get_nodes().first())->value == 1.0) {
                return 0;
        }
        
@@ -295,7 +294,7 @@
 
 void CurveView::remove_curvenode_view(CurveNode* node)
 {
-       foreach(CurveNodeView* nodeview, m_nodeViews) {
+       apill_foreach(CurveNodeView* nodeview, CurveNodeView, m_nodeViews) {
                if (nodeview->get_curve_node() == node) {
                        m_nodeViews.removeAll(nodeview);
                        if (nodeview == m_blinkingNode) {
@@ -476,17 +475,17 @@
        if (m_blinkingNode) {
                TimeRef min(qint64(0));
                TimeRef max(qint64(-1));
-               QList<CurveNode* >* nodeList = m_curve->get_nodes();
+               APILinkedList nodeList = m_curve->get_nodes();
                CurveNode* node = m_blinkingNode->get_curve_node();
-               int index = nodeList->indexOf(node);
+               int index = nodeList.indexOf(node);
                
                emit curveModified();
                
                if (index > 0) {
-                       min = qint64(nodeList->at(index-1)->get_when() + 1);
+                       min = 
qint64(((CurveNode*)nodeList.at(index-1))->get_when() + 1);
                }
-               if (nodeList->size() > (index + 1)) {
-                       max = qint64(nodeList->at(index+1)->get_when() - 1);
+               if (nodeList.size() > (index + 1)) {
+                       max = 
qint64(((CurveNode*)nodeList.at(index+1))->get_when() - 1);
                }
                return new DragNode(m_blinkingNode->get_curve_node(), this, 
m_sv->timeref_scalefactor, min, max, tr("Drag Node"));
        }
@@ -561,11 +560,11 @@
 
 bool CurveView::has_nodes() const
 {
-       return m_guicurve->get_nodes()->size() > 1 ? true : false;
+       return m_guicurve->get_nodes().size() > 1 ? true : false;
 }
 
 float CurveView::get_default_value()
 {
-       return m_guicurve->get_nodes()->first()->value;
+       return ((CurveNode*)m_guicurve->get_nodes().first())->value;
 }
 

Index: src/traverso/songcanvas/FadeView.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/traverso/songcanvas/FadeView.cpp,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -b -r1.20 -r1.21
--- src/traverso/songcanvas/FadeView.cpp        5 Nov 2007 15:49:32 -0000       
1.20
+++ src/traverso/songcanvas/FadeView.cpp        19 Nov 2007 11:18:54 -0000      
1.21
@@ -17,7 +17,7 @@
 along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
 
-$Id: FadeView.cpp,v 1.20 2007/11/05 15:49:32 r_sijrier Exp $
+$Id: FadeView.cpp,v 1.21 2007/11/19 11:18:54 r_sijrier Exp $
 */
 
 #include "FadeView.h"
@@ -51,7 +51,8 @@
        m_guicurve = new Curve(0);
        m_guicurve->set_song(m_sv->get_song());
        
-       foreach(CurveNode* node, *m_fadeCurve->get_nodes()) {
+       
+       apill_foreach(CurveNode* node, CurveNode, m_fadeCurve->get_nodes()) {
                CurveNode* guinode = new CurveNode(m_guicurve, 
                                node->get_when() / m_sv->timeref_scalefactor,
                                node->get_value());
@@ -217,12 +218,20 @@
 
 void FadeView::calculate_bounding_rect()
 {
-       QList<CurveNode*>* guinodes = m_guicurve->get_nodes();
-       QList<CurveNode*>* nodes = m_fadeCurve->get_nodes();
-       for (int i=0; i<guinodes->size(); ++i) {
-               CurveNode* node = nodes->at(i);
-               CurveNode* guinode = guinodes->at(i);
-               guinode->set_when_and_value(node->get_when() / 
m_sv->timeref_scalefactor, node->get_value());
+       APILinkedList guinodes = m_guicurve->get_nodes();
+       APILinkedList nodes = m_fadeCurve->get_nodes();
+       
+       APILinkedListNode* node = nodes.first();
+       APILinkedListNode* guinode = guinodes.first();
+       
+       while (node) {
+               CurveNode* cnode = (CurveNode*)node;
+               CurveNode* cguinode = (CurveNode*)guinode;
+               
+               cguinode->set_when_and_value(cnode->get_when() / 
m_sv->timeref_scalefactor, cnode->get_value());
+               
+               node = node->next;
+               guinode = guinode->next;
        }
        
        double range = m_guicurve->get_range();

Index: src/traverso/songcanvas/SongView.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/traverso/songcanvas/SongView.cpp,v
retrieving revision 1.82
retrieving revision 1.83
diff -u -b -r1.82 -r1.83
--- src/traverso/songcanvas/SongView.cpp        13 Nov 2007 13:02:37 -0000      
1.82
+++ src/traverso/songcanvas/SongView.cpp        19 Nov 2007 11:18:54 -0000      
1.83
@@ -108,7 +108,7 @@
        
        song_mode_changed();
        
-       foreach(Track* track, m_song->get_tracks()) {
+       apill_foreach(Track* track, Track, m_song->get_tracks()) {
                add_new_trackview(track);
        }
        

Index: src/traverso/songcanvas/TrackView.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/traverso/songcanvas/TrackView.cpp,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -b -r1.36 -r1.37
--- src/traverso/songcanvas/TrackView.cpp       12 Nov 2007 18:52:14 -0000      
1.36
+++ src/traverso/songcanvas/TrackView.cpp       19 Nov 2007 11:18:54 -0000      
1.37
@@ -66,11 +66,8 @@
        connect(m_track, SIGNAL(audioClipRemoved(AudioClip*)), this, 
SLOT(remove_audioclipview(AudioClip*)));
        
        
-       AudioProcessingItem* item = m_track->get_cliplist().begin();
-       while(item) {
-               AudioClip* clip = (AudioClip*)item;
+       apill_foreach(AudioClip* clip, AudioClip, m_track->get_cliplist()) {
                add_new_audioclipview(clip);
-               item = item->next;
        }
 }
 

Index: src/traverso/widgets/InfoWidgets.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/traverso/widgets/InfoWidgets.cpp,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -b -r1.46 -r1.47
--- src/traverso/widgets/InfoWidgets.cpp        6 Nov 2007 18:25:16 -0000       
1.46
+++ src/traverso/widgets/InfoWidgets.cpp        19 Nov 2007 11:18:54 -0000      
1.47
@@ -327,7 +327,7 @@
        if (recordingSongs.size()) {
                int recChannelCount = 0;
                foreach(Song* song, recordingSongs) {
-                       foreach(Track* track, song->get_tracks()) {
+                       apill_foreach(Track* track, Track, song->get_tracks()) {
                                if (track->armed()) {
                                        recChannelCount += 
track->capture_left_channel() ? 1 : 0;
                                        recChannelCount += 
track->capture_right_channel() ? 1 : 0;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]