diff options
| author | Carl Hetherington <cth@carlh.net> | 2013-02-24 22:40:57 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2013-02-24 22:40:57 +0000 |
| commit | dcd968d6d64d645816af0efbcd2f928128c95b9f (patch) | |
| tree | 97fcfc3df5d984e634169dbfed5bb3fa5aa4ee9b /src/lib | |
| parent | cf1e212c30ec7419b96388e4f78b44cb55bf34c5 (diff) | |
Basic UI.
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/analyse_audio_job.cc | 7 | ||||
| -rw-r--r-- | src/lib/audio_analysis.cc | 43 | ||||
| -rw-r--r-- | src/lib/audio_analysis.h | 9 |
3 files changed, 57 insertions, 2 deletions
diff --git a/src/lib/analyse_audio_job.cc b/src/lib/analyse_audio_job.cc index 5623fdfcc..190d2a5d9 100644 --- a/src/lib/analyse_audio_job.cc +++ b/src/lib/analyse_audio_job.cc @@ -85,7 +85,12 @@ AnalyseAudioJob::audio (shared_ptr<AudioBuffers> b) { for (int i = 0; i < b->frames(); ++i) { for (int j = 0; j < b->channels(); ++j) { - float const s = b->data(j)[i]; + float s = b->data(j)[i]; + if (fabsf (s) < 10e-7) { + /* stringstream can't serialise and recover inf or -inf, so prevent such + values by replacing with this (140dB down) */ + s = 10e-7; + } _current[j][AudioPoint::RMS] += pow (s, 2); _current[j][AudioPoint::PEAK] = max (_current[j][AudioPoint::PEAK], fabsf (s)); diff --git a/src/lib/audio_analysis.cc b/src/lib/audio_analysis.cc index 4a710f4c1..39c1ba226 100644 --- a/src/lib/audio_analysis.cc +++ b/src/lib/audio_analysis.cc @@ -18,14 +18,18 @@ */ #include <stdint.h> +#include <cmath> #include <cassert> #include <fstream> #include "audio_analysis.h" using std::ostream; +using std::istream; using std::string; using std::ofstream; +using std::ifstream; using std::vector; +using std::cout; AudioPoint::AudioPoint () { @@ -34,6 +38,13 @@ AudioPoint::AudioPoint () } } +AudioPoint::AudioPoint (istream& s) +{ + for (int i = 0; i < COUNT; ++i) { + s >> _data[i]; + } +} + void AudioPoint::write (ostream& s) const { @@ -48,6 +59,23 @@ AudioAnalysis::AudioAnalysis (int channels) _data.resize (channels); } +AudioAnalysis::AudioAnalysis (string filename) +{ + ifstream f (filename.c_str ()); + + int channels; + f >> channels; + _data.resize (channels); + + for (int i = 0; i < channels; ++i) { + int points; + f >> points; + for (int j = 0; j < points; ++j) { + _data[i].push_back (AudioPoint (f)); + } + } +} + void AudioAnalysis::add_point (int c, AudioPoint const & p) { @@ -55,6 +83,21 @@ AudioAnalysis::add_point (int c, AudioPoint const & p) _data[c].push_back (p); } +AudioPoint +AudioAnalysis::get_point (int c, int p) const +{ + assert (c < int (_data.size ())); + assert (p < int (_data[c].size ())); + return _data[c][p]; +} + +int +AudioAnalysis::points (int c) const +{ + assert (c < int (_data.size ())); + return _data[c].size (); +} + void AudioAnalysis::write (string filename) { diff --git a/src/lib/audio_analysis.h b/src/lib/audio_analysis.h index 1c668b9c2..c26c0584c 100644 --- a/src/lib/audio_analysis.h +++ b/src/lib/audio_analysis.h @@ -33,10 +33,11 @@ public: }; AudioPoint (); + AudioPoint (std::istream &); void write (std::ostream &) const; - float& operator[] (Type t) { + float& operator[] (int t) { return _data[t]; } @@ -48,10 +49,16 @@ class AudioAnalysis { public: AudioAnalysis (int c); + AudioAnalysis (std::string); void add_point (int c, AudioPoint const & p); + + AudioPoint get_point (int c, int p) const; + int points (int c) const; + void write (std::string); + private: std::vector<std::vector<AudioPoint> > _data; }; |
