[Top][All Lists]
[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;
}
}
- [Traverso-commit] traverso/src core/AudioClip.cpp core/AudioClip....,
Remon Sijrier <=