Ignore:
Timestamp:
May 5, 2011, 5:36:53 AM (14 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/demos/spectrum/app/waveform.cpp

    r769 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    4545#include <QDebug>
    4646
    47 
    48 Waveform::Waveform(const QByteArray &buffer, QWidget *parent)
     47//#define PAINT_EVENT_TRACE
     48#ifdef PAINT_EVENT_TRACE
     49#   define WAVEFORM_PAINT_DEBUG qDebug()
     50#else
     51#   define WAVEFORM_PAINT_DEBUG nullDebug()
     52#endif
     53
     54Waveform::Waveform(QWidget *parent)
    4955    :   QWidget(parent)
    50     ,   m_buffer(buffer)
    51     ,   m_dataLength(0)
    52     ,   m_position(0)
     56    ,   m_bufferPosition(0)
     57    ,   m_bufferLength(0)
     58    ,   m_audioPosition(0)
    5359    ,   m_active(false)
    5460    ,   m_tileLength(0)
     
    7379
    7480    if (m_active) {
    75         WAVEFORM_DEBUG << "Waveform::paintEvent"
    76                        << "windowPosition" << m_windowPosition
    77                        << "windowLength" << m_windowLength;
     81        WAVEFORM_PAINT_DEBUG << "Waveform::paintEvent"
     82                             << "windowPosition" << m_windowPosition
     83                             << "windowLength" << m_windowLength;
    7884        qint64 pos = m_windowPosition;
    7985        const qint64 windowEnd = m_windowPosition + m_windowLength;
     
    8288        while (pos < windowEnd) {
    8389            const TilePoint point = tilePoint(pos);
    84             WAVEFORM_DEBUG << "Waveform::paintEvent" << "pos" << pos
    85                            << "tileIndex" << point.index
    86                            << "positionOffset" << point.positionOffset
    87                            << "pixelOffset" << point.pixelOffset;
     90            WAVEFORM_PAINT_DEBUG << "Waveform::paintEvent" << "pos" << pos
     91                                 << "tileIndex" << point.index
     92                                 << "positionOffset" << point.positionOffset
     93                                 << "pixelOffset" << point.pixelOffset;
    8894
    8995            if (point.index != NullIndex) {
     
    105111                    sourceRect.setRight(sourceRight);
    106112
    107                     WAVEFORM_DEBUG << "Waveform::paintEvent" << "tileIndex" << point.index
    108                                    << "source" << point.pixelOffset << sourceRight
    109                                    << "dest" << destLeft << destRight;
     113                    WAVEFORM_PAINT_DEBUG << "Waveform::paintEvent" << "tileIndex" << point.index
     114                                         << "source" << point.pixelOffset << sourceRight
     115                                         << "dest" << destLeft << destRight;
    110116
    111117                    painter.drawPixmap(destRect, *tile.pixmap, sourceRect);
     
    115121                    if (point.index < m_tiles.count()) {
    116122                        pos = tilePosition(point.index + 1);
    117                         WAVEFORM_DEBUG << "Waveform::paintEvent" << "pos ->" << pos;
     123                        WAVEFORM_PAINT_DEBUG << "Waveform::paintEvent" << "pos ->" << pos;
    118124                    } else {
    119125                        // Reached end of tile array
    120                         WAVEFORM_DEBUG << "Waveform::paintEvent" << "reached end of tile array";
     126                        WAVEFORM_PAINT_DEBUG << "Waveform::paintEvent" << "reached end of tile array";
    121127                        break;
    122128                    }
    123129                } else {
    124130                    // Passed last tile which is painted
    125                     WAVEFORM_DEBUG << "Waveform::paintEvent" << "tile" << point.index << "not painted";
     131                    WAVEFORM_PAINT_DEBUG << "Waveform::paintEvent" << "tile" << point.index << "not painted";
    126132                    break;
    127133                }
    128134            } else {
    129135                // pos is past end of tile array
    130                 WAVEFORM_DEBUG << "Waveform::paintEvent" << "pos" << pos << "past end of tile array";
     136                WAVEFORM_PAINT_DEBUG << "Waveform::paintEvent" << "pos" << pos << "past end of tile array";
    131137                break;
    132138            }
    133139        }
    134140
    135         WAVEFORM_DEBUG << "Waveform::paintEvent" << "final pos" << pos << "final x" << destRight;
     141        WAVEFORM_PAINT_DEBUG << "Waveform::paintEvent" << "final pos" << pos << "final x" << destRight;
    136142    }
    137143}
     
    147153    WAVEFORM_DEBUG << "Waveform::initialize"
    148154                   << "audioBufferSize" << audioBufferSize
    149                    << "m_buffer.size()" << m_buffer.size()
    150155                   << "windowDurationUs" << windowDurationUs;
    151156
     
    187192    WAVEFORM_DEBUG << "Waveform::reset";
    188193
    189     m_dataLength = 0;
    190     m_position = 0;
     194    m_bufferPosition = 0;
     195    m_buffer = QByteArray();
     196    m_audioPosition = 0;
    191197    m_format = QAudioFormat();
    192198    m_active = false;
     
    199205}
    200206
    201 void Waveform::dataLengthChanged(qint64 length)
    202 {
    203     WAVEFORM_DEBUG << "Waveform::dataLengthChanged" << length;
    204     const qint64 oldLength = m_dataLength;
    205     m_dataLength = length;
    206 
    207     if (m_active) {
    208         if (m_dataLength < oldLength)
    209             positionChanged(m_dataLength);
    210         else
    211             paintTiles();
    212     }
    213 }
    214 
    215 void Waveform::positionChanged(qint64 position)
    216 {
    217     WAVEFORM_DEBUG << "Waveform::positionChanged" << position;
    218 
    219     if (position + m_windowLength > m_dataLength)
    220         position = m_dataLength - m_windowLength;
    221 
    222     m_position = position;
    223 
    224     setWindowPosition(position);
     207void Waveform::bufferChanged(qint64 position, qint64 length, const QByteArray &buffer)
     208{
     209    WAVEFORM_DEBUG << "Waveform::bufferChanged"
     210                   << "audioPosition" << m_audioPosition
     211                   << "bufferPosition" << position
     212                   << "bufferLength" << length;
     213    m_bufferPosition = position;
     214    m_bufferLength = length;
     215    m_buffer = buffer;
     216    paintTiles();
     217}
     218
     219void Waveform::audioPositionChanged(qint64 position)
     220{
     221    WAVEFORM_DEBUG << "Waveform::audioPositionChanged"
     222                   << "audioPosition" << position
     223                   << "bufferPosition" << m_bufferPosition
     224                   << "bufferLength" << m_bufferLength;
     225
     226    if (position >= m_bufferPosition) {
     227        if (position + m_windowLength > m_bufferPosition + m_bufferLength)
     228            position = qMax(qint64(0), m_bufferPosition + m_bufferLength - m_windowLength);
     229        m_audioPosition = position;
     230        setWindowPosition(position);
     231    }
    225232}
    226233
     
    256263        m_tiles[i].painted = false;
    257264    }
    258 
    259     paintTiles();
    260265}
    261266
     
    328333        const Tile &tile = m_tiles[i];
    329334        if (!tile.painted) {
    330             const qint64 tileEnd = m_tileArrayStart + (i + 1) * m_tileLength;
    331             if (m_dataLength >= tileEnd) {
     335            const qint64 tileStart = m_tileArrayStart + i * m_tileLength;
     336            const qint64 tileEnd = tileStart + m_tileLength;
     337            if (m_bufferPosition <= tileStart && m_bufferPosition + m_bufferLength >= tileEnd) {
    332338                paintTile(i);
    333339                updateRequired = true;
     
    344350void Waveform::paintTile(int index)
    345351{
    346     WAVEFORM_DEBUG << "Waveform::paintTile" << "index" << index;
    347 
    348352    const qint64 tileStart = m_tileArrayStart + index * m_tileLength;
    349     Q_ASSERT(m_dataLength >= tileStart + m_tileLength);
     353
     354    WAVEFORM_DEBUG << "Waveform::paintTile"
     355                   << "index" << index
     356                   << "bufferPosition" << m_bufferPosition
     357                   << "bufferLength" << m_bufferLength
     358                   << "start" << tileStart
     359                   << "end" << tileStart + m_tileLength;
     360
     361    Q_ASSERT(m_bufferPosition <= tileStart);
     362    Q_ASSERT(m_bufferPosition + m_bufferLength >= tileStart + m_tileLength);
    350363
    351364    Tile &tile = m_tiles[index];
     
    353366
    354367    const qint16* base = reinterpret_cast<const qint16*>(m_buffer.constData());
    355     const qint16* buffer = base + (tileStart / 2);
     368    const qint16* buffer = base + ((tileStart - m_bufferPosition) / 2);
    356369    const int numSamples = m_tileLength / (2 * m_format.channels());
    357370
     
    377390    for (int i=0; i<numSamples; ++i) {
    378391        const qint16* ptr = buffer + i * m_format.channels();
     392
     393        const int offset = reinterpret_cast<const char*>(ptr) - m_buffer.constData();
     394        Q_ASSERT(offset >= 0);
     395        Q_ASSERT(offset < m_bufferLength);
     396
    379397        const qint16 pcmValue = *ptr;
    380398        const qreal realValue = pcmToReal(pcmValue);
Note: See TracChangeset for help on using the changeset viewer.