Skip to content

Commit 11e3b4c

Browse files
committed
codal_port/modaudio: Add audio.sound_level() method.
Signed-off-by: Damien George <damien@micropython.org>
1 parent 9e10ae9 commit 11e3b4c

File tree

1 file changed

+12
-0
lines changed

1 file changed

+12
-0
lines changed

src/codal_port/modaudio.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ static uint8_t audio_output_buffer[AUDIO_CHUNK_SIZE];
4848
static volatile audio_output_state_t audio_output_state;
4949
static volatile bool audio_fetcher_scheduled;
5050
static size_t audio_raw_offset;
51+
static uint32_t audio_current_sound_level;
5152

5253
microbit_audio_frame_obj_t *microbit_audio_frame_make_new(size_t size);
5354

@@ -59,6 +60,7 @@ void microbit_audio_stop(void) {
5960
audio_source_frame = NULL;
6061
audio_source_iter = NULL;
6162
audio_raw_offset = 0;
63+
audio_current_sound_level = 0;
6264
}
6365

6466
STATIC void audio_buffer_ready(void) {
@@ -125,10 +127,14 @@ STATIC void audio_data_fetcher(void) {
125127
audio_raw_offset += AUDIO_CHUNK_SIZE;
126128

127129
uint8_t *dest = &audio_output_buffer[0];
130+
uint32_t sound_level = 0;
128131
for (int i = 0; i < AUDIO_CHUNK_SIZE; ++i) {
129132
// Copy sample to the buffer.
130133
*dest++ = src[i];
134+
// Compute the sound level.
135+
sound_level += (src[i] - 128) * (src[i] - 128);
131136
}
137+
audio_current_sound_level = sound_level / AUDIO_CHUNK_SIZE / AUDIO_CHUNK_SIZE;
132138

133139
audio_buffer_ready();
134140
}
@@ -284,12 +290,18 @@ mp_obj_t is_playing(void) {
284290
}
285291
MP_DEFINE_CONST_FUN_OBJ_0(microbit_audio_is_playing_obj, is_playing);
286292

293+
STATIC mp_obj_t microbit_audio_sound_level(void) {
294+
return MP_OBJ_NEW_SMALL_INT(audio_current_sound_level);
295+
}
296+
STATIC MP_DEFINE_CONST_FUN_OBJ_0(microbit_audio_sound_level_obj, microbit_audio_sound_level);
297+
287298
STATIC const mp_rom_map_elem_t audio_globals_table[] = {
288299
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_audio) },
289300
{ MP_ROM_QSTR(MP_QSTR_set_rate), MP_ROM_PTR(&microbit_audio_set_rate_obj) },
290301
{ MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&microbit_audio_stop_obj) },
291302
{ MP_ROM_QSTR(MP_QSTR_play), MP_ROM_PTR(&microbit_audio_play_obj) },
292303
{ MP_ROM_QSTR(MP_QSTR_is_playing), MP_ROM_PTR(&microbit_audio_is_playing_obj) },
304+
{ MP_ROM_QSTR(MP_QSTR_sound_level), MP_ROM_PTR(&microbit_audio_sound_level_obj) },
293305
{ MP_ROM_QSTR(MP_QSTR_AudioFrame), MP_ROM_PTR(&microbit_audio_frame_type) },
294306
{ MP_ROM_QSTR(MP_QSTR_SoundEffect), MP_ROM_PTR(&microbit_soundeffect_type) },
295307
};

0 commit comments

Comments
 (0)