85 Chan&
ret(uint8_t idx) {
return returns_[idx].channel; }
86 const Chan&
ret(uint8_t idx)
const {
return returns_[idx].channel; }
92 if (idx < NumReturn) {
93 returns_[idx].processor = fn;
94 returns_[idx].processor_ctx = ctx;
116 for (uint8_t i = 0; i < NumReturn; ++i)
117 clear_buf(returns_[i].channel.buf_l, returns_[i].channel.buf_r, n);
121 for (uint8_t i = 0; i < NumAudio; ++i)
125 for (uint8_t i = 0; i < NumAudio; ++i)
126 route_channel_sends(
audio[i], n);
129 for (uint8_t i = 0; i < NumReturn; ++i) {
130 auto& slot = returns_[i];
133 if (slot.processor) {
134 slot.processor(slot.processor_ctx,
135 slot.channel.buf_l, slot.channel.buf_r, n);
141 slot.channel.process(n);
144 route_channel_sends(slot.channel, n);
151 apply_master_gain(n);
162 void* processor_ctx =
nullptr;
166 float bus_gain_ = 0.707f;
167 float output_trim_ = 0.5f;
168 ReturnSlot returns_[NumReturn] = {};
172 static void clear_buf(
float* l,
float* r, uint16_t n) {
173 for (uint16_t i = 0; i < n; ++i) {
183 void route_channel_sends(
Chan& ch, uint16_t n) {
184 for (uint8_t s = 0; s < ch.send_count(); ++s) {
185 auto& send = ch.send(s);
188 float send_gain = send.
level.tick(n);
189 if (send_gain < 0.001f)
continue;
191 Chan& tgt = returns_[send.target].channel;
192 const float* src_l = ch.buf_l;
199 : ch.fader_gain() * send_gain;
201 for (uint16_t i = 0; i < n; ++i) {
202 tgt.buf_l[i] += src_l[i] * gain;
203 tgt.buf_r[i] += src_r[i] * gain;
211 void sum_to_master(uint16_t n) {
213 bool any_audio_solo =
false;
214 for (uint8_t i = 0; i < NumAudio; ++i)
215 if (
audio[i].soloed()) any_audio_solo =
true;
217 bool any_ret_solo =
false;
218 for (uint8_t i = 0; i < NumReturn; ++i)
219 if (returns_[i].channel.soloed()) any_ret_solo =
true;
222 for (uint8_t ch = 0; ch < NumAudio; ++ch) {
223 if (
audio[ch].muted())
continue;
224 if (any_audio_solo && !
audio[ch].soloed())
continue;
229 for (uint16_t i = 0; i < n; ++i) {
236 for (uint8_t ch = 0; ch < NumReturn; ++ch) {
237 if (returns_[ch].channel.muted())
continue;
238 if (any_ret_solo && !returns_[ch].channel.soloed())
continue;
240 const float* src_l = returns_[ch].channel.post_l();
241 const float* src_r = returns_[ch].channel.post_r();
243 for (uint16_t i = 0; i < n; ++i) {
251 void apply_master_gain(uint16_t n) {
252 float master_gain = master_fader_.
tick(n);
253 float gain = master_gain * bus_gain_ * output_trim_;
254 for (uint16_t i = 0; i < n; ++i) {