# HG changeset patch # User Chris Cannam # Date 1465831064 -3600 # Node ID 12a8daa89970b33ee169865f79ebf1f772b5bad4 # Parent 69c84a66727b69b57e27053c9fa28ec205bc0ec1 Mid-refactor to pull out the bulk of paintDrawBuffer into chunks diff -r 69c84a66727b -r 12a8daa89970 base/MagnitudeRange.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/base/MagnitudeRange.h Mon Jun 13 16:17:44 2016 +0100 @@ -0,0 +1,66 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + Sonic Visualiser + An audio file viewer and annotation editor. + Centre for Digital Music, Queen Mary, University of London. + This file copyright 2006 Chris Cannam and QMUL. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. See the file + COPYING included with this distribution for more information. +*/ + +#ifndef MAGNITUDE_RANGE_H +#define MAGNITUDE_RANGE_H + +/** + * Maintain a min and max value, and update them when supplied a new + * data point. + */ +class MagnitudeRange +{ +public: + MagnitudeRange() : m_min(0), m_max(0) { } + bool operator==(const MagnitudeRange &r) { + return r.m_min == m_min && r.m_max == m_max; + } + bool isSet() const { return (m_min != 0.f || m_max != 0.f); } + void set(float min, float max) { + m_min = min; + m_max = max; + if (m_max < m_min) m_max = m_min; + } + bool sample(float f) { + bool changed = false; + if (isSet()) { + if (f < m_min) { m_min = f; changed = true; } + if (f > m_max) { m_max = f; changed = true; } + } else { + m_max = m_min = f; + changed = true; + } + return changed; + } + bool sample(const MagnitudeRange &r) { + bool changed = false; + if (isSet()) { + if (r.m_min < m_min) { m_min = r.m_min; changed = true; } + if (r.m_max > m_max) { m_max = r.m_max; changed = true; } + } else { + m_min = r.m_min; + m_max = r.m_max; + changed = true; + } + return changed; + } + float getMin() const { return m_min; } + float getMax() const { return m_max; } +private: + float m_min; + float m_max; +}; + +#endif diff -r 69c84a66727b -r 12a8daa89970 data/model/FFTModel.cpp --- a/data/model/FFTModel.cpp Wed Apr 27 11:04:32 2016 +0100 +++ b/data/model/FFTModel.cpp Mon Jun 13 16:17:44 2016 +0100 @@ -149,23 +149,6 @@ return true; } -float -FFTModel::getNormalizedMagnitudesAt(int x, float *values, int minbin, int count) const -{ - if (!getMagnitudesAt(x, values, minbin, count)) return false; - if (count == 0) count = getHeight(); - float max = 0.f; - for (int i = 0; i < count; ++i) { - if (values[i] > max) max = values[i]; - } - if (max > 0.f) { - for (int i = 0; i < count; ++i) { - values[i] /= max; - } - } - return max; -} - bool FFTModel::getPhasesAt(int x, float *values, int minbin, int count) const { diff -r 69c84a66727b -r 12a8daa89970 data/model/FFTModel.h --- a/data/model/FFTModel.h Wed Apr 27 11:04:32 2016 +0100 +++ b/data/model/FFTModel.h Mon Jun 13 16:17:44 2016 +0100 @@ -101,7 +101,6 @@ float getPhaseAt(int x, int y) const; void getValuesAt(int x, int y, float &real, float &imaginary) const; bool getMagnitudesAt(int x, float *values, int minbin = 0, int count = 0) const; - float getNormalizedMagnitudesAt(int x, float *values, int minbin = 0, int count = 0) const; // returns maximum of unnormalized magnitudes bool getPhasesAt(int x, float *values, int minbin = 0, int count = 0) const; bool getValuesAt(int x, float *reals, float *imaginaries, int minbin = 0, int count = 0) const; diff -r 69c84a66727b -r 12a8daa89970 svcore.pro --- a/svcore.pro Wed Apr 27 11:04:32 2016 +0100 +++ b/svcore.pro Mon Jun 13 16:17:44 2016 +0100 @@ -60,6 +60,7 @@ base/Debug.h \ base/Exceptions.h \ base/LogRange.h \ + base/MagnitudeRange.h \ base/Pitch.h \ base/Playable.h \ base/PlayParameterRepository.h \