34 #define CACHE_SIZE 8192               36 //***************************************************************************    40                                     const QList<unsigned int> *src_tracks)
    42      m_selection(&signal, src_offset, src_length, src_tracks),
    43      m_min(), m_max(), m_state(), m_minmax(),
    45      m_lock(QMutex::Recursive)
    69     QMutexLocker lock(&
m_lock);
    85     while (len > CACHE_SIZE * 
m_scale * shrink) {
    88     if (shrink <= 1) 
return; 
    91     foreach (
const QUuid &uuid, 
m_state.keys()) {
    93         unsigned int count = CACHE_SIZE / shrink;
    94         Q_ASSERT(count <= CACHE_SIZE);
   107         while (dst < count) {
   111             for (
unsigned int i = 0; i < shrink; ++i) {
   112                 if (*smin < min) min = *smin;
   113                 if (*smax > max) max = *smax;
   114                 if (*sstate < state) state = *sstate;
   129         while (dst++ < CACHE_SIZE) {
   142     quint64 new_scale = 
static_cast<quint64
>(rint(ceil(len / 
CACHE_SIZE)));
   143     if (!new_scale) new_scale = 1;
   144     if (
m_scale == new_scale) 
return;
   157         Q_ASSERT(
m_state.contains(*track_id));
   158         if (!
m_state.contains(*track_id)) 
return;
   166         for (
unsigned int pos = first; pos <= last; ++pos)
   170         foreach (
const QUuid &uuid, 
m_state.keys())
   178     QMutexLocker lock(&
m_lock);
   194     m_min.insert(track_id, min);
   195     m_max.insert(track_id, max);
   196     m_state.insert(track_id, state);
   207     QMutexLocker lock(&
m_lock);
   209     m_min.remove(track_id);
   210     m_max.remove(track_id);
   221     QMutexLocker lock(&
m_lock);
   225     Q_ASSERT(first >= offset);
   226     Q_ASSERT(last  >= offset);
   227     Q_ASSERT(last  >= first);
   232     unsigned int last_idx;
   248     QMutexLocker lock(&
m_lock);
   260     QMutexLocker lock(&
m_lock);
   270     if (minmax.count() < width)
   271         minmax.resize(width);
   272     if (minmax.count() < width) 
   273         width = minmax.count();
   275     QList<unsigned int> track_list;
   279             track_list.append(track);
   280     if (track_list.isEmpty())
   294     for (
int index = 0; index < track_list.count(); ++index) {
   295         unsigned int count = qBound<unsigned int>(
   299         if (uuid.isNull()) 
continue; 
   303         if (!
m_state.keys().contains(uuid))
   309         Q_ASSERT(min && max && state);
   313         if (!reader || !min || !max || !state) 
continue;
   315         for (
unsigned int ofs = 0; ofs < count; ++ofs) {
   316             if (state[ofs] == 
Valid)  
continue;
   317             if (state[ofs] == 
Unused) 
continue;
   322             reader->
minMax(first_idx, last_idx, min[ofs], max[ofs]);
   328     for (
int x = 0; x < width; ++x) {
   329         unsigned int count = qBound<unsigned int>(
   333         unsigned int index = ((count - 1) * x) / (width - 1);
   334         unsigned int last_index  = ((count - 1) * (x + 1)) / (width - 1);
   337         if (last_index > index) last_index--;
   343         for (; index <= last_index; ++index) {
   345             foreach (
const QUuid &uuid, 
m_state.keys()) {
   350                 if (!state) 
continue;
   351                 if (state[index] != 
Valid) {
   352                     if (minimum > 0) minimum = 0;
   353                     if (maximum < 0) maximum = 0;
   357                 if (min[index] < minimum) minimum = min[index];
   358                 if (max[index] > maximum) maximum = max[index];
   362         minmax[x].min = minimum;
   363         minmax[x].max = maximum;
   372                                          const QColor &fg, 
const QColor &bg,
   375     QMutexLocker lock(&
m_lock);
   377     QImage bitmap(width, height, QImage::Format_ARGB32_Premultiplied);
   378     if ((width < 2) || (height < 3) || bitmap.isNull()) 
return bitmap;
   382     p.fillRect(bitmap.rect(), bg);
   392     for (
int x = 0; x < count; ++x) {
   393         const int middle = (height >> 1);
   394         const double scale = 
static_cast<double>(middle) /
   396         double min = 
m_minmax[x].min * scale;
   397         double max = 
m_minmax[x].max * scale;
   402             if (min < -middle) min = -middle;
   403             if (min > +middle) min = +middle;
   404             if (max < -middle) max = -middle;
   405             if (max > +middle) max = +middle;
 
virtual QImage getOverView(int width, int height, const QColor &fg, const QColor &bg, double gain=1.0)
sample_index_t offset() const
void slotTrackDeleted(const QUuid &track_id)
OverViewCache(Kwave::SignalManager &signal, sample_index_t src_offset, sample_index_t src_length, const QList< unsigned int > *src_tracks)
int getMinMax(int width, MinMaxArray &minmax)
QUuid uuidOfTrack(unsigned int track)
QHash< QUuid, QVector< sample_t > > m_min
void slotTrackInserted(const QUuid &track_id)
QList< QUuid > allTracks()
void invalidateCache(const QUuid *uuid, unsigned int first, unsigned int last)
bool connect(Kwave::StreamObject &source, const char *output, Kwave::StreamObject &sink, const char *input)
T round_up(T x, const T s)
void minMax(sample_index_t first, sample_index_t last, sample_t &min, sample_t &max)
void slotLengthChanged(sample_index_t new_length)
Kwave::SelectionTracker m_selection
QVector< MinMax > MinMaxArray
sample_index_t last() const
virtual bool isEmpty() const
void slotInvalidated(const QUuid *track_id, sample_index_t first, sample_index_t last)
const QList< unsigned int > allTracks()
QHash< QUuid, QVector< sample_t > > m_max
QHash< QUuid, QVector< CacheState > > m_state
sample_index_t length() const
Kwave::SignalManager & m_signal