1 #ifndef INCLUDED_AUDIOFX_ANALYSIS_H
2 #define INCLUDED_AUDIOFX_ANALYSIS_H
3 
4 #include <string>
5 #include <vector>
6 
7 #include <pthread.h>
8 
9 #include "samplebuffer_iterators.h"
10 #include "audiofx.h"
11 
12 class MESSAGE_ITEM;
13 
14 /**
15  * Virtual base for signal analyzers.
16  * @author Kai Vehmanen
17  */
18 class EFFECT_ANALYSIS : public EFFECT_BASE {
19 
20  public:
21 
set_parameter(int param,parameter_t value)22   virtual void set_parameter(int param, parameter_t value) { }
get_parameter(int param)23   virtual parameter_t get_parameter(int param) const { return(0.0); }
24 
parameter_names(void)25   virtual std::string parameter_names(void) const { return(""); }
26 
27   virtual ~EFFECT_ANALYSIS(void);
28 };
29 
30 /**
31  * Analyzes the audio signal volume by using a set of
32  * amplitude range buckets.
33  *
34  * @author Kai Vehmanen
35  */
36 class EFFECT_VOLUME_BUCKETS : public EFFECT_ANALYSIS {
37 
38 private:
39 
40   std::vector<unsigned long int> num_of_samples; // number of samples processed
41   std::vector<std::vector<unsigned long int> > pos_samples_db;
42   std::vector<std::vector<unsigned long int> > neg_samples_db;
43   SAMPLE_SPECS::sample_t max_pos, max_neg;
44 
45   mutable pthread_mutex_t lock_rep;
46   SAMPLE_ITERATOR_CHANNELS i;
47 
48   void reset_all_stats(void);
49   void reset_period_stats(void);
50   void status_entry(const std::vector<unsigned long int>& buckets, std::string& otemp) const;
51 
52  public:
53 
54   parameter_t max_multiplier(void) const;
55 
name(void)56   virtual std::string name(void) const { return("Volume analysis"); }
parameter_names(void)57   virtual std::string parameter_names(void) const { return("cumulative-mode,result-max-multiplier"); }
58 
59   virtual void parameter_description(int param, struct PARAM_DESCRIPTION *pd) const;
60   virtual void set_parameter(int param, parameter_t value);
61   virtual parameter_t get_parameter(int param) const;
62 
63   virtual void init(SAMPLE_BUFFER *insample);
64   virtual void process(void);
65   virtual std::string status(void) const;
66 
clone(void)67   virtual EFFECT_VOLUME_BUCKETS* clone(void) const { return new EFFECT_VOLUME_BUCKETS(*this); }
new_expr(void)68   virtual EFFECT_VOLUME_BUCKETS* new_expr(void) const { return new EFFECT_VOLUME_BUCKETS(); }
69   EFFECT_VOLUME_BUCKETS (void);
70   virtual ~EFFECT_VOLUME_BUCKETS (void);
71 };
72 
73 /**
74  * Keeps track of peak amplitude.
75  *
76  * @author Kai Vehmanen
77  */
78 class EFFECT_VOLUME_PEAK : public EFFECT_ANALYSIS {
79 
80  public:
81 
name(void)82   virtual std::string name(void) const { return("Peak amplitude watcher"); }
83   virtual std::string parameter_names(void) const;
84 
85   virtual void parameter_description(int param, struct PARAM_DESCRIPTION *pd) const;
86   virtual void set_parameter(int param, parameter_t value);
87   virtual parameter_t get_parameter(int param) const;
88 
89   virtual void init(SAMPLE_BUFFER *insample);
90   virtual void process(void);
91   // virtual std::string status(void) const;
92 
clone(void)93   virtual EFFECT_VOLUME_PEAK* clone(void) const { return new EFFECT_VOLUME_PEAK(*this); }
new_expr(void)94   virtual EFFECT_VOLUME_PEAK* new_expr(void) const { return new EFFECT_VOLUME_PEAK(); }
95   EFFECT_VOLUME_PEAK (void);
96   virtual ~EFFECT_VOLUME_PEAK (void);
97 
98  private:
99 
100   mutable volatile parameter_t * volatile max_amplitude_repp;
101   mutable long int clipped_samples_rep;
102 
103   mutable std::string status_rep;
104 
105   SAMPLE_ITERATOR_CHANNELS i;
106 };
107 
108 /**
109  * Calculates DC-offset.
110  *
111  * @author Kai Vehmanen
112  */
113 class EFFECT_DCFIND : public EFFECT_ANALYSIS {
114 
115 private:
116 
117   std::vector<parameter_t> pos_sum;
118   std::vector<parameter_t> neg_sum;
119   std::vector<parameter_t> num_of_samples;
120 
121   SAMPLE_SPECS::sample_t tempval;
122   SAMPLE_ITERATOR_CHANNELS i;
123 
124 public:
125 
126   parameter_t get_deltafix(int channel) const;
127 
name(void)128   virtual std::string name(void) const { return("DC-Find"); }
description(void)129   virtual std::string description(void) const { return("Calculates the DC-offset."); }
130   virtual std::string parameter_names(void) const;
131 
132   virtual void init(SAMPLE_BUFFER *insample);
133   virtual void process(void);
134   virtual std::string status(void) const;
135 
136   virtual void parameter_description(int param, struct PARAM_DESCRIPTION *pd) const;
137   virtual void set_parameter(int param, parameter_t value);
138   virtual parameter_t get_parameter(int param) const;
139 
clone(void)140   virtual EFFECT_DCFIND* clone(void) const { return new EFFECT_DCFIND(*this); }
new_expr(void)141   virtual EFFECT_DCFIND* new_expr(void) const { return new EFFECT_DCFIND(); }
142   EFFECT_DCFIND (void);
143 };
144 
145 #endif
146