4141#define BUFFER_EXPANSION (16)
4242
4343static volatile bool running = false;
44- static bool double_pin = true;
45- static const microbit_pin_obj_t * pin0 = NULL ;
46- static const microbit_pin_obj_t * pin1 = NULL ;
47- static const microbit_pin_obj_t * big_pins [3 ] = { & microbit_p0_obj , & microbit_p1_obj , & microbit_p2_obj };
4844
4945microbit_audio_frame_obj_t * microbit_audio_frame_make_new (void );
5046
5147void microbit_audio_stop (void ) {
5248 audio_source_iter = NULL ;
5349 running = false;
54- microbit_obj_pin_free (pin0 );
55- if (double_pin ) {
56- microbit_obj_pin_free (pin1 );
57- }
58- }
59-
60- static void init_pin (const microbit_pin_obj_t * p0 ) {
61- microbit_obj_pin_acquire (p0 , microbit_pin_mode_audio_play );
62- pin0 = p0 ;
63- double_pin = false;
64- }
65-
66- static void init_pins (const microbit_pin_obj_t * p0 , const microbit_pin_obj_t * p1 ) {
67- microbit_obj_pin_acquire (p1 , microbit_pin_mode_audio_play );
68- microbit_obj_pin_acquire (p0 , microbit_pin_mode_audio_play );
69- pin0 = p0 ;
70- pin1 = p1 ;
71- double_pin = true;
50+ microbit_pin_audio_free ();
7251}
7352
7453STATIC void audio_data_fetcher (void ) {
@@ -131,68 +110,6 @@ void microbit_hal_audio_ready_callback(void) {
131110 mp_sched_schedule (MP_OBJ_FROM_PTR (& audio_data_fetcher_wrapper_obj ), mp_const_none );
132111}
133112
134- static void audio_set_pins (mp_obj_t pin0_obj , mp_obj_t pin1_obj ) {
135- const microbit_pin_obj_t * p0 = microbit_obj_get_pin (pin0_obj );
136- if (pin1_obj == mp_const_none ) {
137- init_pin (p0 );
138- } else {
139- const microbit_pin_obj_t * p1 = microbit_obj_get_pin (pin1_obj );
140- init_pins (p0 , p1 );
141- }
142- }
143-
144- static int32_t pin_read_digital (const microbit_pin_obj_t * pin ) {
145- nrf_gpio_cfg_input (pin -> name , NRF_GPIO_PIN_NOPULL );
146- // Allow 1us to settle.
147- mp_hal_delay_us (1 );
148- return nrf_gpio_pin_read (pin -> name );
149- }
150-
151- static void audio_auto_set_pins (void ) {
152- audio_set_pins ((mp_obj_t )& microbit_pin_speaker_obj , mp_const_none );
153- return ;
154- // Test to see if two of the "big" pins are connected by some sort of resistor.
155- uint32_t i , j , count ;
156- bool usable [3 ];
157- if (microbit_obj_pin_can_be_acquired (& microbit_p0_obj )) {
158- usable [0 ] = true;
159- microbit_obj_pin_acquire (& microbit_p0_obj , microbit_pin_mode_unused );
160- }
161- if (microbit_obj_pin_can_be_acquired (& microbit_p1_obj )) {
162- usable [1 ] = true;
163- microbit_obj_pin_acquire (& microbit_p1_obj , microbit_pin_mode_unused );
164- }
165- if (microbit_obj_pin_can_be_acquired (& microbit_p2_obj )) {
166- usable [2 ] = true;
167- microbit_obj_pin_acquire (& microbit_p2_obj , microbit_pin_mode_unused );
168- }
169- for (i = 0 ; i < 2 ; i ++ ) {
170- if (!usable [i ])
171- continue ;
172- const microbit_pin_obj_t * pin1 = big_pins [i ];
173- nrf_gpio_cfg_output (pin1 -> name );
174- for (j = i + 1 ; j < 3 ; j ++ ) {
175- if (!usable [j ])
176- continue ;
177- const microbit_pin_obj_t * pin2 = big_pins [j ];
178- for (count = 0 ; count < 4 ; count ++ ) {
179- nrf_gpio_pin_set (pin1 -> name );
180- if (pin_read_digital (pin2 ) != 1 )
181- break ;
182- nrf_gpio_pin_clear (pin1 -> name );
183- if (pin_read_digital (pin2 ) != 0 )
184- break ;
185- }
186- if (count == 4 ) {
187- init_pins (pin1 , pin2 );
188- return ;
189- }
190- }
191- }
192- /* Set to default: single pin0 */
193- audio_set_pins ((mp_obj_t )& microbit_p0_obj , mp_const_none );
194- }
195-
196113static void audio_init (uint32_t sample_rate ) {
197114 if (audio_buffer_ptr == NULL ) {
198115 audio_source_iter = NULL ;
@@ -201,22 +118,12 @@ static void audio_init(uint32_t sample_rate) {
201118 microbit_hal_audio_init (BUFFER_EXPANSION / 4 * sample_rate );
202119}
203120
204- void microbit_audio_play_source (mp_obj_t src , mp_obj_t pin1 , mp_obj_t pin2 , bool wait , uint32_t sample_rate ) {
121+ void microbit_audio_play_source (mp_obj_t src , mp_obj_t pin_select , bool wait , uint32_t sample_rate ) {
205122 if (running ) {
206123 microbit_audio_stop ();
207124 }
208125 audio_init (sample_rate );
209- if (0 ) {
210- if (pin1 == mp_const_none ) {
211- if (pin2 == mp_const_none ) {
212- audio_auto_set_pins ();
213- } else {
214- mp_raise_TypeError ("cannot set return_pin without pin" );
215- }
216- } else {
217- audio_set_pins (pin1 , pin2 );
218- }
219- }
126+ microbit_pin_audio_select (pin_select );
220127
221128 audio_source_iter = NULL ;
222129
@@ -254,10 +161,14 @@ STATIC mp_obj_t play(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_ar
254161 // parse args
255162 mp_arg_val_t args [MP_ARRAY_SIZE (allowed_args )];
256163 mp_arg_parse_all (n_args , pos_args , kw_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
164+
165+ // The return_pin argument from micro:bit v1 is no longer supported.
166+ if (args [3 ].u_obj != mp_const_none ) {
167+ mp_raise_ValueError ("return_pin not supported" );
168+ }
169+
257170 mp_obj_t src = args [0 ].u_obj ;
258- mp_obj_t pin1 = args [2 ].u_obj ;
259- mp_obj_t pin2 = args [3 ].u_obj ;
260- microbit_audio_play_source (src , pin1 , pin2 , args [1 ].u_bool , DEFAULT_SAMPLE_RATE );
171+ microbit_audio_play_source (src , args [2 ].u_obj , args [1 ].u_bool , DEFAULT_SAMPLE_RATE );
261172 return mp_const_none ;
262173}
263174MP_DEFINE_CONST_FUN_OBJ_KW (microbit_audio_play_obj , 0 , play );
0 commit comments