Skip to content

Commit 5b90b75

Browse files
committed
codal_app/microbithal_audio: Add helper functions for sound exprs.
To check if a sound expression is playing, and to stop them playing. Signed-off-by: Damien George <damien@micropython.org>
1 parent 8a1dbe4 commit 5b90b75

File tree

3 files changed

+26
-0
lines changed

3 files changed

+26
-0
lines changed

src/codal_app/main.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ extern "C" void m_printf(...);
3333
extern "C" void microbit_hal_timer_callback(void);
3434
extern "C" void microbit_hal_gesture_callback(int);
3535
extern "C" void microbit_hal_level_detector_callback(int);
36+
extern "C" void microbit_hal_sound_synth_callback(int);
3637
extern "C" void microbit_radio_irq_handler(void);
3738

3839
MicroBit uBit;
@@ -49,6 +50,10 @@ void level_detector_event_handler(Event evt) {
4950
microbit_hal_level_detector_callback(evt.value);
5051
}
5152

53+
void sound_synth_event_handler(Event evt) {
54+
microbit_hal_sound_synth_callback(evt.value);
55+
}
56+
5257
int main() {
5358
uBit.init();
5459

@@ -64,6 +69,7 @@ int main() {
6469
uBit.messageBus.listen(DEVICE_ID_SERIAL, CODAL_SERIAL_EVT_DELIM_MATCH, serial_interrupt_handler, MESSAGE_BUS_LISTENER_IMMEDIATE);
6570
uBit.messageBus.listen(DEVICE_ID_GESTURE, DEVICE_EVT_ANY, gesture_event_handler);
6671
uBit.messageBus.listen(DEVICE_ID_SYSTEM_LEVEL_DETECTOR, DEVICE_EVT_ANY, level_detector_event_handler);
72+
uBit.messageBus.listen(DEVICE_ID_SOUND_EMOJI_SYNTHESIZER_0, DEVICE_EVT_ANY, sound_synth_event_handler);
6773

6874
// 6ms follows the micro:bit v1 value
6975
system_timer_event_every(6, MICROPY_TIMER_EVENT, 1);

src/codal_app/microbithal.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,9 @@ const uint8_t *microbit_hal_get_font_data(char c);
139139
void microbit_hal_audio_select_pin(int pin);
140140
void microbit_hal_audio_select_speaker(bool enable);
141141
void microbit_hal_audio_set_volume(int value);
142+
bool microbit_hal_audio_is_expression_active(void);
142143
void microbit_hal_audio_play_expression_by_name(const char *name);
144+
void microbit_hal_audio_stop_expression(void);
143145

144146
void microbit_hal_audio_init(uint32_t sample_rate);
145147
void microbit_hal_audio_write_data(const uint8_t *buf, size_t num_samples);

src/codal_app/microbithal_audio.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ extern "C" {
5959

6060
#include "microbithal.h"
6161

62+
static uint8_t sound_synth_active_count = 0;
63+
6264
void microbit_hal_audio_select_pin(int pin) {
6365
if (pin < 0) {
6466
uBit.audio.setPinEnabled(false);
@@ -81,10 +83,26 @@ void microbit_hal_audio_set_volume(int value) {
8183
}
8284
}
8385

86+
void microbit_hal_sound_synth_callback(int event) {
87+
if (event == DEVICE_SOUND_EMOJI_SYNTHESIZER_EVT_DONE) {
88+
--sound_synth_active_count;
89+
}
90+
}
91+
92+
bool microbit_hal_audio_is_expression_active(void) {
93+
return sound_synth_active_count > 0;
94+
}
95+
8496
void microbit_hal_audio_play_expression_by_name(const char *name) {
97+
++sound_synth_active_count;
98+
uBit.audio.soundExpressions.stop();
8599
uBit.audio.soundExpressions.playAsync(name);
86100
}
87101

102+
void microbit_hal_audio_stop_expression(void) {
103+
uBit.audio.soundExpressions.stop();
104+
}
105+
88106
void microbit_hal_audio_init(uint32_t sample_rate) {
89107
if (!data_source.started) {
90108
MicroBitAudio::requestActivation();

0 commit comments

Comments
 (0)