File: effect_equalizer.cpp

package info (click to toggle)
zytrax 0%2Bgit20201215-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye
  • size: 2,488 kB
  • sloc: cpp: 41,800; ansic: 3,387; makefile: 8; sh: 3
file content (132 lines) | stat: -rw-r--r-- 3,274 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include "effect_equalizer.h"

#include "dsp/db.h"
#include <math.h>
//process
bool AudioEffectEqualizer::has_secondary_input() const {
	return false;
}

void AudioEffectEqualizer::process(const Event *p_events, int p_event_count, const AudioFrame *p_in, AudioFrame *p_out, bool p_prev_active) {

	int band_count = bands[0].size();
	EQ::BandProcess *proc_l = &bands[0][0];
	EQ::BandProcess *proc_r = &bands[1][0];

	float *bgain = &gains[0];
	for (int i = 0; i < band_count; i++) {
		bgain[i] = db2linear(control_ports[i].value);
	}

	for (int i = 0; i < block_size; i++) {

		AudioFrame src = p_in[i];
		AudioFrame dst = AudioFrame(0, 0);

		for (int j = 0; j < band_count; j++) {

			float l = src.l;
			float r = src.r;

			proc_l[j].process_one(l);
			proc_r[j].process_one(r);

			dst.l += l * bgain[j];
			dst.r += r * bgain[j];
		}

		p_out[i] = dst;
	}
}

void AudioEffectEqualizer::process_with_secondary(const Event *p_events, int p_event_count, const AudioFrame *p_in, const AudioFrame *p_secondary, AudioFrame *p_out, bool p_prev_active) {
}

void AudioEffectEqualizer::set_process_block_size(int p_size) {
	block_size = p_size;
}
void AudioEffectEqualizer::set_sampling_rate(int p_hz) {
	if (sampling_rate != p_hz) {
		sampling_rate = p_hz;
		_update_buffers();
	}
}
//info
String AudioEffectEqualizer::get_name() const {
	return "EQ (" + String::num(eq.get_band_count()) + " Band)";
}
String AudioEffectEqualizer::get_unique_id() const {
	return "eq_" + String::num(eq.get_band_count());
}
String AudioEffectEqualizer::get_provider_id() const {
	return "internal";
}

int AudioEffectEqualizer::get_control_port_count() const {
	return control_ports.size();
}
ControlPort *AudioEffectEqualizer::get_control_port(int p_port) {
	ERR_FAIL_INDEX_V(p_port, control_ports.size(), NULL);
	return &control_ports[p_port];
}

void AudioEffectEqualizer::reset() {
	_update_buffers();
}

/* Load/Save */

JSON::Node AudioEffectEqualizer::to_json() const {
	JSON::Node node = JSON::object();

	for (int i = 0; i < control_ports.size(); i++) {
		node.add(control_ports[i].identifier.utf8().get_data(), control_ports[i].value);
	}
	return node;
}
Error AudioEffectEqualizer::from_json(const JSON::Node &node) {

	for (int i = 0; i < control_ports.size(); i++) {
		std::string key = control_ports[i].identifier.utf8().get_data();
		if (node.has(key)) {
			control_ports[i].value = node.get(key).toFloat();
		}
	}
	return OK;
}

void AudioEffectEqualizer::_update_buffers() {

	eq.set_mix_rate(sampling_rate);
	for (int i = 0; i < 2; i++) {
		bands[i].clear();
		for (int j = 0; j < eq.get_band_count(); j++) {
			bands[i].push_back(eq.get_band_processor(j));
		}
	}
	gains.resize(eq.get_band_count());
}
AudioEffectEqualizer::AudioEffectEqualizer(EQ::Preset p_preset) {

	eq.set_preset_band_mode(p_preset);

	for (int i = 0; i < eq.get_band_count(); i++) {

		ControlPortDefault port;
		port.name = String::num(eq.get_band_frequency(i), 0) + " hz (db)";
		port.identifier = "band_" + String::num(i);
		port.min = -48;
		port.max = 12;
		port.step = 0.1;
		port.value = 0;
		control_ports.push_back(port);
	}
	block_size = 128;
	sampling_rate = 0;
	set_sampling_rate(44100);
	set_process_block_size(128);

	_update_buffers();
}
AudioEffectEqualizer::~AudioEffectEqualizer() {
}