Skip to content

Commit c7d38ed

Browse files
authored
feat: Improve audio testing for esp-box, m5stack-tab5, and t-deck components (#556)
* feat: Improve audio testing for `esp-box`, `m5stack-tab5`, and `t-deck` components * minor update
1 parent 9c4532e commit c7d38ed

File tree

3 files changed

+83
-18
lines changed

3 files changed

+83
-18
lines changed

components/esp-box/example/main/esp_box_example.cpp

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ static std::recursive_mutex lvgl_mutex;
1818
static void draw_circle(int x0, int y0, int radius);
1919
static void clear_circles();
2020

21-
static size_t load_audio();
21+
static bool load_audio(size_t &out_size, size_t &out_sample_rate);
2222
static void play_click(espp::EspBox &box);
2323

2424
extern "C" void app_main(void) {
@@ -209,9 +209,17 @@ extern "C" void app_main(void) {
209209
lv_task.start();
210210

211211
// load the audio file (wav file bundled in memory)
212-
size_t wav_size = load_audio();
212+
size_t wav_size = 0;
213+
size_t wav_sample_rate = 0;
214+
if (!load_audio(wav_size, wav_sample_rate)) {
215+
logger.error("Failed to load audio file!");
216+
return;
217+
}
213218
logger.info("Loaded {} bytes of audio", wav_size);
214219

220+
logger.info("Setting audio sample rate to {} Hz", wav_sample_rate);
221+
box.audio_sample_rate(wav_sample_rate);
222+
215223
// unmute the audio and set the volume to 60%
216224
box.mute(false);
217225
box.volume(60.0f);
@@ -374,10 +382,10 @@ static void clear_circles() {
374382
circles.clear();
375383
}
376384

377-
static size_t load_audio() {
385+
static bool load_audio(size_t &out_size, size_t &out_sample_rate) {
378386
// if the audio_bytes vector is already populated, return the size
379387
if (audio_bytes.size() > 0) {
380-
return audio_bytes.size();
388+
return true;
381389
}
382390

383391
// load the audio data. these are configured in the CMakeLists.txt file
@@ -387,7 +395,21 @@ static size_t load_audio() {
387395
// cppcheck-suppress syntaxError
388396
extern const uint8_t click_wav_end[] asm("_binary_click_wav_end");
389397
audio_bytes = std::vector<uint8_t>(click_wav_start, click_wav_end);
390-
return audio_bytes.size();
398+
// ensure we have at least a wav header
399+
if (audio_bytes.size() < 44) {
400+
audio_bytes.clear();
401+
return false;
402+
}
403+
// get the sample rate from the wav header (bytes 24-27)
404+
uint32_t sample_rate = *(reinterpret_cast<const uint32_t *>(&audio_bytes[24]));
405+
// set the audio sample rate accordingly
406+
// decode the wav file header (first 44 bytes) and remove it
407+
if (audio_bytes.size() > 44) {
408+
audio_bytes.erase(audio_bytes.begin(), audio_bytes.begin() + 44);
409+
}
410+
out_size = audio_bytes.size();
411+
out_sample_rate = sample_rate;
412+
return true;
391413
}
392414

393415
static void play_click(espp::EspBox &box) {

components/m5stack-tab5/example/main/m5stack_tab5_example.cpp

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ static std::recursive_mutex lvgl_mutex;
2727
static void draw_circle(int x0, int y0, int radius);
2828
static void clear_circles();
2929

30-
static size_t load_audio();
30+
static bool load_audio(size_t &out_size, size_t &out_sample_rate);
3131
static void play_click(espp::M5StackTab5 &tab5);
3232

3333
extern "C" void app_main(void) {
@@ -321,10 +321,17 @@ extern "C" void app_main(void) {
321321
}});
322322
lv_task.start();
323323

324-
// load the audio and play it once as a test
325-
logger.info("Loading audio...");
326-
auto num_bytes_loaded = load_audio();
327-
logger.info("Loaded {} bytes of audio", num_bytes_loaded);
324+
// load the audio file (wav file bundled in memory)
325+
size_t wav_size = 0;
326+
size_t wav_sample_rate = 0;
327+
if (!load_audio(wav_size, wav_sample_rate)) {
328+
logger.error("Failed to load audio file!");
329+
return;
330+
}
331+
logger.info("Loaded {} bytes of audio", wav_size);
332+
333+
logger.info("Setting audio sample rate to {} Hz", wav_sample_rate);
334+
tab5.audio_sample_rate(wav_sample_rate);
328335

329336
// unmute the audio and set the volume to 60%
330337
tab5.mute(false);
@@ -512,10 +519,10 @@ static void clear_circles() {
512519
circles.clear();
513520
}
514521

515-
static size_t load_audio() {
522+
static bool load_audio(size_t &out_size, size_t &out_sample_rate) {
516523
// if the audio_bytes vector is already populated, return the size
517524
if (audio_bytes.size() > 0) {
518-
return audio_bytes.size();
525+
return true;
519526
}
520527

521528
// load the audio data. these are configured in the CMakeLists.txt file
@@ -525,7 +532,21 @@ static size_t load_audio() {
525532
// cppcheck-suppress syntaxError
526533
extern const uint8_t click_wav_end[] asm("_binary_click_wav_end");
527534
audio_bytes = std::vector<uint8_t>(click_wav_start, click_wav_end);
528-
return audio_bytes.size();
535+
// ensure we have at least a wav header
536+
if (audio_bytes.size() < 44) {
537+
audio_bytes.clear();
538+
return false;
539+
}
540+
// get the sample rate from the wav header (bytes 24-27)
541+
uint32_t sample_rate = *(reinterpret_cast<const uint32_t *>(&audio_bytes[24]));
542+
// set the audio sample rate accordingly
543+
// decode the wav file header (first 44 bytes) and remove it
544+
if (audio_bytes.size() > 44) {
545+
audio_bytes.erase(audio_bytes.begin(), audio_bytes.begin() + 44);
546+
}
547+
out_size = audio_bytes.size();
548+
out_sample_rate = sample_rate;
549+
return true;
529550
}
530551

531552
static void play_click(espp::M5StackTab5 &tab5) {

components/t-deck/example/main/t_deck_example.cpp

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ static std::recursive_mutex lvgl_mutex;
1414
static void draw_circle(int x0, int y0, int radius);
1515
static void clear_circles();
1616

17-
static size_t load_audio();
17+
static bool load_audio(size_t &out_size, size_t &out_sample_rate);
1818
static void play_click(espp::TDeck &tdeck);
1919

2020
LV_IMG_DECLARE(mouse_cursor_icon);
@@ -180,9 +180,17 @@ extern "C" void app_main(void) {
180180
lv_task.start();
181181

182182
// load the audio file (wav file bundled in memory)
183-
size_t wav_size = load_audio();
183+
size_t wav_size = 0;
184+
size_t wav_sample_rate = 0;
185+
if (!load_audio(wav_size, wav_sample_rate)) {
186+
logger.error("Failed to load audio file!");
187+
return;
188+
}
184189
logger.info("Loaded {} bytes of audio", wav_size);
185190

191+
logger.info("Setting audio sample rate to {} Hz", wav_sample_rate);
192+
tdeck.audio_sample_rate(wav_sample_rate);
193+
186194
// unmute the audio and set the volume to 20%
187195
tdeck.mute(false);
188196
tdeck.volume(20.0f);
@@ -223,10 +231,10 @@ static void clear_circles() {
223231
circles.clear();
224232
}
225233

226-
static size_t load_audio() {
234+
static bool load_audio(size_t &out_size, size_t &out_sample_rate) {
227235
// if the audio_bytes vector is already populated, return the size
228236
if (audio_bytes.size() > 0) {
229-
return audio_bytes.size();
237+
return true;
230238
}
231239

232240
// load the audio data. these are configured in the CMakeLists.txt file
@@ -236,7 +244,21 @@ static size_t load_audio() {
236244
// cppcheck-suppress syntaxError
237245
extern const uint8_t click_wav_end[] asm("_binary_click_wav_end");
238246
audio_bytes = std::vector<uint8_t>(click_wav_start, click_wav_end);
239-
return audio_bytes.size();
247+
// ensure we have at least a wav header
248+
if (audio_bytes.size() < 44) {
249+
audio_bytes.clear();
250+
return false;
251+
}
252+
// get the sample rate from the wav header (bytes 24-27)
253+
uint32_t sample_rate = *(reinterpret_cast<const uint32_t *>(&audio_bytes[24]));
254+
// set the audio sample rate accordingly
255+
// decode the wav file header (first 44 bytes) and remove it
256+
if (audio_bytes.size() > 44) {
257+
audio_bytes.erase(audio_bytes.begin(), audio_bytes.begin() + 44);
258+
}
259+
out_size = audio_bytes.size();
260+
out_sample_rate = sample_rate;
261+
return true;
240262
}
241263

242264
static void play_click(espp::TDeck &tdeck) {

0 commit comments

Comments
 (0)