Skip to content

Commit fd99f40

Browse files
committed
codal_port/microbit_pinmode: Make audio and speech use "audio" pin mode.
This distinguishes "music" and "audio" as separate modes as returned by pin.get_mode(), making v2 more compatible with micro:bit v1. Fixes issue #137. Signed-off-by: Damien George <[email protected]>
1 parent d2130d8 commit fd99f40

File tree

6 files changed

+22
-15
lines changed

6 files changed

+22
-15
lines changed

src/codal_port/microbit_pinaudio.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
// The currently selected pin output for the audio.
3131
STATIC const microbit_pin_obj_t *audio_routed_pin = NULL;
3232

33-
void microbit_pin_audio_select(mp_const_obj_t select) {
33+
void microbit_pin_audio_select(mp_const_obj_t select, const microbit_pinmode_t *pinmode) {
3434
// Work out which pins are requested for the audio output.
3535
const microbit_pin_obj_t *pin_selected;
3636
if (select == mp_const_none) {
@@ -50,9 +50,12 @@ void microbit_pin_audio_select(mp_const_obj_t select) {
5050
if (audio_routed_pin == NULL) {
5151
microbit_hal_audio_select_pin(-1);
5252
} else {
53-
microbit_obj_pin_acquire(audio_routed_pin, microbit_pin_mode_music);
53+
microbit_obj_pin_acquire(audio_routed_pin, pinmode);
5454
microbit_hal_audio_select_pin(audio_routed_pin->name);
5555
}
56+
} else if (audio_routed_pin != NULL) {
57+
// Update the pin acquisition mode, to make sure pin.get_mode() reflects the current mode.
58+
microbit_pin_set_mode(audio_routed_pin, pinmode);
5659
}
5760
}
5861

src/codal_port/microbit_pinmode.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,15 @@ const microbit_pinmode_t *microbit_pin_get_mode(const microbit_pin_obj_t *pin) {
3939
return &microbit_pinmodes[pinmode];
4040
}
4141

42-
static void set_mode(uint32_t pin, const microbit_pinmode_t *mode) {
42+
void microbit_pin_set_mode(const microbit_pin_obj_t *pin, const microbit_pinmode_t *mode) {
4343
uint32_t index = mode - &microbit_pinmodes[0];
44-
microbit_pinmode_indices[pin] = index;
44+
microbit_pinmode_indices[pin->number] = index;
4545
return;
4646
}
4747

4848
void microbit_obj_pin_free(const microbit_pin_obj_t *pin) {
4949
if (pin != NULL) {
50-
set_mode(pin->number, microbit_pin_mode_unused);
50+
microbit_pin_set_mode(pin, microbit_pin_mode_unused);
5151
}
5252
}
5353

@@ -66,7 +66,7 @@ bool microbit_obj_pin_acquire(const microbit_pin_obj_t *pin, const microbit_pinm
6666

6767
if (current_mode != new_mode) {
6868
current_mode->release(pin);
69-
set_mode(pin->number, new_mode);
69+
microbit_pin_set_mode(pin, new_mode);
7070
return true;
7171
} else {
7272
return false;
@@ -86,7 +86,7 @@ static void analog_release(const microbit_pin_obj_t *pin) {
8686
// TODO: pwm_release()
8787
}
8888

89-
static void music_release(const microbit_pin_obj_t *pin) {
89+
static void audio_music_release(const microbit_pin_obj_t *pin) {
9090
if (microbit_audio_is_playing() || microbit_music_is_playing()) {
9191
pinmode_error(pin);
9292
} else {
@@ -101,8 +101,8 @@ const microbit_pinmode_t microbit_pinmodes[] = {
101101
[MODE_WRITE_DIGITAL] = { MP_QSTR_write_digital, noop },
102102
[MODE_DISPLAY] = { MP_QSTR_display, pinmode_error },
103103
[MODE_BUTTON] = { MP_QSTR_button, pinmode_error },
104-
[MODE_MUSIC] = { MP_QSTR_music, music_release },
105-
[MODE_AUDIO_PLAY] = { MP_QSTR_audio, noop },
104+
[MODE_MUSIC] = { MP_QSTR_music, audio_music_release },
105+
[MODE_AUDIO_PLAY] = { MP_QSTR_audio, audio_music_release },
106106
[MODE_TOUCH] = { MP_QSTR_touch, noop },
107107
[MODE_I2C] = { MP_QSTR_i2c, pinmode_error },
108108
[MODE_SPI] = { MP_QSTR_spi, pinmode_error }

src/codal_port/modaudio.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ void microbit_audio_play_source(mp_obj_t src, mp_obj_t pin_select, bool wait, ui
140140
microbit_audio_stop();
141141
}
142142
audio_init(sample_rate);
143-
microbit_pin_audio_select(pin_select);
143+
microbit_pin_audio_select(pin_select, microbit_pin_mode_audio_play);
144144

145145
const char *sound_expr_data = NULL;
146146
if (mp_obj_is_type(src, &microbit_sound_type)) {

src/codal_port/modmicrobit.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,11 +220,15 @@ bool microbit_obj_pin_can_be_acquired(const microbit_pin_obj_t *pin);
220220
// Not safe to call in an interrupt as it may raise if pin can't be acquired.
221221
bool microbit_obj_pin_acquire(const microbit_pin_obj_t *pin, const microbit_pinmode_t *mode);
222222

223+
// Change the mode of a pin. This does not check the existing mode, nor release any
224+
// resources, and should only be used if pin resources are managed by the caller.
225+
void microbit_pin_set_mode(const microbit_pin_obj_t *pin, const microbit_pinmode_t *mode);
226+
223227
const microbit_pinmode_t *microbit_pin_get_mode(const microbit_pin_obj_t *pin);
224228
void pinmode_error(const microbit_pin_obj_t *pin);
225229

226230
void microbit_pin_audio_speaker_enable(bool enable);
227-
void microbit_pin_audio_select(mp_const_obj_t select);
231+
void microbit_pin_audio_select(mp_const_obj_t select, const microbit_pinmode_t *pinmode);
228232
void microbit_pin_audio_free(void);
229233

230234
MP_DECLARE_CONST_FUN_OBJ_0(microbit_reset_obj);

src/codal_port/modmusic.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ STATIC mp_obj_t microbit_music_stop(mp_uint_t n_args, const mp_obj_t *args) {
284284
pin = args[0];
285285
}
286286
// Raise exception if the pin we are trying to stop is not in a compatible mode.
287-
microbit_pin_audio_select(pin);
287+
microbit_pin_audio_select(pin, microbit_pin_mode_music);
288288

289289
// Stop any ongoing background music
290290
music_data->async_state = ASYNC_MUSIC_STATE_IDLE;
@@ -326,7 +326,7 @@ STATIC mp_obj_t microbit_music_play(mp_uint_t n_args, const mp_obj_t *pos_args,
326326
music_data->async_state = ASYNC_MUSIC_STATE_IDLE;
327327

328328
// get the pin to play on
329-
microbit_pin_audio_select(args[1].u_obj);
329+
microbit_pin_audio_select(args[1].u_obj, microbit_pin_mode_music);
330330

331331
// start the tune running in the background
332332
music_data->async_wait_ticks = mp_hal_ticks_ms();
@@ -372,7 +372,7 @@ STATIC mp_obj_t microbit_music_pitch(mp_uint_t n_args, const mp_obj_t *pos_args,
372372
music_data->async_state = ASYNC_MUSIC_STATE_IDLE;
373373

374374
// Update pin modes
375-
microbit_pin_audio_select(args[2].u_obj);
375+
microbit_pin_audio_select(args[2].u_obj, microbit_pin_mode_music);
376376

377377
bool wait = args[3].u_bool;
378378
music_output_amplitude(MUSIC_OUTPUT_AMPLITUDE_ON);

src/codal_port/modspeech.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ STATIC mp_obj_t articulate(mp_obj_t phonemes, mp_uint_t n_args, const mp_obj_t *
421421

422422
#if USE_DEDICATED_AUDIO_CHANNEL
423423
sam_output_reset(NULL);
424-
microbit_pin_audio_select(args[7].u_obj);
424+
microbit_pin_audio_select(args[7].u_obj, microbit_pin_mode_audio_play);
425425
microbit_hal_audio_speech_init(sample_rate);
426426
#else
427427
speech_iterator_t *src = make_speech_iter();

0 commit comments

Comments
 (0)