Skip to content

Commit bca4dc5

Browse files
committed
codal_port/microbit_pinmode: Allow grabbing a pin in music mode if idle.
If a pin is in music mode but there is no audio/music currently active, then allow it to be grabbed for use as any other mode. Otherwise raise an exception that it is in use in music mode. Addresses issue #50. Signed-off-by: Damien George <damien@micropython.org>
1 parent 6790bb5 commit bca4dc5

File tree

4 files changed

+18
-3
lines changed

4 files changed

+18
-3
lines changed

src/codal_port/microbit_pinmode.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@
2525
*/
2626

2727
#include "py/runtime.h"
28+
#include "modaudio.h"
2829
#include "modmicrobit.h"
30+
#include "modmusic.h"
2931

3032
uint8_t microbit_pinmode_indices[32] = { 0 };
3133

@@ -84,14 +86,22 @@ static void analog_release(const microbit_pin_obj_t *pin) {
8486
// TODO: pwm_release()
8587
}
8688

89+
static void music_release(const microbit_pin_obj_t *pin) {
90+
if (microbit_audio_is_playing() || microbit_music_is_playing()) {
91+
pinmode_error(pin);
92+
} else {
93+
microbit_pin_audio_free();
94+
}
95+
}
96+
8797
const microbit_pinmode_t microbit_pinmodes[] = {
8898
[MODE_UNUSED] = { MP_QSTR_unused, noop },
8999
[MODE_WRITE_ANALOG] = { MP_QSTR_write_analog, analog_release },
90100
[MODE_READ_DIGITAL] = { MP_QSTR_read_digital, noop },
91101
[MODE_WRITE_DIGITAL] = { MP_QSTR_write_digital, noop },
92102
[MODE_DISPLAY] = { MP_QSTR_display, pinmode_error },
93103
[MODE_BUTTON] = { MP_QSTR_button, pinmode_error },
94-
[MODE_MUSIC] = { MP_QSTR_music, pinmode_error },
104+
[MODE_MUSIC] = { MP_QSTR_music, music_release },
95105
[MODE_AUDIO_PLAY] = { MP_QSTR_audio, noop },
96106
[MODE_TOUCH] = { MP_QSTR_touch, noop },
97107
[MODE_I2C] = { MP_QSTR_i2c, pinmode_error },

src/codal_port/modaudio.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,11 +205,11 @@ STATIC mp_obj_t play(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_ar
205205
MP_DEFINE_CONST_FUN_OBJ_KW(microbit_audio_play_obj, 0, play);
206206

207207
bool microbit_audio_is_playing(void) {
208-
return audio_running;
208+
return audio_running || microbit_hal_audio_is_expression_active();
209209
}
210210

211211
mp_obj_t is_playing(void) {
212-
return mp_obj_new_bool(audio_running);
212+
return mp_obj_new_bool(microbit_audio_is_playing());
213213
}
214214
MP_DEFINE_CONST_FUN_OBJ_0(microbit_audio_is_playing_obj, is_playing);
215215

src/codal_port/modmusic.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ STATIC int music_output_period_us(uint32_t period) {
7676
return microbit_hal_pin_set_analog_period_us(MICROBIT_HAL_PIN_MIXER, period);
7777
}
7878

79+
bool microbit_music_is_playing(void) {
80+
return music_data != NULL && music_data->async_state != ASYNC_MUSIC_STATE_IDLE;
81+
}
82+
7983
// This runs on a hardware interrupt.
8084
void microbit_music_tick(void) {
8185
if (music_data == NULL) {

src/codal_port/modmusic.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ extern const struct _mp_obj_tuple_t microbit_music_tune_power_up_obj;
5151
extern const struct _mp_obj_tuple_t microbit_music_tune_power_down_obj;
5252

5353
void microbit_music_volume_changed(void);
54+
bool microbit_music_is_playing(void);
5455
void microbit_music_tick(void);
5556

5657
#endif // MICROPY_INCLUDED_MICROBIT_MUSIC_H

0 commit comments

Comments
 (0)