d7fa168e056ddb42bee897421f8ec07fe4f939ea
[goodguy/history.git] / cinelerra-5.1 / cinelerra / meterhistory.C
1 #include "meterhistory.h"
2
3 #include <math.h>
4
5 MeterHistory::MeterHistory()
6 {
7         size = 0;
8         channels = 0;
9         current_peak = 0;
10         samples = 0;
11         values = 0;
12 }
13 MeterHistory::~MeterHistory()
14 {
15         init(0, 0);
16 }
17
18 void MeterHistory::init(int chs, int sz)
19 {
20         if( size != sz ) {
21                 delete [] samples;  samples = 0;
22                 size = 0;
23         }
24         if( !samples && sz > 0 ) {
25                 samples = new int64_t[size = sz];
26                 for( int i=0; i<size; ++i ) samples[i] = -1;
27         }
28         if( channels != chs ) {
29                 for( int i=0; i<channels; ++i ) delete [] values[i];
30                 delete [] values;  values = 0;
31                 delete [] current_peak;  current_peak = 0;
32                 channels = 0;
33         }
34         if( !values && chs > 0 ) {
35                 current_peak = new int[channels = chs];
36                 for( int i=0; i<channels; ++i ) current_peak[i] = 0;
37                 values = new double*[channels];
38                 for( int i=0; i<channels; ++i ) values[i] = 0;
39         }
40 }
41
42 void MeterHistory::reset_channel(int ch)
43 {
44         if( !ch ) for( int i=0; i<size; ++i ) samples[i] = -1;
45         current_peak[ch] = 0;
46         double *peaks = values[ch];
47         if( !peaks ) values[ch] = peaks = new double[size];
48         for( int i=0; i<size; ++i ) peaks[i] = 0;
49 }
50
51 void MeterHistory::set_peak(int ch, double peak, int64_t pos)
52 {
53         int peak_idx = current_peak[ch];
54         samples[peak_idx] = pos;
55         values[ch][peak_idx++] = peak;
56         if( peak_idx >= size ) peak_idx = 0;
57         current_peak[ch] = peak_idx;
58 }
59
60 double MeterHistory::get_peak(int ch, int idx)
61 {
62         return idx>=0 ? values[ch][idx] : 0;
63 }
64
65 int MeterHistory::get_nearest(int64_t pos, int64_t tolerance)
66 {
67         int result = -1;
68         if( size > 0 ) {
69                 int64_t best = tolerance;
70                 for( int i=0; i<size; ++i ) {
71                         int64_t diff = labs(samples[i] - pos);
72                         if( diff >= tolerance || diff >= best ) continue;
73                         best = diff;  result = i;
74                 }
75         }
76         return result;
77 }
78