Mercurial > hg > svgui
comparison layer/SpectrogramLayer.h @ 35:10ba9276a315
* Add TextModel and TextLayer types
* Make View refresh work better when editing a model (previously edits might
  not be refreshed if their visible changed area extended beyond the strict
  frame range that was being modified in the model)
* Add phase-adjusted instantaneous frequency display to spectrogram layer
  (still a work in progress)
* Pull maths aliases out into a separate header in dsp/maths so MathUtilities
  can be included without introducing them
| author | Chris Cannam | 
|---|---|
| date | Mon, 20 Feb 2006 13:33:36 +0000 | 
| parents | 651e4e868bcc | 
| children | c28ebb4ba4de | 
   comparison
  equal
  deleted
  inserted
  replaced
| 34:c43f2c4f66f2 | 35:10ba9276a315 | 
|---|---|
| 105 * details of meter and dB scaling. The default is dBColourScale. | 105 * details of meter and dB scaling. The default is dBColourScale. | 
| 106 */ | 106 */ | 
| 107 void setColourScale(ColourScale); | 107 void setColourScale(ColourScale); | 
| 108 ColourScale getColourScale() const; | 108 ColourScale getColourScale() const; | 
| 109 | 109 | 
| 110 enum FrequencyScale { LinearFrequencyScale, LogFrequencyScale }; | 110 enum FrequencyScale { | 
| 111 LinearFrequencyScale, | |
| 112 LogFrequencyScale | |
| 113 }; | |
| 111 | 114 | 
| 112 /** | 115 /** | 
| 113 * Specify the scale for the y axis. | 116 * Specify the scale for the y axis. | 
| 114 */ | 117 */ | 
| 115 void setFrequencyScale(FrequencyScale); | 118 void setFrequencyScale(FrequencyScale); | 
| 116 FrequencyScale getFrequencyScale() const; | 119 FrequencyScale getFrequencyScale() const; | 
| 120 | |
| 121 enum FrequencyAdjustment { | |
| 122 RawFrequency, | |
| 123 PhaseAdjustedFrequency, | |
| 124 PhaseAdjustedPeaks | |
| 125 }; | |
| 126 | |
| 127 /** | |
| 128 * Specify the processing of frequency bins for the y axis. | |
| 129 */ | |
| 130 void setFrequencyAdjustment(FrequencyAdjustment); | |
| 131 FrequencyAdjustment getFrequencyAdjustment() const; | |
| 117 | 132 | 
| 118 enum ColourScheme { DefaultColours, WhiteOnBlack, BlackOnWhite, | 133 enum ColourScheme { DefaultColours, WhiteOnBlack, BlackOnWhite, | 
| 119 RedOnBlue, YellowOnBlack, RedOnBlack }; | 134 RedOnBlue, YellowOnBlack, RedOnBlack }; | 
| 120 | 135 | 
| 121 void setColourScheme(ColourScheme scheme); | 136 void setColourScheme(ColourScheme scheme); | 
| 149 void fillTimerTimedOut(); | 164 void fillTimerTimedOut(); | 
| 150 | 165 | 
| 151 protected: | 166 protected: | 
| 152 const DenseTimeValueModel *m_model; // I do not own this | 167 const DenseTimeValueModel *m_model; // I do not own this | 
| 153 | 168 | 
| 154 int m_channel; | 169 int m_channel; | 
| 155 size_t m_windowSize; | 170 size_t m_windowSize; | 
| 156 WindowType m_windowType; | 171 WindowType m_windowType; | 
| 157 size_t m_windowOverlap; | 172 size_t m_windowOverlap; | 
| 158 float m_gain; | 173 float m_gain; | 
| 159 int m_colourRotation; | 174 int m_colourRotation; | 
| 160 size_t m_maxFrequency; | 175 size_t m_maxFrequency; | 
| 161 ColourScale m_colourScale; | 176 ColourScale m_colourScale; | 
| 162 ColourScheme m_colourScheme; | 177 ColourScheme m_colourScheme; | 
| 163 FrequencyScale m_frequencyScale; | 178 FrequencyScale m_frequencyScale; | 
| 179 FrequencyAdjustment m_frequencyAdjustment; | |
| 164 | 180 | 
| 165 // A QImage would do just as well here, and we originally used | 181 // A QImage would do just as well here, and we originally used | 
| 166 // one: the problem is that we want to munlock() the memory it | 182 // one: the problem is that we want to munlock() the memory it | 
| 167 // uses, and it's much easier to do that if we control it. This | 183 // uses, and it's much easier to do that if we control it. This | 
| 168 // cache is hardwired to an effective 8-bit colour mapped layout. | 184 // cache is hardwired to an effective 8-bit colour mapped layout. | 
| 171 Cache(size_t width, size_t height); | 187 Cache(size_t width, size_t height); | 
| 172 ~Cache(); | 188 ~Cache(); | 
| 173 | 189 | 
| 174 size_t getWidth() const; | 190 size_t getWidth() const; | 
| 175 size_t getHeight() const; | 191 size_t getHeight() const; | 
| 192 | |
| 193 void resize(size_t width, size_t height); | |
| 176 | 194 | 
| 177 unsigned char getValueAt(size_t x, size_t y) const; | 195 unsigned char getValueAt(size_t x, size_t y) const; | 
| 178 void setValueAt(size_t x, size_t y, unsigned char value); | 196 void setValueAt(size_t x, size_t y, unsigned char value); | 
| 179 | 197 | 
| 180 QColor getColour(unsigned char index) const; | 198 QColor getColour(unsigned char index) const; | 
| 188 unsigned char *m_values; | 206 unsigned char *m_values; | 
| 189 QColor m_colours[256]; | 207 QColor m_colours[256]; | 
| 190 }; | 208 }; | 
| 191 | 209 | 
| 192 Cache *m_cache; | 210 Cache *m_cache; | 
| 211 Cache *m_phaseAdjustCache; | |
| 193 bool m_cacheInvalid; | 212 bool m_cacheInvalid; | 
| 194 | 213 | 
| 195 class CacheFillThread : public QThread | 214 class CacheFillThread : public QThread | 
| 196 { | 215 { | 
| 197 public: | 216 public: | 
| 232 fftw_complex *outputBuffer, | 251 fftw_complex *outputBuffer, | 
| 233 fftw_plan plan, | 252 fftw_plan plan, | 
| 234 size_t windowSize, | 253 size_t windowSize, | 
| 235 size_t windowIncrement, | 254 size_t windowIncrement, | 
| 236 const Window<double> &windower, | 255 const Window<double> &windower, | 
| 237 bool lock) | 256 bool resetStoredPhase) | 
| 238 const; | 257 const; | 
| 239 | 258 | 
| 240 bool getYBinRange(int y, float &freqBinMin, float &freqBinMax) const; | 259 bool getYBinRange(int y, float &freqBinMin, float &freqBinMax) const; | 
| 241 | 260 | 
| 242 struct LayerRange { | 261 struct LayerRange { | 
| 246 size_t modelEnd; | 265 size_t modelEnd; | 
| 247 }; | 266 }; | 
| 248 bool getXBinRange(int x, float &windowMin, float &windowMax) const; | 267 bool getXBinRange(int x, float &windowMin, float &windowMax) const; | 
| 249 | 268 | 
| 250 bool getYBinSourceRange(int y, float &freqMin, float &freqMax) const; | 269 bool getYBinSourceRange(int y, float &freqMin, float &freqMax) const; | 
| 270 bool getAdjustedYBinSourceRange(int x, int y, | |
| 271 float &freqMin, float &freqMax, | |
| 272 float &adjFreqMin, float &adjFreqMax) const; | |
| 251 bool getXBinSourceRange(int x, RealTime &timeMin, RealTime &timeMax) const; | 273 bool getXBinSourceRange(int x, RealTime &timeMin, RealTime &timeMax) const; | 
| 252 bool getXYBinSourceRange(int x, int y, float &dbMin, float &dbMax) const; | 274 bool getXYBinSourceRange(int x, int y, float &dbMin, float &dbMax) const; | 
| 253 | 275 | 
| 254 size_t getWindowIncrement() const { | 276 size_t getWindowIncrement() const { | 
| 255 return m_windowSize - m_windowSize * m_windowOverlap / 100; | 277 return m_windowSize - m_windowSize * m_windowOverlap / 100; | 
