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