2 #include "AudioBasic/Collections.h"
3 #include "AudioEffects/SoundGenerator.h"
4 #include "AudioEffects/AudioEffect.h"
5 #include "AudioTools/AudioStreams.h"
6 #if defined(USE_VARIANTS) && __cplusplus >= 201703L
29 effects.push_back(&effect);
35 effects.push_back(effect);
36 LOGI(
"addEffect -> Number of effects: %d", (
int)
size());
46 return effects.size();
53 for (
int j=0;j<
size();j++){
55 if (effects[j]->
id()==id){
58 LOGI(
"--> findEffect -> %d", effects[j]->
id());
86 template <
class GeneratorT>
96 p_generator = copy.p_generator;
97 for (
int j=0;j<copy.
size();j++){
100 LOGI(
"Number of effects %d -> %d", copy.
size(), this->size());
111 setInput(* (
new GeneratorT(input, channels, volume)));
112 owns_generator =
true;
118 if (owns_generator && p_generator!=
nullptr){
121 for (
int j=0;j<effects.
size();j++){
147 LOGI(
"addEffect -> Number of effects: %d",
size());
153 if (p_generator!=
nullptr){
154 sample = p_generator->readSample();
156 for (
int j=0; j<
size; j++){
157 sample = effects[j]->process(sample);
171 return effects.
size();
191 GeneratorT *p_generator=
nullptr;
192 bool owns_generator =
false;
239 void end()
override {
257 size_t readBytes(uint8_t *buffer,
size_t length)
override {
258 if (!active || p_io==
nullptr)
return 0;
259 int frames = length /
sizeof(T) / info.
channels;
260 size_t result_size = 0;
262 if (p_io->available()<(
sizeof(T)*info.
channels)){
266 for (
int count=0;count<frames;count++){
269 for (
int ch=0;ch<info.
channels;ch++){
271 p_io->readBytes((uint8_t*)&sample,
sizeof(T));
272 result_sample += sample / info.
channels;
276 for (
int j=0; j<
size(); j++){
277 result_sample = effects[j]->process(result_sample);
281 T* p_buffer = ((T*)buffer)+(count*info.
channels);
282 for (
int ch=0;ch<info.
channels;ch++){
283 p_buffer[ch] = result_sample;
284 result_size +=
sizeof(T);
294 size_t write(
const uint8_t *buffer,
size_t length)
override {
295 if (!active)
return 0;
297 assert(length % (
sizeof(T)*info.
channels)==0);
298 int frames = length /
sizeof(T) / info.
channels;
299 size_t result_size = 0;
302 for (
int j=0;j<frames;j++){
304 T* p_buffer = ((T*)buffer) + (j*info.
channels);
306 for (
int ch=0;ch<info.
channels;ch++){
307 sample += p_buffer[ch] / info.
channels;
308 result_size +=
sizeof(T);
312 for (
int j=0; j<
size(); j++){
313 sample = effects[j]->process(sample);
317 for (
int ch=0;ch<info.
channels;ch++){
319 p_io->write((uint8_t*)&sample,
sizeof(T));
321 }
else if (p_print!=
nullptr){
322 p_print->write((uint8_t*)&sample,
sizeof(T));
329 int available()
override {
330 if (p_io==
nullptr)
return 0;
331 return p_io->available();
334 int availableForWrite()
override {
335 if (p_print!=
nullptr)
return p_print->availableForWrite();
336 if (p_io!=
nullptr)
return p_io->availableForWrite();
350 LOGI(
"addEffect -> Number of effects: %d", (
int)
size());
361 return effects.
size();
378 Print *p_print=
nullptr;
381 #if defined(USE_VARIANTS) && __cplusplus >= 201703L || defined(DOXYGEN)
416 variant.emplace<0>();
419 variant.emplace<1>();
422 variant.emplace<2>();
428 std::visit( [
this](
auto&& e) {
return e.setOutput(*p_print);}, variant );
429 std::visit( [
this](
auto&& e) {
return e.setInput(*p_io);}, variant );
430 return std::visit( [cfg](
auto&& e) {
return e.begin(cfg);}, variant );
433 void end()
override {
434 std::visit( [](
auto&& e) {e.end();}, variant );
437 void setInput(
Stream &io){
441 void setStream(
Stream &io){
445 void setOutput(
Stream &io){
449 void setOutput(
Print &print){
457 size_t readBytes(uint8_t *buffer,
size_t length)
override {
458 return std::visit( [buffer, length](
auto&& e) {
return e.readBytes(buffer, length);}, variant );
465 size_t write(
const uint8_t *buffer,
size_t length)
override {
466 return std::visit( [buffer, length](
auto&& e) {
return e.write(buffer, length);}, variant );
469 int available()
override {
470 return std::visit( [](
auto&& e) {
return e.available();}, variant );
473 int availableForWrite()
override {
474 return std::visit( [](
auto&& e) {
return e.availableForWrite();}, variant );
484 std::visit( [effect](
auto&& e) {e.addEffect(effect);}, variant );
489 std::visit( [](
auto&& e) {e.clear();}, variant );
494 return std::visit( [](
auto&& e) {
return e.size();}, variant );
499 return std::visit( [idx](
auto&& e) {
return e[idx];}, variant );
504 return std::visit( [
id](
auto&& e) {
return e.findEffect(
id);}, variant );
510 Print *p_print=
nullptr;