FastLED 3.9.15
Loading...
Searching...
No Matches
AudioInput.ino
Go to the documentation of this file.
1// @filter: ((platform is teensy) and (memory is large)) or (platform is esp32)
2
3// I2S Audio Input Example
4// This example demonstrates using I2S audio input to control FastLED strips
5// Supports ESP32 (INMP441 microphone) and Teensy (Teensy Audio Library)
6
7// FastLED.h must be included first to trigger precompiled headers for FastLED's build system
8#include "FastLED.h"
9
11#include "fl/stl/sstream.h"
12
13
14#if defined(FL_IS_TEENSY)
15#include "TeensyAudioInput.h"
16#else
17#include "ESP32AudioInput.h"
18#endif
19
20
21using fl::i16;
22
23// Global audio source (initialized in setup)
25
26void setup() {
27 Serial.begin(115200);
28
29 Serial.println(PLATFORM_NAME);
30 Serial.println("================================");
32 Serial.println();
33
34 Serial.print("Waiting ");
36 Serial.println("ms for platform initialization...");
38
39 // Create platform-specific audio configuration
41
42 // Initialize I2S Audio
43 Serial.println("Initializing audio input...");
44 fl::string errorMsg;
45 audioSource = fl::audio::IInput::create(config, &errorMsg);
46
47 if (!audioSource) {
48 Serial.print("Failed to create audio source: ");
49 Serial.println(errorMsg.c_str());
50 return;
51 }
52
53 // Start audio capture
54 Serial.println("Starting audio capture...");
55 audioSource->start();
56
57 // Check for start errors
58 fl::string startErrorMsg;
59 if (audioSource->error(&startErrorMsg)) {
60 Serial.print("Audio start error: ");
61 Serial.println(startErrorMsg.c_str());
62 return;
63 }
64
65 Serial.println("Audio capture started successfully!");
66 Serial.println("Reading audio data...");
67 Serial.println();
68}
69
70void loop() {
71 EVERY_N_MILLIS(1000) {
72 Serial.println("Loop active...");
73 }
74
75 // Check if audio source is valid
76 if (!audioSource) {
77 Serial.println("Audio source is null!");
78 delay(1000);
79 return;
80 }
81
82 // Check for audio errors
83 fl::string errorMsg;
84 if (audioSource->error(&errorMsg)) {
85 Serial.print("Audio error: ");
86 Serial.println(errorMsg.c_str());
87 delay(100);
88 return;
89 }
90
91 // Read audio data
92 fl::audio::Sample sample = audioSource->read();
93
94 if (sample.isValid()) {
95 EVERY_N_MILLIS(100) {
96 const auto& audioBuffer = sample.pcm();
97 const i16* max_sample = fl::max_element(audioBuffer.begin(), audioBuffer.end());
98 const i16* min_sample = fl::min_element(audioBuffer.begin(), audioBuffer.end());
99
100 fl::sstream ss;
101 ss << "\n--- Audio Sample ---\n";
102 ss << "Samples: " << audioBuffer.size() << "\n";
103 ss << "Timestamp: " << sample.timestamp() << " ms\n";
104 ss << "Max: " << *max_sample << "\n";
105 ss << "Min: " << *min_sample << "\n";
106 ss << "RMS: " << sample.rms() << "\n";
107 ss << "Zero Crossing Frequency: " << sample.zcf() << " Hz\n";
108 FL_WARN(ss.str());
109 }
110 }
111}
void setup()
fl::shared_ptr< fl::audio::IInput > audioSource
void loop()
fl::audio::Config createAudioConfig()
void printPlatformInfo()
#define PLATFORM_NAME
#define PLATFORM_INIT_DELAY_MS
static fl::shared_ptr< IInput > create(const Config &config, fl::string *error_message=nullptr) FL_NOEXCEPT
const char * c_str() const FL_NOEXCEPT
string str() const FL_NOEXCEPT
Definition strstream.h:43
#define EVERY_N_MILLIS(N)
Checks whether to execute a block of code every N milliseconds.
Definition lib8tion.h:1001
#define FL_WARN(X)
Definition log.h:276
Iterator min_element(Iterator first, Iterator last) FL_NOEXCEPT
Definition algorithm.h:56
Iterator max_element(Iterator first, Iterator last) FL_NOEXCEPT
Definition algorithm.h:18
#define Serial
Definition serial.h:304