[Top][All Lists]
[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;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Traverso-commit] traverso CMakeLists.txt src/commands/Import.cpp...,
Remon Sijrier <=