[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Traverso-commit] traverso/src core/Peak.cpp core/Peak.h traverso...
From: |
Remon Sijrier |
Subject: |
[Traverso-commit] traverso/src core/Peak.cpp core/Peak.h traverso... |
Date: |
Thu, 19 Apr 2007 19:58:39 +0000 |
CVSROOT: /sources/traverso
Module name: traverso
Changes by: Remon Sijrier <r_sijrier> 07/04/19 19:58:39
Modified files:
src/core : Peak.cpp Peak.h
src/traverso/songcanvas: AudioClipView.cpp AudioClipView.h
Log message:
* populate polygon with peak data from one higher zoomlevel
and stretch by a factor 2
Everyone who claims to still understand the peak/audioclip drawing code
now
gets a bonus feature for free :-P
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Peak.cpp?cvsroot=traverso&r1=1.16&r2=1.17
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Peak.h?cvsroot=traverso&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/songcanvas/AudioClipView.cpp?cvsroot=traverso&r1=1.44&r2=1.45
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/songcanvas/AudioClipView.h?cvsroot=traverso&r1=1.21&r2=1.22
Patches:
Index: core/Peak.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/Peak.cpp,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -b -r1.16 -r1.17
--- core/Peak.cpp 17 Apr 2007 19:56:46 -0000 1.16
+++ core/Peak.cpp 19 Apr 2007 19:58:39 -0000 1.17
@@ -1,5 +1,5 @@
/*
-Copyright (C) 2005-2006 Remon Sijrier
+Copyright (C) 2005-2007 Remon Sijrier
This file is part of Traverso
@@ -17,7 +17,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-$Id: Peak.cpp,v 1.16 2007/04/17 19:56:46 r_sijrier Exp $
*/
#include "libtraversocore.h"
@@ -43,10 +42,10 @@
#define NORMALIZE_CHUNK_SIZE 10000
#define PEAKFILE_MAJOR_VERSION 0
-#define PEAKFILE_MINOR_VERSION 5
+#define PEAKFILE_MINOR_VERSION 7
-int Peak::zoomStep[ZOOM_LEVELS] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512,
1024, 2048, 4096,
- 8192, 16384, 32768, 65536, 131072};
+int Peak::zoomStep[] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048,
4096,
+ 8192, 16384, 32768, 65536, 131072, 262144};
Peak::Peak(AudioSource* source, int channel)
: m_channel(channel)
@@ -270,7 +269,7 @@
return pixelcount;
- } else if (zoomLevel > MAX_ZOOM_USING_SOURCEFILE) {
+ } else if ( (zoomLevel - 1) > MAX_ZOOM_USING_SOURCEFILE) {
int offset = (startPos / zoomStep[zoomLevel]) * 2;
@@ -416,7 +415,7 @@
m_data.peakDataSizeForLevel[0] = processBufferSize;
totalBufferSize += processBufferSize;
- for( int i = SAVING_ZOOM_FACTOR + 1; i < ZOOM_LEVELS; ++i) {
+ for( int i = SAVING_ZOOM_FACTOR + 1; i < ZOOM_LEVELS+1; ++i) {
int size = processBufferSize / dividingFactor;
m_data.peakDataSizeForLevel[i - SAVING_ZOOM_FACTOR] = size;
totalBufferSize += size;
@@ -443,7 +442,7 @@
m_data.peakDataSizeForLevel[0] = processBufferSize;
m_data.peakDataLevelOffsets[0] = m_data.peakDataOffset;
- for (int i = SAVING_ZOOM_FACTOR+1; i < ZOOM_LEVELS; ++i) {
+ for (int i = SAVING_ZOOM_FACTOR+1; i < ZOOM_LEVELS+1; ++i) {
int prevLevelSize = m_data.peakDataSizeForLevel[i -
SAVING_ZOOM_FACTOR - 1];
m_data.peakDataLevelOffsets[i - SAVING_ZOOM_FACTOR] =
m_data.peakDataLevelOffsets[i - SAVING_ZOOM_FACTOR - 1] + prevLevelSize;
Index: core/Peak.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/Peak.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- core/Peak.h 2 Apr 2007 09:52:31 -0000 1.8
+++ core/Peak.h 19 Apr 2007 19:58:39 -0000 1.9
@@ -1,5 +1,5 @@
/*
-Copyright (C) 2005-2006 Remon Sijrier
+Copyright (C) 2005-2007 Remon Sijrier
This file is part of Traverso
@@ -17,7 +17,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-$Id: Peak.h,v 1.8 2007/04/02 09:52:31 r_sijrier Exp $
*/
#ifndef PEAK_H
@@ -60,7 +59,7 @@
static const int ZOOM_LEVELS = 18;
static const int MAX_ZOOM_USING_SOURCEFILE;
static const int MAX_DB_VALUE;
- static int zoomStep[ZOOM_LEVELS];
+ static int zoomStep[ZOOM_LEVELS + 1];
Peak(AudioSource* source, int channel = -1);
~Peak();
Index: traverso/songcanvas/AudioClipView.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/traverso/songcanvas/AudioClipView.cpp,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -b -r1.44 -r1.45
--- traverso/songcanvas/AudioClipView.cpp 19 Apr 2007 12:50:31 -0000
1.44
+++ traverso/songcanvas/AudioClipView.cpp 19 Apr 2007 19:58:39 -0000
1.45
@@ -55,9 +55,8 @@
m_sv = sv;
m_tv->scene()->addItem(this);
- m_clipnamePixmap = QPixmap();
-
load_theme_data();
+ create_clipinfo_string();
m_waitingForPeaks = false;
m_progress = m_peakloadingcount = 0;
@@ -84,7 +83,7 @@
if (m_clip->recording_state() == AudioClip::RECORDING) {
start_recording();
- connect(m_clip, SIGNAL(recordingFinished()), this,
SLOT(stop_recording()));
+ connect(m_clip, SIGNAL(recordingFinished()), this,
SLOT(finish_recording()));
}
// setFlags(ItemIsSelectable | ItemIsMovable);
@@ -112,12 +111,6 @@
return;
}
- if (m_clip->recording_state() == AudioClip::RECORDING) {
-// painter->fillRect(xstart, 0, pixelcount, m_height,
themer()->get_color("AudioClip:background:recording"));
- // For now, just exit. For later, draw the recording audio :-)
-// return;
- }
-
painter->save();
QRectF clipRect = m_boundingRect;
@@ -125,7 +118,7 @@
clipRect.setHeight(clipRect.height());
painter->setClipRect(clipRect);
- if (false) {
+ if (m_drawbackground) {
bool mousehover = (option->state & QStyle::State_MouseOver);
if (m_clip->recording_state() == AudioClip::RECORDING) {
@@ -215,7 +208,6 @@
{
PENTER2;
- // FIXME ?
// when painting with a path, I _have_ to use path.lineTo()
// which looks ugly when only parts of the clip is repainted
// when using a different color for the brush then the outline.
@@ -251,7 +243,10 @@
// for a certain Peak object, schedule it for loading.
for (int chan=0; chan < channels; chan++) {
Peak* peak = m_clip->get_peak_for_channel(chan);
- int availpeaks = peak->calculate_peaks(buffers[chan],
m_song->get_hzoom(), xstart * m_sv->scalefactor +
m_clip->get_source_start_frame(), peakdatacount);
+ int availpeaks = peak->calculate_peaks( buffers[chan],
+ microView ?
m_song->get_hzoom() : m_song->get_hzoom() + 1,
+ (xstart *
m_sv->scalefactor) + m_clip->get_source_start_frame(),
+ microView ?
peakdatacount : peakdatacount / 2);
if (peakdatacount != availpeaks) {
// PWARN("peakdatacount != availpeaks (%d, %d)",
peakdatacount, availpeaks);
@@ -323,11 +318,13 @@
for (int i = 0; i < (pixelcount*2);
++i) {
pixeldata[chan][i] *=
curvemixdown[curvemixdownpos];
i++;
- pixeldata[chan][i] *=
curvemixdown[curvemixdownpos++];
+ pixeldata[chan][i] *=
curvemixdown[curvemixdownpos];
+ curvemixdownpos += 2;
}
} else {
for (int i = 0; i < (pixelcount*2);
i+=2) {
- pixeldata[chan][i] *=
curvemixdown[curvemixdownpos++];
+ pixeldata[chan][i] *=
curvemixdown[curvemixdownpos];
+ curvemixdownpos += 2;
}
}
}
@@ -383,12 +380,21 @@
// Microview, paint waveform as polyline
if (microView) {
-
p->setPen(themer()->get_color("AudioClip:wavemicroview"));
-
QPolygon polygon;
short* mbuffer = (short*) buffers[chan];
int bufferPos = 0;
+ ytrans = (height / 2) + (chan * height);
+ p->setMatrix(matrix().translate(1, ytrans).scale(1,
scaleFactor), true);
+
+ if (m_clip->is_selected()) {
+
p->setPen(themer()->get_color("AudioClip:channelseperator:selected"));
+ } else {
+
p->setPen(themer()->get_color("AudioClip:channelseperator"));
+ }
+
+ p->drawLine(xstart, 0, xstart + pixelcount, 0);
+
for (int x = xstart; x < (pixelcount+xstart); x++) {
polygon.append( QPoint(x, mbuffer[bufferPos++])
);
}
@@ -397,9 +403,7 @@
p->setRenderHints(QPainter::Antialiasing);
}
- ytrans = (height / 2) + (chan * height);
-
- p->setMatrix(matrix().translate(1, ytrans).scale(1,
scaleFactor), true);
+
p->setPen(themer()->get_color("AudioClip:wavemicroview"));
p->drawPolyline(polygon);
// Macroview, paint waveform with painterpath
@@ -427,14 +431,8 @@
int range = pixelcount+xstart;
for (int x = xstart; x < range; x+=2) {
- float ytop =
f_max(pixeldata[chan][bufferpos], pixeldata[chan][bufferpos + 2]);
- float ybotom =
f_max(pixeldata[chan][bufferpos + 1], pixeldata[chan][bufferpos + 3]);
- polygontop.append( QPointF(x, ytop) );
- polygonbottom.append( QPointF(x, -
ybotom) );
- bufferpos += 4;
-
-/* polygontop.append( QPointF(x,
pixeldata[chan][bufferpos++]) );
- polygonbottom.append( QPointF(x, -
pixeldata[chan][bufferpos++]) );*/
+ polygontop.append( QPointF(x,
pixeldata[chan][bufferpos++]) );
+ polygonbottom.append( QPointF(x, -
pixeldata[chan][bufferpos++]) );
}
path.addPolygon(polygontop);
@@ -444,7 +442,7 @@
ytrans = (height / 2) + (chan * height);
} else {
- for (int x = xstart; x < (pixelcount+xstart);
x++) {
+ for (int x = xstart; x < (pixelcount+xstart);
x+=2) {
polygontop.append( QPointF(x,
pixeldata[chan][bufferpos]) );
bufferpos += 2;
}
@@ -454,7 +452,7 @@
path.lineTo(xstart, 0);
ytrans = height + (chan * height);
- scaleFactor = 2 * ( (float) height * 0.95 /
(Peak::MAX_DB_VALUE * 2)) * m_clip->get_gain() * m_clip->get_norm_factor();
+ scaleFactor = (float) height * 0.95 *
m_clip->get_gain() * m_clip->get_norm_factor() / Peak::MAX_DB_VALUE;
}
if (m_mergedView) {
@@ -479,55 +477,22 @@
}
}
-
-
void AudioClipView::draw_clipinfo_area(QPainter* p, int xstart, int pixelcount)
{
// clip info area bg
p->fillRect(xstart, 0, pixelcount, m_infoAreaHeight,
themer()->get_color("AudioClip:clipinfobackground:inactive"));
-
- // Draw Clip Info Area
- p->drawPixmap(0, 0, m_clipnamePixmap, 0, 0, 600, m_infoAreaHeight);
+ // clip info, only if xstart lies in the stringlenght range which is
calculated by a rough estimate.
+ if (xstart < m_clipinfoString.size() * 6) {
+ p->setFont(themer()->get_font("AudioClip:title"));
+ p->drawText(5, 10, m_clipinfoString);
+ }
}
-
-void AudioClipView::recreate_clipname_pixmap()
+void AudioClipView::create_clipinfo_string()
{
PENTER;
- int channels = m_clip->get_channels();
- Q_ASSERT(channels < 8);
-
- int rate = m_clip->get_rate();
- int bitDepth = m_clip->get_bitdepth();
- bool isTake = m_clip->is_take();
- QString clipName = m_clip->get_name();
-
- QString sRate = QString::number(rate);
- QString sBitDepth = QString::number(bitDepth);
- QString sourceType = (isTake?"CAP":"SRC");
-
- QString sclipGain = "Gain: "+
coefficient_to_dbstring(m_clip->get_gain());
- QString sclipNormGain = "Norm: "+
coefficient_to_dbstring(m_clip->get_norm_factor());
-
- QString sMuted = "";
- if (m_clip->is_muted())
- sMuted = "M";
-
- QString clipInfo = clipName + " " + sclipGain + " " +
sclipNormGain + " " + sRate + " Hz";
- int clipInfoAreaWidth = 700;
-
- m_clipnamePixmap = QPixmap(clipInfoAreaWidth, m_infoAreaHeight);
-
- m_clipnamePixmap.fill(Qt::transparent);
-
-
- QPainter paint(&m_clipnamePixmap);
- paint.setRenderHint(QPainter::TextAntialiasing );
- paint.setPen(themer()->get_color("Text:dark"));
- paint.setFont(themer()->get_font("AudioClip:title"));
-
- QRect r = QRect(5, 0, clipInfoAreaWidth, m_infoAreaHeight);
- paint.drawText( r, Qt::AlignVCenter, clipInfo);
+ QString sclipGain = "Gain: "+
coefficient_to_dbstring(m_clip->get_gain() * m_clip->get_norm_factor());
+ m_clipinfoString = m_clip->get_name() + " " + sclipGain + " " +
QString::number(m_clip->get_rate()) + " Hz";
}
void AudioClipView::update_progress_info( int progress )
@@ -559,7 +524,7 @@
void AudioClipView::gain_changed( )
{
- recreate_clipname_pixmap();
+ create_clipinfo_string();
update();
}
@@ -596,7 +561,7 @@
void AudioClipView::repaint( )
{
- update();
+ update(m_boundingRect);
}
void AudioClipView::set_height( int height )
@@ -657,7 +622,6 @@
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();
- recreate_clipname_pixmap();
calculate_bounding_rect();
}
@@ -704,7 +668,7 @@
m_recordingTimer.start(750);
}
-void AudioClipView::stop_recording()
+void AudioClipView::finish_recording()
{
m_recordingTimer.stop();
prepareGeometryChange();
@@ -738,7 +702,6 @@
}
} else {
if (m_posIndicator) {
- scene()->removeItem(m_posIndicator);
delete m_posIndicator;
m_posIndicator = 0;
}
Index: traverso/songcanvas/AudioClipView.h
===================================================================
RCS file: /sources/traverso/traverso/src/traverso/songcanvas/AudioClipView.h,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -b -r1.21 -r1.22
--- traverso/songcanvas/AudioClipView.h 19 Apr 2007 12:52:03 -0000 1.21
+++ traverso/songcanvas/AudioClipView.h 19 Apr 2007 19:58:39 -0000 1.22
@@ -1,5 +1,5 @@
/*
-Copyright (C) 2005-2006 Remon Sijrier
+Copyright (C) 2005-2007 Remon Sijrier
This file is part of Traverso
@@ -17,7 +17,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-$Id: AudioClipView.h,v 1.21 2007/04/19 12:52:03 r_sijrier Exp $
*/
#ifndef AUDIO_CLIP_VIEW_H
@@ -78,7 +77,6 @@
QList<Peak*> m_peakloadinglist;
PositionIndicator* m_posIndicator;
- QPixmap m_clipnamePixmap;
QTimer m_recordingTimer;
float m_progress;
@@ -100,7 +98,9 @@
QColor m_backgroundColor;
QColor m_backgroundColorMouseHover;
- void recreate_clipname_pixmap();
+ QString m_clipinfoString;
+
+ void create_clipinfo_string();
void draw_clipinfo_area(QPainter* painter, int xstart, int pixelcount);
void draw_peaks(QPainter* painter, int xstart, int pixelcount);
@@ -125,7 +125,7 @@
void update_progress_info(int progress);
void peaks_creation_finished(Peak* peak);
void start_recording();
- void stop_recording();
+ void finish_recording();
void update_recording();
};
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Traverso-commit] traverso/src core/Peak.cpp core/Peak.h traverso...,
Remon Sijrier <=