Skip to content

Commit 0523d45

Browse files
committed
feat: Improve audio testing for esp-box, m5stack-tab5, and t-deck components
1 parent 9c4532e commit 0523d45

File tree

3 files changed

+69
-18
lines changed

3 files changed

+69
-18
lines changed

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

Lines changed: 22 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,16 @@ 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+
// get the sample rate from the wav header (bytes 24-27)
399+
uint32_t sample_rate = *(reinterpret_cast<const uint32_t *>(&audio_bytes[24]));
400+
// set the audio sample rate accordingly
401+
// decode the wav file header (first 44 bytes) and remove it
402+
if (audio_bytes.size() > 44) {
403+
audio_bytes.erase(audio_bytes.begin(), audio_bytes.begin() + 44);
404+
}
405+
out_size = audio_bytes.size();
406+
out_sample_rate = sample_rate;
407+
return true;
391408
}
392409

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

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

Lines changed: 24 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,16 @@ 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+
// get the sample rate from the wav header (bytes 24-27)
536+
uint32_t sample_rate = *(reinterpret_cast<const uint32_t *>(&audio_bytes[24]));
537+
// set the audio sample rate accordingly
538+
// decode the wav file header (first 44 bytes) and remove it
539+
if (audio_bytes.size() > 44) {
540+
audio_bytes.erase(audio_bytes.begin(), audio_bytes.begin() + 44);
541+
}
542+
out_size = audio_bytes.size();
543+
out_sample_rate = sample_rate;
544+
return true;
529545
}
530546

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

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

Lines changed: 23 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,18 @@ 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+
// the wav file is 44.1kHz, set the audio rate to match
192+
logger.info("Setting audio sample rate to {} Hz", wav_sample_rate);
193+
tdeck.audio_sample_rate(wav_sample_rate);
194+
186195
// unmute the audio and set the volume to 20%
187196
tdeck.mute(false);
188197
tdeck.volume(20.0f);
@@ -223,10 +232,10 @@ static void clear_circles() {
223232
circles.clear();
224233
}
225234

226-
static size_t load_audio() {
235+
static bool load_audio(size_t &out_size, size_t &out_sample_rate) {
227236
// if the audio_bytes vector is already populated, return the size
228237
if (audio_bytes.size() > 0) {
229-
return audio_bytes.size();
238+
return true;
230239
}
231240

232241
// load the audio data. these are configured in the CMakeLists.txt file
@@ -236,7 +245,16 @@ static size_t load_audio() {
236245
// cppcheck-suppress syntaxError
237246
extern const uint8_t click_wav_end[] asm("_binary_click_wav_end");
238247
audio_bytes = std::vector<uint8_t>(click_wav_start, click_wav_end);
239-
return audio_bytes.size();
248+
// get the sample rate from the wav header (bytes 24-27)
249+
uint32_t sample_rate = *(reinterpret_cast<const uint32_t *>(&audio_bytes[24]));
250+
// set the audio sample rate accordingly
251+
// decode the wav file header (first 44 bytes) and remove it
252+
if (audio_bytes.size() > 44) {
253+
audio_bytes.erase(audio_bytes.begin(), audio_bytes.begin() + 44);
254+
}
255+
out_size = audio_bytes.size();
256+
out_sample_rate = sample_rate;
257+
return true;
240258
}
241259

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

0 commit comments

Comments
 (0)