8000 microbit: Allow passing in None to music stop/play/pitch functions. · bbcmicrobit/micropython@1252f88 · GitHub 8000
[go: up one dir, main page]

Skip to content

Commit 1252f88

Browse files
committed
microbit: Allow passing in None to music stop/play/pitch functions.
To align with micro:bit v2 behaviour. Signed-off-by: Damien George <damien@micropython.org>
1 parent 5fbc093 commit 1252f88

File tree

1 file changed

+18
-11
lines changed

1 file changed

+18
-11
lines changed

source/microbit/modmusic.cpp

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -73,17 +73,23 @@ enum {
7373
STATIC uint32_t start_note(const char *note_str, size_t note_len);
7474

7575
static inline void music_output_amplitude(uint32_t amplitude) {
76-
pwm_set_duty_cycle(music_data->async_pin->name, amplitude);
76+
if (music_data->async_pin != NULL) {
77+
pwm_set_duty_cycle(music_data->async_pin->name, amplitude);
78+
}
7779
}
7880

7981
static inline int music_output_period_us(uint32_t period) {
8082
return pwm_set_period_us(period);
8183
}
8284

8385
STATIC void microbit_pin_audio_select(mp_obj_t select) {
84-
const microbit_pin_obj_t *pin = microbit_obj_get_pin(select);
85-
microbit_obj_pin_acquire(pin, microbit_pin_mode_music);
86-
music_data->async_pin = pin;
86+
if (select == mp_const_none) {
87+
music_data->async_pin = NULL;
88+
} else {
89+
const microbit_pin_obj_t *pin = microbit_obj_get_pin(select);
90+
microbit_obj_pin_acquire(pin, microbit_pin_mode_music);
91+
music_data->async_pin = pin;
92+
}
8793
}
8894

8995
STATIC void microbit_pin_audio_free(void) {
@@ -389,13 +395,14 @@ STATIC mp_obj_t microbit_music_pitch(mp_uint_t n_args, const mp_obj_t *pos_args,
389395

390396
bool wait = args[3].u_bool;
391397
music_output_amplitude(MUSIC_OUTPUT_AMPLITUDE_ON);
392-
if (frequency == 0) {
393-
pwm_release(music_data->async_pin->name);
394-
music_data->async_pin = NULL;
395-
} else if (music_output_period_us(1000000/frequency)) {
396-
pwm_release(music_data->async_pin->name);
397-
music_data->async_pin = NULL;
398-
mp_raise_ValueError("invalid pitch");
398+
if (frequency == 0 || music_output_period_us(1000000 / frequency)) {
399+
if (music_data->async_pin != NULL) {
400+
pwm_release(music_data->async_pin->name);
401+
music_data->async_pin = NULL;
402+
}
403+
if (frequency != 0) {
404+
mp_raise_ValueError("invalid pitch");
405+
}
399406
}
400407
if (duration >= 0) {
401408
// use async machinery to stop the pitch after the duration

0 commit comments

Comments
 (0)
0