traverso-commit
[Top][All Lists]
Advanced

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

[Traverso-commit] traverso/src core/AudioClip.cpp core/AudioClip....


From: Remon Sijrier
Subject: [Traverso-commit] traverso/src core/AudioClip.cpp core/AudioClip....
Date: Mon, 12 Nov 2007 18:52:14 +0000

CVSROOT:        /sources/traverso
Module name:    traverso
Changes by:     Remon Sijrier <r_sijrier>       07/11/12 18:52:14

Modified files:
        src/core       : AudioClip.cpp AudioClip.h AudioClipList.cpp 
                         AudioClipList.h Song.cpp Song.h Track.cpp 
                         Track.h 
        src/engine     : AudioDevice.cpp AudioDevice.h Client.h 
        src/traverso/songcanvas: AudioClipView.cpp AudioClipView.h 
                                 TrackView.cpp 

Log message:
        * Added AudioProcessingItemLinkedList class, which is an extremely 
lightweight linked list, who adds/removes items without calling new()/delete() 
which is good for Real Time use
        Updated some classes to make use of it (Song, Track, AudioClip, Client)

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AudioClip.cpp?cvsroot=traverso&r1=1.148&r2=1.149
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AudioClip.h?cvsroot=traverso&r1=1.66&r2=1.67
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AudioClipList.cpp?cvsroot=traverso&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AudioClipList.h?cvsroot=traverso&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Song.cpp?cvsroot=traverso&r1=1.151&r2=1.152
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Song.h?cvsroot=traverso&r1=1.71&r2=1.72
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Track.cpp?cvsroot=traverso&r1=1.72&r2=1.73
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Track.h?cvsroot=traverso&r1=1.33&r2=1.34
http://cvs.savannah.gnu.org/viewcvs/traverso/src/engine/AudioDevice.cpp?cvsroot=traverso&r1=1.46&r2=1.47
http://cvs.savannah.gnu.org/viewcvs/traverso/src/engine/AudioDevice.h?cvsroot=traverso&r1=1.25&r2=1.26
http://cvs.savannah.gnu.org/viewcvs/traverso/src/engine/Client.h?cvsroot=traverso&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/songcanvas/AudioClipView.cpp?cvsroot=traverso&r1=1.116&r2=1.117
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/songcanvas/AudioClipView.h?cvsroot=traverso&r1=1.33&r2=1.34
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/songcanvas/TrackView.cpp?cvsroot=traverso&r1=1.35&r2=1.36

Patches:
Index: core/AudioClip.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/AudioClip.cpp,v
retrieving revision 1.148
retrieving revision 1.149
diff -u -b -r1.148 -r1.149
--- core/AudioClip.cpp  5 Nov 2007 15:49:29 -0000       1.148
+++ core/AudioClip.cpp  12 Nov 2007 18:52:13 -0000      1.149
@@ -785,11 +785,6 @@
        return m_isTake;
 }
 
-bool AudioClip::is_muted( ) const
-{
-       return m_isMuted;
-}
-
 QString AudioClip::get_name( ) const
 {
        return m_name;

Index: core/AudioClip.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/AudioClip.h,v
retrieving revision 1.66
retrieving revision 1.67
diff -u -b -r1.66 -r1.67
--- core/AudioClip.h    17 Oct 2007 11:48:51 -0000      1.66
+++ core/AudioClip.h    12 Nov 2007 18:52:13 -0000      1.67
@@ -27,6 +27,7 @@
 #include <QDomNode>
 
 #include "ContextItem.h"
+#include "AudioProcessingItem.h"
 #include "SnapList.h"
 #include "Snappable.h"
 #include "defines.h"
@@ -42,7 +43,7 @@
 class FadeCurve;
 class PluginChain;
 
-class AudioClip : public ContextItem, public Snappable
+class AudioClip : public ContextItem, public AudioProcessingItem, public 
Snappable
 {
        Q_OBJECT
        Q_CLASSINFO("mute", tr("Mute"))
@@ -105,7 +106,6 @@
        QString get_name() const;
        QDomNode get_dom_node() const;
        
-       bool is_muted() const;
        bool is_take() const;
        bool is_selected() const;
        bool is_locked() const {return m_isLocked;}
@@ -132,8 +132,6 @@
        AudioBus*               m_captureBus;
        FadeCurve*              fadeIn;
        FadeCurve*              fadeOut;
-       GainEnvelope*           m_fader;
-       PluginChain*            m_pluginChain;
        QDomNode                m_domNode;
        
        QString                 m_name;
@@ -148,7 +146,6 @@
 
        int                     m_isSelected;
        bool                    m_isTake;
-       bool                    m_isMuted;
        bool                    m_isLocked;
        bool                    m_isReadSourceValid;
        RecordingStatus         m_recordingStatus;

Index: core/AudioClipList.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/AudioClipList.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- core/AudioClipList.cpp      20 Apr 2006 14:51:39 -0000      1.1
+++ core/AudioClipList.cpp      12 Nov 2007 18:52:13 -0000      1.2
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2005-2006 Remon Sijrier 
+    Copyright (C) 2005-2007 Remon Sijrier 
  
     This file is part of Traverso
  
@@ -17,80 +17,75 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
  
-    $Id: AudioClipList.cpp,v 1.1 2006/04/20 14:51:39 r_sijrier Exp $
+    $Id: AudioClipList.cpp,v 1.2 2007/11/12 18:52:13 r_sijrier Exp $
 */
 
 #include "AudioClipList.h"
 
-#include "AudioClip.h"
-
 // Always put me below _all_ includes, this is needed
 // in case we run with memory leak detection enabled!
 #include "Debugger.h"
 
-
-void AudioClipList::add_clip( AudioClip * clip )
-{
-        append(clip);
-        sort();
-}
-
-int AudioClipList::remove_clip( AudioClip * clip )
+AudioClip * AudioClipList::get_last( )
 {
-        int index;
-        if ( (index = clip_index(clip)) >= 0 ) {
-                removeAt(index);
-                sort();
-                return 1;
+       if (!size()) {
+               return 0;
         }
-        return -1;
-}
 
-AudioClip * AudioClipList::next( AudioClip * clip )
-{
-        if ( (!isEmpty()) &&  (! (clip == last())) ) {
-                int index = clip_index(clip);
-                if (index >= 0)
-                        return at(index + 1);
+       if (size() == 1) {
+               return (AudioClip*)begin();
         }
-        return (AudioClip*) 0;
-}
 
-AudioClip * AudioClipList::prev( AudioClip * clip )
-{
-        if ( (!isEmpty()) && (! (clip == first())) ) {
-                int index = clip_index(clip);
-                //FIXME
-                if (index >= 0)
-                        return at(index - 1);
-        }
-        return (AudioClip*) 0;
-}
+       AudioProcessingItem* item = begin();
+       AudioProcessingItem* result = item;
 
-int AudioClipList::clip_index( AudioClip * clip )
-{
-        AudioClip* c;
-        for (int i=0; i<size(); ++i) {
-                c = at(i);
-                if (c == clip) {
-                        return i;
+       while (item) {
+               item = item->next;
+               if (item) {
+                       result = item;
                 }
         }
-        return -1;
-}
 
-void AudioClipList::sort()
-{
-        if(!isEmpty())
-                qSort(begin(), end(), AudioClip::smaller);
+       return (AudioClip*)result;
 }
 
-AudioClip * AudioClipList::get_last( )
-{
-        if(!isEmpty())
-                return last();
-        return (AudioClip*) 0;
-}
+// Untested functions, which aren't in use anyways...
+// AudioClip * AudioClipList::next( AudioClip * clip )
+// {
+//     AudioProcessingItem* item = begin();
+//     while(item) {
+//             AudioClip* c = (AudioClip*)item;
+//             if (clip == c) {
+//                     return (AudioClip*)c->next;
+//             }
+//             item = item->next;
+//     }
+//     
+//         return (AudioClip*) 0;
+// }
+// 
+// AudioClip * AudioClipList::prev( AudioClip * clip )
+// {
+//     if (size() <= 1) {
+//             return 0;
+//     }
+//     
+//     AudioProcessingItem* item = begin();
+//     AudioProcessingItem* prev = item;
+//     item = item->next;
+//     
+//     while (item) {
+//             AudioClip* c = (AudioClip*)item;
+//             if (clip == c) {
+//                     return (AudioClip*)prev;
+//             }
+//             prev = item;
+//             item = item->next;
+//     }
+//     
+//     return (AudioClip*) 0;
+// }
+
 
 //eof
 

Index: core/AudioClipList.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/AudioClipList.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- core/AudioClipList.h        20 Apr 2006 14:51:39 -0000      1.1
+++ core/AudioClipList.h        12 Nov 2007 18:52:13 -0000      1.2
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2005-2006 Remon Sijrier 
+    Copyright (C) 2005-2007 Remon Sijrier 
  
     This file is part of Traverso
  
@@ -17,37 +17,60 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
  
-    $Id: AudioClipList.h,v 1.1 2006/04/20 14:51:39 r_sijrier Exp $
+    $Id: AudioClipList.h,v 1.2 2007/11/12 18:52:13 r_sijrier Exp $
 */
 
 #ifndef AUDIOCLIPLIST_H
 #define AUDIOCLIPLIST_H
 
-#include <QList>
+#include "APILinkedList.h"
+#include "AudioClip.h"
 
-class AudioClip;
-
-class AudioClipList : public QList<AudioClip* >
+class AudioClipList : public APILinkedList
 {
 
 public:
-        AudioClipList()
-        {}
-        ~AudioClipList()
-        {}
+       AudioClipList() : APILinkedList() {}
+        ~AudioClipList() {}
 
         void add_clip(AudioClip* clip);
         int remove_clip(AudioClip* clip);
-        AudioClip* next(AudioClip* clip);
-        AudioClip* prev(AudioClip* clip);
+//         AudioClip* next(AudioClip* clip);
+//         AudioClip* prev(AudioClip* clip);
 
         AudioClip* get_last();
-
-private:
-        void sort();
-        int clip_index(AudioClip* clip);
 };
 
+
+inline void AudioClipList::add_clip( AudioClip * clip )
+{
+       AudioProcessingItem* item = begin();
+       AudioProcessingItem* after = 0;
+       while(item) {
+               AudioClip* c = (AudioClip*)item;
+               if(c->get_track_start_location() < 
clip->get_track_start_location()) {
+                       after = c;
+               }
+               item = item->next;
+       }
+       
+       if(!after) {
+//             printf("prepending clip\n");
+               prepend(clip);
+       } else {
+//             AudioClip* c = ((AudioClip*)after);
+//             printf("appending clip\n after: %d, clip %d\n", 
c->get_track_start_location().to_frame(44100), 
clip->get_track_start_location().to_frame(44100));
+               add_after(after, clip);
+       }
+}
+
+
+inline int AudioClipList::remove_clip( AudioClip * clip )
+{
+       return remove(clip);
+}
+
+
 #endif
 
 //eof

Index: core/Song.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/Song.cpp,v
retrieving revision 1.151
retrieving revision 1.152
diff -u -b -r1.151 -r1.152
--- core/Song.cpp       5 Nov 2007 15:49:30 -0000       1.151
+++ core/Song.cpp       12 Nov 2007 18:52:13 -0000      1.152
@@ -255,8 +255,11 @@
        
        QDomNode tracksNode = doc.createElement("Tracks");
 
-       foreach(Track* track, m_tracks) {
+       AudioProcessingItem* item = m_tracks.begin();
+       while(item) {
+               Track* track = (Track*)item;
                tracksNode.appendChild(track->get_state(doc, istemplate));
+               item = m_tracks.get_next(item);
        }
 
        songNode.appendChild(tracksNode);
@@ -302,11 +305,14 @@
 
 Command* Song::add_track(Track* track, bool historable)
 {
-       foreach(Track* existingTrack, m_tracks) {
-               if (existingTrack->is_solo()) {
+       AudioProcessingItem* item = m_tracks.begin();
+       while(item) {
+               Track* track = (Track*)item;
+               if (track->is_solo()) {
                        track->set_muted_by_solo( true );
                        break;
                }
+               item = m_tracks.get_next(item);
        }
 
        return new AddRemove(this, track, historable, this,
@@ -326,10 +332,12 @@
 
 bool Song::any_track_armed()
 {
-       foreach(Track* track, m_tracks) {
-               if (track->armed()) {
+       AudioProcessingItem* item = m_tracks.begin();
+       while(item) {
+               if (((Track*)item)->armed()) {
                        return true;
                }
+               item = m_tracks.get_next(item);
        }
        return false;
 }
@@ -368,7 +376,9 @@
 
        TimeRef endlocation, startlocation;
 
-       foreach (Track* track, m_tracks) {
+       AudioProcessingItem* item = m_tracks.begin();
+       while(item) {
+               Track* track = (Track*)item;
                track->get_render_range(startlocation, endlocation);
 
                if (track->is_solo()) {
@@ -385,6 +395,7 @@
                        spec->startLocation = startlocation;
                }
 
+               item = m_tracks.get_next(item);
        }
        
        if (spec->isCdExport) {
@@ -639,14 +650,20 @@
        t->set_solo(!wasSolo);
 
        bool hasSolo = false;
-       foreach(Track* track, m_tracks) {
+       AudioProcessingItem* item = m_tracks.begin();
+       while(item) {
+               Track* track = (Track*)item;
                track->set_muted_by_solo(!track->is_solo());
                if (track->is_solo()) hasSolo = true;
+               item = m_tracks.get_next(item);
        }
 
        if (!hasSolo) {
-               foreach(Track* track, m_tracks) {
+               AudioProcessingItem* item = m_tracks.begin();
+               while(item) {
+                       Track* track = (Track*)item;
                        track->set_muted_by_solo(false);
+                       item = m_tracks.get_next(item);
                }
        }
 }
@@ -654,13 +671,19 @@
 Command* Song::toggle_solo()
 {
        bool hasSolo = false;
-       foreach(Track* track, m_tracks) {
+       AudioProcessingItem* item = m_tracks.begin();
+       while(item) {
+               Track* track = (Track*)item;
                if (track->is_solo()) hasSolo = true;
+               item = m_tracks.get_next(item);
        }
 
-       foreach(Track* track, m_tracks) {
+       item = m_tracks.begin();
+       while(item) {
+               Track* track = (Track*)item;
                track->set_solo(!hasSolo);
                track->set_muted_by_solo(false);
+               item = m_tracks.get_next(item);
        }
 
        return (Command*) 0;
@@ -669,12 +692,18 @@
 Command *Song::toggle_mute()
 {
        bool hasMute = false;
-       foreach(Track* track, m_tracks) {
+       AudioProcessingItem* item = m_tracks.begin();
+       while(item) {
+               Track* track = (Track*)item;
                if (track->is_muted()) hasMute = true;
+               item = m_tracks.get_next(item);
        }
 
-       foreach(Track* track, m_tracks) {
+       item = m_tracks.begin();
+       while(item) {
+               Track* track = (Track*)item;
                track->set_muted(!hasMute);
+               item = m_tracks.get_next(item);
        }
 
        return (Command*) 0;
@@ -683,16 +712,22 @@
 Command *Song::toggle_arm()
 {
        bool hasArmed = false;
-       foreach(Track* track, m_tracks) {
+       AudioProcessingItem* item = m_tracks.begin();
+       while(item) {
+               Track* track = (Track*)item;
                if (track->armed()) hasArmed = true;
+               item = m_tracks.get_next(item);
        }
 
-       foreach(Track* track, m_tracks) {
+       item = m_tracks.begin();
+       while(item) {
+               Track* track = (Track*)item;
                if (hasArmed) {
                        track->disarm();
                } else {
                        track->arm();
                }
+               item = m_tracks.get_next(item);
        }
 
        return (Command*) 0;
@@ -772,8 +807,11 @@
        int processResult = 0;
 
        // Process all Tracks.
-       for (int i=0; i<m_tracks.size(); ++i) {
-               processResult |= m_tracks.at(i)->process(nframes);
+       AudioProcessingItem* item = m_tracks.begin();
+       while(item) {
+               Track* track = (Track*)item;
+               processResult |= track->process(nframes);
+               item = m_tracks.get_next(item);
        }
 
        // update the m_transportFrame
@@ -803,8 +841,10 @@
        memset (mixdown, 0, sizeof (audio_sample_t) * nframes);
 
        // Process all Tracks.
-       for (int i=0; i<m_tracks.size(); ++i) {
-               m_tracks.at(i)->process(nframes);
+       AudioProcessingItem* item = m_tracks.begin();
+       while(item) {
+               Track* track = (Track*)item;
+               track->process(nframes);
        }
 
        Mixer::apply_gain_to_buffer(m_masterOut->get_buffer(0, nframes), 
nframes, get_gain());
@@ -942,11 +982,14 @@
        m_renderBus->set_buffer_size(size);
        
        if (updateArmStatus) {
-               foreach(Track* track, m_tracks) {
+               AudioProcessingItem* item = m_tracks.begin();
+               while(item) {
+                       Track* track = (Track*)item;
                        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);
                }
        }
 }
@@ -987,9 +1030,17 @@
        return firstVisibleFrame;
 }
 
-QList<Track* > Song::get_tracks( ) const
+QList<Track* > Song::get_tracks( )
 {
-       return m_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
@@ -1007,12 +1058,17 @@
        return m_pluginChain;
 }
 
-int Song::get_track_index(qint64 id) const
+int Song::get_track_index(qint64 id)
 {
-       for (int i=0; i<m_tracks.size(); ++i) {
-               if (m_tracks.at(i)->get_id() == id) {
+       AudioProcessingItem* item = m_tracks.begin();
+       int i=0;
+       while(item) {
+               Track* track = (Track*)item;
+               if (track->get_id() == id) {
                        return i + 1;
                }
+               ++i;
+               item = m_tracks.get_next(item);
        }
        return 0;
 }
@@ -1052,15 +1108,18 @@
 
 void Song::private_remove_track(Track* track)
 {
-       m_tracks.removeAll(track);
+       m_tracks.remove(track);
 }
 
 Track* Song::get_track(qint64 id)
 {
-       for (int i=0; i<m_tracks.size(); ++i) {
-               if (m_tracks.at(i)->get_id() == id) {
-                       return m_tracks.at(i);
+       AudioProcessingItem* item = m_tracks.begin();
+       while(item) {
+               Track* track = (Track*)item;
+               if (track->get_id() == id) {
+                       return track;
                }
+               item = m_tracks.get_next(item);
        }
        return 0;
 }
@@ -1279,7 +1338,9 @@
        if (m_recording && any_track_armed()) {
                CommandGroup* group = new CommandGroup(this, "");
                int clipcount = 0;
-               foreach(Track* track, m_tracks) {
+               AudioProcessingItem* item = m_tracks.begin();
+               while(item) {
+                       Track* track = (Track*)item;
                        if (track->armed()) {
                                AudioClip* clip = track->init_recording();
                                if (clip) {
@@ -1287,6 +1348,7 @@
                                        clipcount++;
                                }
                        }
+                       item = m_tracks.get_next(item);
                }
                group->setText(tr("Recording to %n Clip(s)", "", clipcount));
                Command::process_command(group);

Index: core/Song.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/Song.h,v
retrieving revision 1.71
retrieving revision 1.72
diff -u -b -r1.71 -r1.72
--- core/Song.h 12 Oct 2007 10:06:30 -0000      1.71
+++ core/Song.h 12 Nov 2007 18:52:13 -0000      1.72
@@ -23,8 +23,10 @@
 #define SONG_H
 
 #include "ContextItem.h"
+#include "AudioProcessingItem.h"
 #include <QDomNode>
 #include "defines.h"
+#include "APILinkedList.h"
 #include "GainEnvelope.h"
 
 class Project;
@@ -46,7 +48,7 @@
 
 struct ExportSpecification;
 
-class Song : public ContextItem
+class Song : public ContextItem, public AudioProcessingItem
 {
        Q_OBJECT
        Q_CLASSINFO("start_transport", tr("Play"))
@@ -79,7 +81,7 @@
        int get_rate();
        int get_bitdepth();
        int get_numtracks() const {return m_tracks.size();}
-       int get_track_index(qint64 id) const;
+       int get_track_index(qint64 id);
        int get_mode() const {return m_mode;}
        int is_transport_rolling() const {return m_transport;}
        void get_scrollbar_xy(int& x, int& y) {x = m_sbx; y = m_sby;}
@@ -94,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() const;
+       QList<Track* > get_tracks();
        
        DiskIO* get_diskio() const;
        AudioClipManager* get_audioclip_manager() const;
@@ -152,7 +154,7 @@
 #endif
 
 private:
-       QList<Track* >          m_tracks;
+       APILinkedList           m_tracks;
        Project*                m_project;
        WriteSource*            m_exportSource;
        AudioBus*               m_playBackBus;
@@ -161,7 +163,6 @@
        AudioBus*               m_renderBus;
        DiskIO*                 m_diskio;
        AudioClipManager*       m_acmanager;
-       PluginChain*            m_pluginChain;
        TimeLine*               m_timeline;
 
        // The following data could be read/written by multiple threads
@@ -200,7 +201,6 @@
        bool            m_readyToRecord;
        SnapList*       snaplist;
        Snappable*      workSnap;
-       GainEnvelope*   m_fader;
        
        void init();
 

Index: core/Track.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/Track.cpp,v
retrieving revision 1.72
retrieving revision 1.73
diff -u -b -r1.72 -r1.73
--- core/Track.cpp      5 Nov 2007 15:49:30 -0000       1.72
+++ core/Track.cpp      12 Nov 2007 18:52:13 -0000      1.73
@@ -75,7 +75,7 @@
 
 void Track::init()
 {
-       isSolo = mutedBySolo = isMuted = isArmed = false;
+       isSolo = mutedBySolo = m_isMuted = isArmed = false;
        set_history_stack(m_song->get_history_stack());
        m_pluginChain = new PluginChain(this, m_song);
        m_fader = m_pluginChain->get_fader();
@@ -91,7 +91,7 @@
        }
        node.setAttribute("name", m_name);
        node.setAttribute("pan", m_pan);
-       node.setAttribute("mute", isMuted);
+       node.setAttribute("mute", m_isMuted);
        node.setAttribute("solo", isSolo);
        node.setAttribute("mutedbysolo", mutedBySolo);
        node.setAttribute("height", m_height);
@@ -105,7 +105,9 @@
        if (! istemplate ) {
                QDomNode clips = doc.createElement("Clips");
        
-               foreach(AudioClip* clip, audioClipList) {
+               AudioProcessingItem* item = audioClipList.begin();
+               while(item) {
+                       AudioClip* clip = (AudioClip*)item;
                        if (clip->get_length() == qint64(0)) {
                                PERROR("Clip lenght is 0! This shouldn't 
happen!!!!");
                                continue;
@@ -114,6 +116,8 @@
                        QDomElement clipNode = doc.createElement("Clip");
                        clipNode.setAttribute("id", clip->get_id() );
                        clips.appendChild(clipNode);
+                       
+                       item = item->next;
                }
                
                node.appendChild(clips);
@@ -189,24 +193,29 @@
 
 AudioClip* Track::get_clip_after(const TimeRef& pos)
 {
-       AudioClip* clip;
-       for (int i=0; i < audioClipList.size(); ++i) {
-               clip = audioClipList.at(i);
-               if (clip->get_track_start_location() > pos)
+       AudioProcessingItem* item = audioClipList.begin();
+       while(item) {
+               AudioClip* clip = (AudioClip*)item;
+               if (clip->get_track_start_location() > pos) {
                        return clip;
        }
+               
+               item = item->next;
+       }
        return (AudioClip*) 0;
 }
 
 
 AudioClip* Track::get_clip_before(const TimeRef& pos)
 {
-       AudioClip* clip;
-       for (int i=0; i < audioClipList.size(); ++i) {
-               clip = audioClipList.at(i);
-               if (clip->get_track_start_location() < pos)
+       AudioProcessingItem* item = audioClipList.begin();
+       while(item) {
+               AudioClip* clip = (AudioClip*)item;
+               if (clip->get_track_start_location() < pos) {
                        return clip;
        }
+               item = item->next;
+       }
        return (AudioClip*) 0;
 }
 
@@ -285,11 +294,6 @@
        return isSolo;
 }
 
-bool Track::is_muted()
-{
-       return isMuted;
-}
-
 bool Track::is_muted_by_solo()
 {
        return mutedBySolo;
@@ -365,7 +369,7 @@
 
 int Track::get_total_clips()
 {
-       return audioClipList.count();
+       return audioClipList.size();
 }
 
 void Track::set_muted_by_solo(bool muted)
@@ -386,8 +390,8 @@
 
 void Track::set_muted( bool muted )
 {
-       isMuted = muted;
-       emit muteChanged(isMuted);
+       m_isMuted = muted;
+       emit muteChanged(m_isMuted);
        emit audibleStateChanged();
 }
 
@@ -405,7 +409,7 @@
 {
        int processResult = 0;
        
-       if ( (isMuted || mutedBySolo) && ( ! isArmed) ) {
+       if ( (m_isMuted || mutedBySolo) && ( ! isArmed) ) {
                return 0;
        }
        
@@ -420,23 +424,28 @@
 
        m_pluginChain->process_pre_fader(bus, nframes);
        
-       for (int i=0; i<audioClipList.size(); ++i) {
-       
-               AudioClip* clip = audioClipList.at(i);
+       AudioProcessingItem* item = audioClipList.begin();
+       while(item) {
+               AudioClip* clip = (AudioClip*)item;
                
                if (isArmed && clip->recording_state() == 
AudioClip::NO_RECORDING) {
-                       if (isMuted || mutedBySolo)
+                       if (m_isMuted || mutedBySolo) {
+                               item = item->next;
                                continue;
                }
+               }
                
                
                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) {
@@ -467,7 +476,7 @@
 Command* Track::mute()
 {
        PENTER;
-       set_muted(!isMuted);
+       set_muted(!m_isMuted);
        
        return (Command*) 0;
 }
@@ -506,10 +515,9 @@
        endlocation = TimeRef();
        startlocation = LONG_LONG_MAX;
        
-       AudioClip* clip;
-       
-       for(int i=0; i < audioClipList.size(); ++i) {
-               clip = audioClipList.at( i );
+       AudioProcessingItem* item = audioClipList.begin();
+       while(item) {
+               AudioClip* clip = (AudioClip*)item;
                
                if (! clip->is_muted() ) {
                        if (clip->get_track_end_location() > endlocation) {
@@ -520,18 +528,10 @@
                                startlocation = 
clip->get_track_start_location();
                        }
                }
-       }
-       
-}
 
-void Track::private_add_clip(AudioClip* clip)
-{
-       audioClipList.add_clip(clip);
-}
+               item = item->next;
+       }
 
-void Track::private_remove_clip(AudioClip* clip)
-{
-       audioClipList.remove_clip(clip);
 }
 
 Command* Track::add_plugin( Plugin * plugin )

Index: core/Track.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/Track.h,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -b -r1.33 -r1.34
--- core/Track.h        12 Oct 2007 08:52:13 -0000      1.33
+++ core/Track.h        12 Nov 2007 18:52:14 -0000      1.34
@@ -31,6 +31,7 @@
 #include "ContextItem.h"
 #include "AudioClipList.h"
 #include "GainEnvelope.h"
+#include "AudioProcessingItem.h"
 
 #include "defines.h"
 
@@ -39,7 +40,7 @@
 class PluginChain;
 class Plugin;
 
-class Track : public ContextItem
+class Track : public ContextItem, public AudioProcessingItem
 {
        Q_OBJECT
        Q_CLASSINFO("mute", tr("Mute"))
@@ -98,7 +99,6 @@
 
 
        //Bool functions:
-       bool is_muted();
        bool is_muted_by_solo();
        bool is_solo();
        bool armed();
@@ -118,9 +118,7 @@
 private :
        Song*           m_song;
        AudioClipList   audioClipList;
-       PluginChain*    m_pluginChain;
 
-       GainEnvelope* m_fader;
        float   m_pan;
        int numtakes;
        QByteArray busIn;
@@ -132,7 +130,6 @@
        int m_height;
 
        bool isSolo;
-       bool isMuted;
        bool isArmed;
        bool mutedBySolo;
        bool m_captureLeftChannel;
@@ -178,5 +175,15 @@
        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: engine/AudioDevice.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/engine/AudioDevice.cpp,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -b -r1.46 -r1.47
--- engine/AudioDevice.cpp      25 Oct 2007 15:43:19 -0000      1.46
+++ engine/AudioDevice.cpp      12 Nov 2007 18:52:14 -0000      1.47
@@ -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.46 2007/10/25 15:43:19 r_sijrier Exp $
+$Id: AudioDevice.cpp,v 1.47 2007/11/12 18:52:14 r_sijrier Exp $
 */
 
 #include "AudioDevice.h"
@@ -264,11 +264,16 @@
                return -1;
        }
 
-       for (int i=0; i<clients.size(); ++i) {
-               if (clients.at(i)->process(nframes) < 0) {
-                       // ?
+       AudioProcessingItem* item = m_clients.begin();
+       while(item) {
+               ((Client*)item)->process(nframes);
+               item = m_clients.get_next(item);
                }
+/*     for (int i=0; i<m_clients.size(); ++i) {
+               if (m_clients.at(i)->process(nframes) < 0) {
+                       // ?
        }
+       }*/
        
        if (driver->write(nframes) < 0) {
                qDebug("driver write failed!");
@@ -669,19 +674,14 @@
 
 void AudioDevice::private_add_client(Client* client)
 {
-//     printf("Adding client %s\n", client->m_name.toAscii().data());
-       clients.append(client);
+       m_clients.prepend(client);
 }
 
 void AudioDevice::private_remove_client(Client* client)
 {
-       int index = clients.indexOf(client);
-
-       if (index >= 0) {
-               clients.removeAt( index );
+       if (!m_clients.remove(client)) {
+               printf("AudioDevice:: Client was not in clients list, failed to 
remove it!\n");
        }
-
-//     printf("Removing client %s\n", client->m_name.toAscii().data());
 }
 
 /**
@@ -768,9 +768,16 @@
 #endif 
 
        int result = 0;
-       for (int i=0; i<clients.size(); ++i) {
-               result = clients.at(i)->transport_control(state);
+/*     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);
        }
+       
        return result;
 }
 

Index: engine/AudioDevice.h
===================================================================
RCS file: /sources/traverso/traverso/src/engine/AudioDevice.h,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -b -r1.25 -r1.26
--- engine/AudioDevice.h        20 Oct 2007 17:43:55 -0000      1.25
+++ engine/AudioDevice.h        12 Nov 2007 18:52:14 -0000      1.26
@@ -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.h,v 1.25 2007/10/20 17:43:55 r_sijrier Exp $
+$Id: AudioDevice.h,v 1.26 2007/11/12 18:52:14 r_sijrier Exp $
 */
 
 #ifndef AUDIODEVICE_H
@@ -25,6 +25,7 @@
 
 #include <QObject>
 #include <QList>
+#include <QVector>
 #include <QHash>
 #include <QStringList>
 #include <QByteArray>
@@ -33,6 +34,7 @@
 
 
 #include "RingBufferNPT.h"
+#include "APILinkedList.h"
 #include "defines.h"
 
 class AudioDeviceThread;
@@ -143,7 +145,7 @@
 
        Driver*                                 driver;
        AudioDeviceThread*                      audioThread;
-       QList<Client *>                         clients;
+       APILinkedList                           m_clients;
        QHash<QByteArray, AudioChannel* >       playbackChannels;
        QHash<QByteArray, AudioChannel* >       captureChannels;
        QHash<QByteArray, AudioBus* >           playbackBuses;

Index: engine/Client.h
===================================================================
RCS file: /sources/traverso/traverso/src/engine/Client.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- engine/Client.h     22 Jun 2007 12:29:28 -0000      1.5
+++ engine/Client.h     12 Nov 2007 18:52:14 -0000      1.6
@@ -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.5 2007/06/22 12:29:28 r_sijrier Exp $
+$Id: Client.h,v 1.6 2007/11/12 18:52:14 r_sijrier Exp $
 */
 
 #ifndef CLIENT_H
@@ -25,10 +25,11 @@
 
 #include <QString>
 #include <QObject>
+#include "AudioProcessingItem.h"
 
 #include "defines.h"
 
-class Client : public QObject
+class Client : public QObject, public AudioProcessingItem
 {
        Q_OBJECT
 

Index: traverso/songcanvas/AudioClipView.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/traverso/songcanvas/AudioClipView.cpp,v
retrieving revision 1.116
retrieving revision 1.117
diff -u -b -r1.116 -r1.117
--- traverso/songcanvas/AudioClipView.cpp       9 Nov 2007 14:22:31 -0000       
1.116
+++ traverso/songcanvas/AudioClipView.cpp       12 Nov 2007 18:52:14 -0000      
1.117
@@ -337,7 +337,7 @@
                if (!m_classicView) {
                        for (int chan=0; chan < channels; chan++) {
                                for (int i=0, j=0; i < (pixelcount*2); i+=2, 
++j) {
-                                       pixeldata[chan][j] = - 
f_max(pixeldata[chan][i], - pixeldata[chan][i+1]);
+                                       pixeldata[chan][j] = - 
fabs(f_max(pixeldata[chan][i], - pixeldata[chan][i+1]));
                                }
                        }
                }
@@ -500,8 +500,10 @@
                        
                                p->setMatrix(matrix().translate(xstart + 
adjustforevenpixel, ytrans), true);
                                
-                               p->drawLine(0, 0, pixelcount, 0);
                                p->drawPath(pathtop);
+                               // Draw 'the' -INF line
+                               p->setPen(minINFLineColor);
+                               p->drawLine(0, 0, pixelcount, 0);
                        
                        } else {
                                QPainterPath path;
@@ -849,6 +851,7 @@
        m_classicView = ! config().get_property("Themer", 
"paintaudiorectified", false).toBool();
        m_mergedView = config().get_property("Themer", 
"paintstereoaudioasmono", false).toBool();
        m_fillwave = themer()->get_property("AudioClip:fillwave", 1).toInt();
+       minINFLineColor = 
themer()->get_color("AudioClip:wavemicroview").dark(115);
        calculate_bounding_rect();
 }
 

Index: traverso/songcanvas/AudioClipView.h
===================================================================
RCS file: /sources/traverso/traverso/src/traverso/songcanvas/AudioClipView.h,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -b -r1.33 -r1.34
--- traverso/songcanvas/AudioClipView.h 16 Oct 2007 19:49:24 -0000      1.33
+++ traverso/songcanvas/AudioClipView.h 12 Nov 2007 18:52:14 -0000      1.34
@@ -105,6 +105,7 @@
        QColor m_backgroundColorBottom;
        QColor m_backgroundColorMouseHoverTop;
        QColor m_backgroundColorMouseHoverBottom;
+       QColor minINFLineColor;
        QBrush m_waveBrush;
        QBrush m_brushBgRecording;
        QBrush m_brushBgMuted;

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




reply via email to

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