summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2013-02-24 22:40:57 +0000
committerCarl Hetherington <cth@carlh.net>2013-02-24 22:40:57 +0000
commitdcd968d6d64d645816af0efbcd2f928128c95b9f (patch)
tree97fcfc3df5d984e634169dbfed5bb3fa5aa4ee9b /src/lib
parentcf1e212c30ec7419b96388e4f78b44cb55bf34c5 (diff)
Basic UI.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/analyse_audio_job.cc7
-rw-r--r--src/lib/audio_analysis.cc43
-rw-r--r--src/lib/audio_analysis.h9
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;
};