@@ -48,6 +48,7 @@ static uint8_t audio_output_buffer[AUDIO_CHUNK_SIZE];
4848static volatile audio_output_state_t audio_output_state ;
4949static volatile bool audio_fetcher_scheduled ;
5050static size_t audio_raw_offset ;
51+ static uint32_t audio_current_sound_level ;
5152
5253microbit_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
6466STATIC 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}
285291MP_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+
287298STATIC 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