Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 27 additions & 5 deletions components/esp-box/example/main/esp_box_example.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ static std::recursive_mutex lvgl_mutex;
static void draw_circle(int x0, int y0, int radius);
static void clear_circles();

static size_t load_audio();
static bool load_audio(size_t &out_size, size_t &out_sample_rate);
static void play_click(espp::EspBox &box);

extern "C" void app_main(void) {
Expand Down Expand Up @@ -209,9 +209,17 @@ extern "C" void app_main(void) {
lv_task.start();

// load the audio file (wav file bundled in memory)
size_t wav_size = load_audio();
size_t wav_size = 0;
size_t wav_sample_rate = 0;
if (!load_audio(wav_size, wav_sample_rate)) {
logger.error("Failed to load audio file!");
return;
}
logger.info("Loaded {} bytes of audio", wav_size);

logger.info("Setting audio sample rate to {} Hz", wav_sample_rate);
box.audio_sample_rate(wav_sample_rate);

// unmute the audio and set the volume to 60%
box.mute(false);
box.volume(60.0f);
Expand Down Expand Up @@ -374,10 +382,10 @@ static void clear_circles() {
circles.clear();
}

static size_t load_audio() {
static bool load_audio(size_t &out_size, size_t &out_sample_rate) {
// if the audio_bytes vector is already populated, return the size
if (audio_bytes.size() > 0) {
return audio_bytes.size();
return true;
}

// load the audio data. these are configured in the CMakeLists.txt file
Expand All @@ -387,7 +395,21 @@ static size_t load_audio() {
// cppcheck-suppress syntaxError
extern const uint8_t click_wav_end[] asm("_binary_click_wav_end");
audio_bytes = std::vector<uint8_t>(click_wav_start, click_wav_end);
return audio_bytes.size();
// ensure we have at least a wav header
if (audio_bytes.size() < 44) {
audio_bytes.clear();
return false;
}
// get the sample rate from the wav header (bytes 24-27)
uint32_t sample_rate = *(reinterpret_cast<const uint32_t *>(&audio_bytes[24]));
// set the audio sample rate accordingly
// decode the wav file header (first 44 bytes) and remove it
if (audio_bytes.size() > 44) {
audio_bytes.erase(audio_bytes.begin(), audio_bytes.begin() + 44);
}
out_size = audio_bytes.size();
out_sample_rate = sample_rate;
return true;
}

static void play_click(espp::EspBox &box) {
Expand Down
37 changes: 29 additions & 8 deletions components/m5stack-tab5/example/main/m5stack_tab5_example.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ static std::recursive_mutex lvgl_mutex;
static void draw_circle(int x0, int y0, int radius);
static void clear_circles();

static size_t load_audio();
static bool load_audio(size_t &out_size, size_t &out_sample_rate);
static void play_click(espp::M5StackTab5 &tab5);

extern "C" void app_main(void) {
Expand Down Expand Up @@ -321,10 +321,17 @@ extern "C" void app_main(void) {
}});
lv_task.start();

// load the audio and play it once as a test
logger.info("Loading audio...");
auto num_bytes_loaded = load_audio();
logger.info("Loaded {} bytes of audio", num_bytes_loaded);
// load the audio file (wav file bundled in memory)
size_t wav_size = 0;
size_t wav_sample_rate = 0;
if (!load_audio(wav_size, wav_sample_rate)) {
logger.error("Failed to load audio file!");
return;
}
logger.info("Loaded {} bytes of audio", wav_size);

logger.info("Setting audio sample rate to {} Hz", wav_sample_rate);
tab5.audio_sample_rate(wav_sample_rate);

// unmute the audio and set the volume to 60%
tab5.mute(false);
Expand Down Expand Up @@ -512,10 +519,10 @@ static void clear_circles() {
circles.clear();
}

static size_t load_audio() {
static bool load_audio(size_t &out_size, size_t &out_sample_rate) {
// if the audio_bytes vector is already populated, return the size
if (audio_bytes.size() > 0) {
return audio_bytes.size();
return true;
}

// load the audio data. these are configured in the CMakeLists.txt file
Expand All @@ -525,7 +532,21 @@ static size_t load_audio() {
// cppcheck-suppress syntaxError
extern const uint8_t click_wav_end[] asm("_binary_click_wav_end");
audio_bytes = std::vector<uint8_t>(click_wav_start, click_wav_end);
return audio_bytes.size();
// ensure we have at least a wav header
if (audio_bytes.size() < 44) {
audio_bytes.clear();
return false;
}
// get the sample rate from the wav header (bytes 24-27)
uint32_t sample_rate = *(reinterpret_cast<const uint32_t *>(&audio_bytes[24]));
// set the audio sample rate accordingly
// decode the wav file header (first 44 bytes) and remove it
if (audio_bytes.size() > 44) {
audio_bytes.erase(audio_bytes.begin(), audio_bytes.begin() + 44);
}
out_size = audio_bytes.size();
out_sample_rate = sample_rate;
return true;
}

static void play_click(espp::M5StackTab5 &tab5) {
Expand Down
32 changes: 27 additions & 5 deletions components/t-deck/example/main/t_deck_example.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ static std::recursive_mutex lvgl_mutex;
static void draw_circle(int x0, int y0, int radius);
static void clear_circles();

static size_t load_audio();
static bool load_audio(size_t &out_size, size_t &out_sample_rate);
static void play_click(espp::TDeck &tdeck);

LV_IMG_DECLARE(mouse_cursor_icon);
Expand Down Expand Up @@ -180,9 +180,17 @@ extern "C" void app_main(void) {
lv_task.start();

// load the audio file (wav file bundled in memory)
size_t wav_size = load_audio();
size_t wav_size = 0;
size_t wav_sample_rate = 0;
if (!load_audio(wav_size, wav_sample_rate)) {
logger.error("Failed to load audio file!");
return;
}
logger.info("Loaded {} bytes of audio", wav_size);

logger.info("Setting audio sample rate to {} Hz", wav_sample_rate);
tdeck.audio_sample_rate(wav_sample_rate);

// unmute the audio and set the volume to 20%
tdeck.mute(false);
tdeck.volume(20.0f);
Expand Down Expand Up @@ -223,10 +231,10 @@ static void clear_circles() {
circles.clear();
}

static size_t load_audio() {
static bool load_audio(size_t &out_size, size_t &out_sample_rate) {
// if the audio_bytes vector is already populated, return the size
if (audio_bytes.size() > 0) {
return audio_bytes.size();
return true;
}

// load the audio data. these are configured in the CMakeLists.txt file
Expand All @@ -236,7 +244,21 @@ static size_t load_audio() {
// cppcheck-suppress syntaxError
extern const uint8_t click_wav_end[] asm("_binary_click_wav_end");
audio_bytes = std::vector<uint8_t>(click_wav_start, click_wav_end);
return audio_bytes.size();
// ensure we have at least a wav header
if (audio_bytes.size() < 44) {
audio_bytes.clear();
return false;
}
// get the sample rate from the wav header (bytes 24-27)
uint32_t sample_rate = *(reinterpret_cast<const uint32_t *>(&audio_bytes[24]));
// set the audio sample rate accordingly
// decode the wav file header (first 44 bytes) and remove it
if (audio_bytes.size() > 44) {
audio_bytes.erase(audio_bytes.begin(), audio_bytes.begin() + 44);
}
out_size = audio_bytes.size();
out_sample_rate = sample_rate;
return true;
}

static void play_click(espp::TDeck &tdeck) {
Expand Down