traverso-commit
[Top][All Lists]
Advanced

[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();
 };
 




reply via email to

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