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 sheetcan...


From: Remon Sijrier
Subject: [Traverso-commit] traverso/src core/Peak.cpp core/Peak.h sheetcan...
Date: Mon, 28 Jan 2008 17:33:42 +0000

CVSROOT:        /sources/traverso
Module name:    traverso
Changes by:     Remon Sijrier <r_sijrier>       08/01/28 17:33:42

Modified files:
        src/core       : Peak.cpp Peak.h 
        src/sheetcanvas: AudioClipView.cpp 

Log message:
        * use qpainters matrix to scale the waveform when zoomlevel != power of 
2

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Peak.cpp?cvsroot=traverso&r1=1.80&r2=1.81
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Peak.h?cvsroot=traverso&r1=1.30&r2=1.31
http://cvs.savannah.gnu.org/viewcvs/traverso/src/sheetcanvas/AudioClipView.cpp?cvsroot=traverso&r1=1.2&r2=1.3

Patches:
Index: core/Peak.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/Peak.cpp,v
retrieving revision 1.80
retrieving revision 1.81
diff -u -b -r1.80 -r1.81
--- core/Peak.cpp       21 Jan 2008 16:22:14 -0000      1.80
+++ core/Peak.cpp       28 Jan 2008 17:33:41 -0000      1.81
@@ -85,10 +85,6 @@
                // peak data creation, no m_source needed!
                m_source = 0;
        }
-       
-       int error;
-       int converter_type = 4;
-       m_srcState = src_new(converter_type, 2, &error);
 }
 
 Peak::~Peak()
@@ -261,20 +257,18 @@
        }
        
        ChannelData* data = m_channelData.at(chan);
+       int produced = 0;
+       
+//     PROFILE_START;
        
+       // Macro view mode
+       if (zoomLevel >= 64) {
        int highbit;
        unsigned long nearestpow2 = nearest_power_of_two(qRound(zoomLevel), 
highbit);
        if (nearestpow2 == 0) {
                return NO_PEAKDATA_FOUND;
        }
        
-       int produced = 0;
-       float* inputData;
-       
-//     PROFILE_START;
-       
-       // Macro view mode
-       if ( nearestpow2 > 32) {
                nframes_t startPos = startlocation.to_frame(44100);
                
                int index = cache_index_lut()->value(nearestpow2, -1);
@@ -304,15 +298,24 @@
                        return NO_PEAKDATA_FOUND;
                }
                
-               inputData = data->peakdataDecodeBuffer->destination[0];
-               
 //             for (int i=(pixelcount-truncate); i<(pixelcount); ++i) {
 //                     data->peakdataDecodeBuffer->destination[0][i] = 0;
 //             }
 //             
+               *buffer = data->peakdataDecodeBuffer->destination[0];
+               
+               return pixelcount;
 
        // Micro view mode
        } else {
+               
+               int highbit;
+               unsigned long nearestpow2 = 
nearest_power_of_two(qRound(zoomLevel), highbit);
+               
+               if (nearestpow2 == 0) {
+                       nearestpow2 = 1;
+               }
+               
                // Calculate the amount of frames to be read
                nframes_t toRead = pixelcount * nearestpow2;
                
@@ -363,32 +366,12 @@
 //             PROFILE_END("Peak calculate_peaks");            
                
                // Assign the supplied buffer to the 'real' peakdata buffer.
-               inputData = peakdata;
+               *buffer = peakdata;
                
-               produced = count;
+               return count;
        }
 
-       src_reset(m_srcState);
-       qreal ratio = qreal(nearestpow2) / zoomLevel;
-       m_srcData.data_in = inputData;
-       m_srcData.input_frames = qRound(pixelcount / ratio);
-       m_srcData.data_out = data->peakdataDecodeBuffer->destination[1];
-       m_srcData.output_frames = pixelcount;
-       m_srcData.src_ratio = ratio;
-       src_set_ratio(m_srcState, m_srcData.src_ratio);
-               
-//             printf("scale factor %f, pixels generated %ld, wanted %d\n", 
ratio,  m_srcData.output_frames_gen, pixelcount);
-               
-       if (src_process(m_srcState, &m_srcData)) {
-               PERROR("Resampler: src_process() error!");
-               return NO_PEAKDATA_FOUND;
-       }
-               
-       produced = m_srcData.output_frames_gen;
-
-       *buffer = data->peakdataDecodeBuffer->destination[1];
-               
-       return produced;
+       return 0;
 }
 
 

Index: core/Peak.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/Peak.h,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -b -r1.30 -r1.31
--- core/Peak.h 21 Jan 2008 16:22:14 -0000      1.30
+++ core/Peak.h 28 Jan 2008 17:33:41 -0000      1.31
@@ -30,7 +30,6 @@
 #include <QFile>
 #include <QHash>
 #include <QPair>
-#include <samplerate.h>
 
 #include "defines.h"
 
@@ -133,10 +132,6 @@
        bool            m_interuptPeakBuild;
        static QHash<int, int> chacheIndexLut;
        
-       SRC_STATE*      m_srcState;
-       SRC_DATA        m_srcData;
-       audio_sample_t* m_peakBuffer;
-       
        struct ProcessData {
                ProcessData() {
                        normValue = peakUpperValue = peakLowerValue = 0;

Index: sheetcanvas/AudioClipView.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/sheetcanvas/AudioClipView.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- sheetcanvas/AudioClipView.cpp       21 Jan 2008 17:31:18 -0000      1.2
+++ sheetcanvas/AudioClipView.cpp       28 Jan 2008 17:33:42 -0000      1.3
@@ -236,6 +236,10 @@
        // Painting 2 more pixels makes it getting clipped away.....
        pixelcount += 2;
        
+/*     xstart -= 2;
+       pixelcount += 2;
+       if (xstart < 0) xstart = 0;*/
+       
        // boundary checking, important for microview only, macroview needs the 
additional
        // pixels to paint the waveform correctly
        if ((xstart + pixelcount) > m_boundingRect.width()) {
@@ -248,7 +252,7 @@
                return;
        }
        
-       bool microView = m_sheet->get_hzoom() > 32 ? 0 : 1;
+       bool microView = m_sheet->get_hzoom() < 64 ? 1 : 0;
        TimeRef clipstartoffset = m_clip->get_source_start_location();
        int channels = m_clip->get_channels();
        int peakdatacount = microView ? pixelcount : pixelcount * 2;
@@ -267,6 +271,11 @@
        if (nearestpow2 == 0) {
                nearestpow2 = 1;
        }
+       
+       qreal xscale = qreal(nearestpow2) / m_sheet->get_hzoom();
+       pixelcount = qRound(pixelcount / xscale);
+//     printf("xscale %f, microview %d, zoomlevel %f\n", xscale, microView, 
m_sheet->get_hzoom());
+
        // Load peak data for all channels, if no peakdata is returned
        // for a certain Peak object, schedule it for loading.
        for (int chan=0; chan < channels; ++chan) {
@@ -397,8 +406,8 @@
                        }
                
                        ytrans = height * chan;
-                       p->setMatrix(matrix().translate(0, ytrans), true);
-                       p->drawLine(qRound(xstart), 0, qRound(xstart) + 
pixelcount, 0);
+                       p->setMatrix(matrix().translate(xstart, 
ytrans).scale(xscale, 1), true);
+                       p->drawLine(0, 0, pixelcount, 0);
                        p->restore();
                }
                
@@ -416,7 +425,7 @@
                                ytrans = (height / 2) + (chan * height);
                        }
                        
-                       p->setMatrix(matrix().translate(0, ytrans), true);
+                       p->setMatrix(matrix().translate(xstart, 
ytrans).scale(xscale, -scaleFactor), true);
                        
                        if (m_clip->is_selected()) {
                                
p->setPen(themer()->get_color("AudioClip:channelseperator:selected"));
@@ -424,10 +433,10 @@
                                
p->setPen(themer()->get_color("AudioClip:channelseperator"));
                        }
                        
-                       p->drawLine(qRound(xstart), 0, qRound(xstart) + 
pixelcount, 0);
+                       p->drawLine(0, 0, pixelcount, 0);
                        
-                       for (int x = qRound(xstart); x < 
(pixelcount+qRound(xstart)); x++) {
-                               m_polygon.append( QPointF(x, -scaleFactor * 
pixeldata[chan][bufferPos++]) );
+                       for (int x = 0; x < pixelcount; x++) {
+                               m_polygon.append( QPointF(x, 
pixeldata[chan][bufferPos++]) );
                        }
                        
                        if 
(themer()->get_property("AudioClip:wavemicroview:antialiased", 0).toInt()) {
@@ -443,6 +452,7 @@
                                p->setBrush(m_waveBrush);
                        }
 
+                       if (m_paintWithOutline) {
                        if (m_sheet->get_mode() == Sheet::EDIT) {
                                
p->setPen(themer()->get_color("AudioClip:wavemacroview:outline"));
                        } else  {
@@ -451,6 +461,9 @@
                        if (m_clip->is_muted()) {
                                
p->setPen(themer()->get_color("AudioClip:wavemacroview:outline:muted"));
                        }
+                       } else {
+                               p->setPen(Qt::NoPen);
+                       }
                                
                        scaleFactor = ( (float) height * 0.90 / 
(Peak::MAX_DB_VALUE * 2)) * m_clip->get_gain() * curveDefaultValue;
                        
@@ -464,7 +477,6 @@
                                }
                        }
                        
-                       // we add one start/stop point so reserve some more...
                        int bufferpos = 0;
 
                        if (m_classicView) {
@@ -475,11 +487,7 @@
                                        ytrans = (height / 2) + (chan * height);
                                }
                        
-                               p->setMatrix(matrix().translate(xstart, 
ytrans).scale(1, scaleFactor), true);
-                               
-                               if (!m_paintWithOutline) {
-                                       p->setPen(Qt::NoPen);
-                               }
+                               p->setMatrix(matrix().translate(xstart, 
ytrans).scale(xscale, scaleFactor), true);
                                
                                m_polygon.clear();
                                m_polygon.reserve(pixelcount*2);
@@ -501,14 +509,6 @@
                                
                                p->drawPath(path);
 
-/*                             } else {
-                                       for (int x = 0; x < pixelcount; x++) {
-                                               int ytop = -1 * 
(int)(pixeldata[chan][bufferpos++]);
-                                               int ymin = 
(int)(pixeldata[chan][bufferpos++]);
-                                               p->drawLine(x, ytop, x, ymin);
-                                       }
-                               }*/
-                       
                                // Draw 'the' -INF line
                                p->setPen(minINFLineColor);
                                p->drawLine(0, 0, pixelcount, 0);
@@ -522,11 +522,7 @@
                                        scaleFactor *= channels;
                                }
 
-                               p->setMatrix(matrix().translate(xstart, 
ytrans).scale(1, scaleFactor), true);
-                               
-                               if (!m_paintWithOutline) {
-                                       p->setPen(Qt::NoPen);
-                               }
+                               p->setMatrix(matrix().translate(xstart, 
ytrans).scale(xscale, scaleFactor), true);
                                        
                                m_polygon.clear();
                                m_polygon.reserve(pixelcount + 2);




reply via email to

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