comparison layer/SpectrogramLayer.h @ 944:78c152e4db95

Merge from branch tonioni
author Chris Cannam
date Mon, 20 Apr 2015 09:12:17 +0100
parents 28d05ae8741c
children 94e4952a6774 8053c0dfa919
comparison
equal deleted inserted replaced
896:78e041e45ff0 944:78c152e4db95
67 std::vector<QRect> &extents) const; 67 std::vector<QRect> &extents) const;
68 virtual void paintCrosshairs(View *, QPainter &, QPoint) const; 68 virtual void paintCrosshairs(View *, QPainter &, QPoint) const;
69 69
70 virtual QString getFeatureDescription(View *v, QPoint &) const; 70 virtual QString getFeatureDescription(View *v, QPoint &) const;
71 71
72 virtual bool snapToFeatureFrame(View *v, int &frame, 72 virtual bool snapToFeatureFrame(View *v, sv_frame_t &frame,
73 int &resolution, 73 int &resolution,
74 SnapType snap) const; 74 SnapType snap) const;
75 75
76 virtual void measureDoubleClick(View *, QMouseEvent *); 76 virtual void measureDoubleClick(View *, QMouseEvent *);
77 77
208 208
209 virtual ColourSignificance getLayerColourSignificance() const { 209 virtual ColourSignificance getLayerColourSignificance() const {
210 return ColourHasMeaningfulValue; 210 return ColourHasMeaningfulValue;
211 } 211 }
212 212
213 float getYForFrequency(const View *v, float frequency) const; 213 double getYForFrequency(const View *v, double frequency) const;
214 float getFrequencyForY(const View *v, int y) const; 214 double getFrequencyForY(const View *v, int y) const;
215 215
216 virtual int getCompletion(View *v) const; 216 virtual int getCompletion(View *v) const;
217 virtual QString getError(View *v) const; 217 virtual QString getError(View *v) const;
218 218
219 virtual bool getValueExtents(float &min, float &max, 219 virtual bool getValueExtents(double &min, double &max,
220 bool &logarithmic, QString &unit) const; 220 bool &logarithmic, QString &unit) const;
221 221
222 virtual bool getDisplayExtents(float &min, float &max) const; 222 virtual bool getDisplayExtents(double &min, double &max) const;
223 223
224 virtual bool setDisplayExtents(float min, float max); 224 virtual bool setDisplayExtents(double min, double max);
225 225
226 virtual bool getYScaleValue(const View *, int, float &, QString &) const; 226 virtual bool getYScaleValue(const View *, int, double &, QString &) const;
227 227
228 virtual void toXml(QTextStream &stream, QString indent = "", 228 virtual void toXml(QTextStream &stream, QString indent = "",
229 QString extraAttributes = "") const; 229 QString extraAttributes = "") const;
230 230
231 void setProperties(const QXmlAttributes &attributes); 231 void setProperties(const QXmlAttributes &attributes);
241 241
242 virtual const Model *getSliceableModel() const; 242 virtual const Model *getSliceableModel() const;
243 243
244 protected slots: 244 protected slots:
245 void cacheInvalid(); 245 void cacheInvalid();
246 void cacheInvalid(int startFrame, int endFrame); 246 void cacheInvalid(sv_frame_t startFrame, sv_frame_t endFrame);
247 247
248 void preferenceChanged(PropertyContainer::PropertyName name); 248 void preferenceChanged(PropertyContainer::PropertyName name);
249 249
250 void fillTimerTimedOut(); 250 void fillTimerTimedOut();
251 251
308 */ 308 */
309 struct ImageCache 309 struct ImageCache
310 { 310 {
311 QImage image; 311 QImage image;
312 QRect validArea; 312 QRect validArea;
313 int startFrame; 313 sv_frame_t startFrame;
314 int zoomLevel; 314 int zoomLevel;
315 }; 315 };
316 typedef std::map<const View *, ImageCache> ViewImageCache; 316 typedef std::map<const View *, ImageCache> ViewImageCache;
317 void invalidateImageCaches(); 317 void invalidateImageCaches();
318 void invalidateImageCaches(int startFrame, int endFrame); 318 void invalidateImageCaches(sv_frame_t startFrame, sv_frame_t endFrame);
319 mutable ViewImageCache m_imageCaches; 319 mutable ViewImageCache m_imageCaches;
320 320
321 /** 321 /**
322 * When painting, we draw directly onto the draw buffer and then 322 * When painting, we draw directly onto the draw buffer and then
323 * copy this to the part of the image cache that needed refreshing 323 * copy this to the part of the image cache that needed refreshing
326 */ 326 */
327 mutable QImage m_drawBuffer; 327 mutable QImage m_drawBuffer;
328 328
329 mutable QTimer *m_updateTimer; 329 mutable QTimer *m_updateTimer;
330 330
331 mutable int m_candidateFillStartFrame; 331 mutable sv_frame_t m_candidateFillStartFrame;
332 bool m_exiting; 332 bool m_exiting;
333 333
334 void initialisePalette(); 334 void initialisePalette();
335 void rotatePalette(int distance); 335 void rotatePalette(int distance);
336 336
337 unsigned char getDisplayValue(View *v, float input) const; 337 unsigned char getDisplayValue(View *v, double input) const;
338 338
339 int getColourScaleWidth(QPainter &) const; 339 int getColourScaleWidth(QPainter &) const;
340 340
341 void illuminateLocalFeatures(View *v, QPainter &painter) const; 341 void illuminateLocalFeatures(View *v, QPainter &painter) const;
342 342
343 float getEffectiveMinFrequency() const; 343 double getEffectiveMinFrequency() const;
344 float getEffectiveMaxFrequency() const; 344 double getEffectiveMaxFrequency() const;
345
346 struct LayerRange {
347 int startFrame;
348 int zoomLevel;
349 int modelStart;
350 int modelEnd;
351 };
352 345
353 // Note that the getYBin... methods return the nominal bin in the 346 // Note that the getYBin... methods return the nominal bin in the
354 // un-smoothed spectrogram. This is not necessarily the same bin 347 // un-smoothed spectrogram. This is not necessarily the same bin
355 // as is pulled from the spectrogram and drawn at the given 348 // as is pulled from the spectrogram and drawn at the given
356 // position, if the spectrogram has oversampling smoothing. Use 349 // position, if the spectrogram has oversampling smoothing. Use
357 // getSmoothedYBinRange to obtain that. 350 // getSmoothedYBinRange to obtain that.
358 351
359 bool getXBinRange(View *v, int x, float &windowMin, float &windowMax) const; 352 bool getXBinRange(View *v, int x, double &windowMin, double &windowMax) const;
360 bool getYBinRange(View *v, int y, float &freqBinMin, float &freqBinMax) const; 353 bool getYBinRange(View *v, int y, double &freqBinMin, double &freqBinMax) const;
361 bool getSmoothedYBinRange(View *v, int y, float &freqBinMin, float &freqBinMax) const; 354 bool getSmoothedYBinRange(View *v, int y, double &freqBinMin, double &freqBinMax) const;
362 355
363 bool getYBinSourceRange(View *v, int y, float &freqMin, float &freqMax) const; 356 bool getYBinSourceRange(View *v, int y, double &freqMin, double &freqMax) const;
364 bool getAdjustedYBinSourceRange(View *v, int x, int y, 357 bool getAdjustedYBinSourceRange(View *v, int x, int y,
365 float &freqMin, float &freqMax, 358 double &freqMin, double &freqMax,
366 float &adjFreqMin, float &adjFreqMax) const; 359 double &adjFreqMin, double &adjFreqMax) const;
367 bool getXBinSourceRange(View *v, int x, RealTime &timeMin, RealTime &timeMax) const; 360 bool getXBinSourceRange(View *v, int x, RealTime &timeMin, RealTime &timeMax) const;
368 bool getXYBinSourceRange(View *v, int x, int y, float &min, float &max, 361 bool getXYBinSourceRange(View *v, int x, int y, double &min, double &max,
369 float &phaseMin, float &phaseMax) const; 362 double &phaseMin, double &phaseMax) const;
370 363
371 int getWindowIncrement() const { 364 int getWindowIncrement() const {
372 if (m_windowHopLevel == 0) return m_windowSize; 365 if (m_windowHopLevel == 0) return m_windowSize;
373 else if (m_windowHopLevel == 1) return (m_windowSize * 3) / 4; 366 else if (m_windowHopLevel == 1) return (m_windowSize * 3) / 4;
374 else return m_windowSize / (1 << (m_windowHopLevel - 1)); 367 else return m_windowSize / (1 << (m_windowHopLevel - 1));
378 int getFFTSize(const View *v) const; 371 int getFFTSize(const View *v) const;
379 FFTModel *getFFTModel(const View *v) const; 372 FFTModel *getFFTModel(const View *v) const;
380 Dense3DModelPeakCache *getPeakCache(const View *v) const; 373 Dense3DModelPeakCache *getPeakCache(const View *v) const;
381 void invalidateFFTModels(); 374 void invalidateFFTModels();
382 375
383 typedef std::pair<FFTModel *, int> FFTFillPair; // model, last fill 376 typedef std::pair<FFTModel *, sv_frame_t> FFTFillPair; // model, last fill
384 typedef std::map<const View *, FFTFillPair> ViewFFTMap; 377 typedef std::map<const View *, FFTFillPair> ViewFFTMap;
385 typedef std::map<const View *, Dense3DModelPeakCache *> PeakCacheMap; 378 typedef std::map<const View *, Dense3DModelPeakCache *> PeakCacheMap;
386 mutable ViewFFTMap m_fftModels; 379 mutable ViewFFTMap m_fftModels;
387 mutable PeakCacheMap m_peakCaches; 380 mutable PeakCacheMap m_peakCaches;
388 mutable Model *m_sliceableModel; 381 mutable Model *m_sliceableModel;
391 public: 384 public:
392 MagnitudeRange() : m_min(0), m_max(0) { } 385 MagnitudeRange() : m_min(0), m_max(0) { }
393 bool operator==(const MagnitudeRange &r) { 386 bool operator==(const MagnitudeRange &r) {
394 return r.m_min == m_min && r.m_max == m_max; 387 return r.m_min == m_min && r.m_max == m_max;
395 } 388 }
396 bool isSet() const { return (m_min != 0 || m_max != 0); } 389 bool isSet() const { return (m_min != 0.f || m_max != 0.f); }
397 void set(float min, float max) { 390 void set(float min, float max) {
398 m_min = convert(min); 391 m_min = min;
399 m_max = convert(max); 392 m_max = max;
400 if (m_max < m_min) m_max = m_min; 393 if (m_max < m_min) m_max = m_min;
401 } 394 }
402 bool sample(float f) { 395 bool sample(float f) {
403 unsigned int ui = convert(f);
404 bool changed = false; 396 bool changed = false;
405 if (isSet()) { 397 if (isSet()) {
406 if (ui < m_min) { m_min = ui; changed = true; } 398 if (f < m_min) { m_min = f; changed = true; }
407 if (ui > m_max) { m_max = ui; changed = true; } 399 if (f > m_max) { m_max = f; changed = true; }
408 } else { 400 } else {
409 m_max = m_min = ui; 401 m_max = m_min = f;
410 changed = true; 402 changed = true;
411 } 403 }
412 return changed; 404 return changed;
413 } 405 }
414 bool sample(const MagnitudeRange &r) { 406 bool sample(const MagnitudeRange &r) {
421 m_max = r.m_max; 413 m_max = r.m_max;
422 changed = true; 414 changed = true;
423 } 415 }
424 return changed; 416 return changed;
425 } 417 }
426 float getMin() const { return float(m_min) / UINT_MAX; } 418 float getMin() const { return m_min; }
427 float getMax() const { return float(m_max) / UINT_MAX; } 419 float getMax() const { return m_max; }
428 private: 420 private:
429 unsigned int m_min; 421 float m_min;
430 unsigned int m_max; 422 float m_max;
431 unsigned int convert(float f) {
432 if (f < 0.f) f = 0.f;
433 if (f > 1.f) f = 1.f;
434 return (unsigned int)(f * UINT_MAX);
435 }
436 }; 423 };
437 424
438 typedef std::map<const View *, MagnitudeRange> ViewMagMap; 425 typedef std::map<const View *, MagnitudeRange> ViewMagMap;
439 mutable ViewMagMap m_viewMags; 426 mutable ViewMagMap m_viewMags;
440 mutable std::vector<MagnitudeRange> m_columnMags; 427 mutable std::vector<MagnitudeRange> m_columnMags;
441 void invalidateMagnitudes(); 428 void invalidateMagnitudes();
442 bool updateViewMagnitudes(View *v) const; 429 bool updateViewMagnitudes(View *v) const;
443 bool paintDrawBuffer(View *v, int w, int h, 430 bool paintDrawBuffer(View *v, int w, int h,
444 int *binforx, float *binfory, 431 const std::vector<int> &binforx,
432 const std::vector<double> &binfory,
445 bool usePeaksCache, 433 bool usePeaksCache,
446 MagnitudeRange &overallMag, 434 MagnitudeRange &overallMag,
447 bool &overallMagChanged) const; 435 bool &overallMagChanged) const;
448 bool paintDrawBufferPeakFrequencies(View *v, int w, int h, 436 bool paintDrawBufferPeakFrequencies(View *v, int w, int h,
449 int *binforx, 437 const std::vector<int> &binforx,
450 int minbin, 438 int minbin,
451 int maxbin, 439 int maxbin,
452 float displayMinFreq, 440 double displayMinFreq,
453 float displayMaxFreq, 441 double displayMaxFreq,
454 bool logarithmic, 442 bool logarithmic,
455 MagnitudeRange &overallMag, 443 MagnitudeRange &overallMag,
456 bool &overallMagChanged) const; 444 bool &overallMagChanged) const;
457 445
458 virtual void updateMeasureRectYCoords(View *v, const MeasureRect &r) const; 446 virtual void updateMeasureRectYCoords(View *v, const MeasureRect &r) const;