comparison data/model/Dense3DModelPeakCache.cpp @ 545:c603d9439b37

* Add peak cache type for 3d models
author Chris Cannam
date Wed, 04 Feb 2009 13:33:50 +0000
parents
children 95391b480e17
comparison
equal deleted inserted replaced
544:65d955c4d671 545:c603d9439b37
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
2
3 /*
4 Sonic Visualiser
5 An audio file viewer and annotation editor.
6 Centre for Digital Music, Queen Mary, University of London.
7 This file copyright 2009 QMUL.
8
9 This program is free software; you can redistribute it and/or
10 modify it under the terms of the GNU General Public License as
11 published by the Free Software Foundation; either version 2 of the
12 License, or (at your option) any later version. See the file
13 COPYING included with this distribution for more information.
14 */
15
16 #include "Dense3DModelPeakCache.h"
17
18 Dense3DModelPeakCache::Dense3DModelPeakCache(DenseThreeDimensionalModel *source,
19 size_t columnsPerPeak) :
20 m_source(source),
21 m_resolution(columnsPerPeak)
22 {
23 m_cache = new EditableDenseThreeDimensionalModel
24 (source->getSampleRate(),
25 getResolution(),
26 source->getHeight(),
27 EditableDenseThreeDimensionalModel::NoCompression,
28 false);
29
30 connect(source, SIGNAL(modelChanged()),
31 this, SLOT(sourceModelChanged()));
32 connect(source, SIGNAL(modelAboutToBeDeleted()),
33 this, SLOT(sourceModelAboutToBeDeleted()));
34
35 }
36
37 Dense3DModelPeakCache::~Dense3DModelPeakCache()
38 {
39 delete m_cache;
40 }
41
42 bool
43 Dense3DModelPeakCache::isColumnAvailable(size_t column) const
44 {
45 if (!m_source) return false;
46 if (haveColumn(column)) return true;
47 for (int i = 0; i < m_resolution; ++i) {
48 if (!m_source->isColumnAvailable(column * m_resolution + i)) {
49 return false;
50 }
51 }
52 return true;
53 }
54
55 Dense3DModelPeakCache::Column
56 Dense3DModelPeakCache::getColumn(size_t column) const
57 {
58 if (!m_source) return Column();
59 if (!haveColumn(column)) fillColumn(column);
60 return m_cache->getColumn(column);
61 }
62
63 float
64 Dense3DModelPeakCache::getValueAt(size_t column, size_t n) const
65 {
66 if (!m_source) return 0.f;
67 if (!haveColumn(column)) fillColumn(column);
68 return m_cache->getValueAt(column, n);
69 }
70
71 void
72 Dense3DModelPeakCache::sourceModelChanged()
73 {
74 if (!m_source) return;
75 m_coverage.resize(getWidth());
76 }
77
78 void
79 Dense3DModelPeakCache::sourceModelAboutToBeDeleted()
80 {
81 m_source = 0;
82 }
83
84 bool
85 Dense3DModelPeakCache::haveColumn(size_t column) const
86 {
87 return m_coverage.get(column);
88 }
89
90 void
91 Dense3DModelPeakCache::fillColumn(size_t column) const
92 {
93 Column peak;
94 for (int i = 0; i < m_resolution; ++i) {
95 Column here = m_source->getColumn(column * m_resolution + i);
96 if (i == 0) {
97 peak = here;
98 } else {
99 for (int j = 0; j < peak.size() && j < here.size(); ++j) {
100 if (here[j] > peak[j]) peak[j] = here[j];
101 }
102 }
103 }
104 m_cache->setColumn(column, peak);
105 m_coverage.set(column);
106 }
107
108