@@ -181,7 +181,7 @@ MP_DEFINE_CONST_FUN_OBJ_KW(audioio_audioout_play_obj, 1, audioio_audioout_obj_pl
181181
182182//| .. method:: stop()
183183//|
184- //| Stops playback.
184+ //| Stops playback and resets to the start of the sample .
185185//|
186186STATIC mp_obj_t audioio_audioout_obj_stop (mp_obj_t self_in ) {
187187 audioio_audioout_obj_t * self = MP_OBJ_TO_PTR (self_in );
@@ -193,7 +193,7 @@ MP_DEFINE_CONST_FUN_OBJ_1(audioio_audioout_stop_obj, audioio_audioout_obj_stop);
193193
194194//| .. attribute:: playing
195195//|
196- //| True when an audio sample is being output. (read-only)
196+ //| True when an audio sample is being output even if `paused` . (read-only)
197197//|
198198STATIC mp_obj_t audioio_audioout_obj_get_playing (mp_obj_t self_in ) {
199199 audioio_audioout_obj_t * self = MP_OBJ_TO_PTR (self_in );
@@ -209,16 +209,69 @@ const mp_obj_property_t audioio_audioout_playing_obj = {
209209 (mp_obj_t )& mp_const_none_obj },
210210};
211211
212+ //| .. method:: pause()
213+ //|
214+ //| Stops playback temporarily while remembering the position. Use `resume` to resume playback.
215+ //|
216+ STATIC mp_obj_t audioio_audioout_obj_pause (mp_obj_t self_in ) {
217+ audioio_audioout_obj_t * self = MP_OBJ_TO_PTR (self_in );
218+ raise_error_if_deinited (common_hal_audioio_audioout_deinited (self ));
219+
220+ if (!common_hal_audioio_audioout_get_playing (self )) {
221+ mp_raise_RuntimeError ("No sample playing cannot pause" );
222+ }
223+ common_hal_audioio_audioout_pause (self );
224+ return mp_const_none ;
225+ }
226+ MP_DEFINE_CONST_FUN_OBJ_1 (audioio_audioout_pause_obj , audioio_audioout_obj_pause );
227+
228+ //| .. method:: resume()
229+ //|
230+ //| Resumes sample playback after :py:func:`pause`.
231+ //|
232+ STATIC mp_obj_t audioio_audioout_obj_resume (mp_obj_t self_in ) {
233+ audioio_audioout_obj_t * self = MP_OBJ_TO_PTR (self_in );
234+ raise_error_if_deinited (common_hal_audioio_audioout_deinited (self ));
235+
236+ if (!common_hal_audioio_audioout_get_paused (self )) {
237+ mp_raise_RuntimeError ("No paused sample" );
238+ }
239+ common_hal_audioio_audioout_resume (self );
240+ return mp_const_none ;
241+ }
242+ MP_DEFINE_CONST_FUN_OBJ_1 (audioio_audioout_resume_obj , audioio_audioout_obj_resume );
243+
244+ //| .. attribute:: paused
245+ //|
246+ //| True when playback is paused. (read-only)
247+ //|
248+ STATIC mp_obj_t audioio_audioout_obj_get_paused (mp_obj_t self_in ) {
249+ audioio_audioout_obj_t * self = MP_OBJ_TO_PTR (self_in );
250+ raise_error_if_deinited (common_hal_audioio_audioout_deinited (self ));
251+ return mp_obj_new_bool (common_hal_audioio_audioout_get_paused (self ));
252+ }
253+ MP_DEFINE_CONST_FUN_OBJ_1 (audioio_audioout_get_paused_obj , audioio_audioout_obj_get_paused );
254+
255+ const mp_obj_property_t audioio_audioout_paused_obj = {
256+ .base .type = & mp_type_property ,
257+ .proxy = {(mp_obj_t )& audioio_audioout_get_paused_obj ,
258+ (mp_obj_t )& mp_const_none_obj ,
259+ (mp_obj_t )& mp_const_none_obj },
260+ };
261+
212262STATIC const mp_rom_map_elem_t audioio_audioout_locals_dict_table [] = {
213263 // Methods
214264 { MP_ROM_QSTR (MP_QSTR_deinit ), MP_ROM_PTR (& audioio_audioout_deinit_obj ) },
215265 { MP_ROM_QSTR (MP_QSTR___enter__ ), MP_ROM_PTR (& default___enter___obj ) },
216266 { MP_ROM_QSTR (MP_QSTR___exit__ ), MP_ROM_PTR (& audioio_audioout___exit___obj ) },
217267 { MP_ROM_QSTR (MP_QSTR_play ), MP_ROM_PTR (& audioio_audioout_play_obj ) },
218268 { MP_ROM_QSTR (MP_QSTR_stop ), MP_ROM_PTR (& audioio_audioout_stop_obj ) },
269+ { MP_ROM_QSTR (MP_QSTR_pause ), MP_ROM_PTR (& audioio_audioout_pause_obj ) },
270+ { MP_ROM_QSTR (MP_QSTR_resume ), MP_ROM_PTR (& audioio_audioout_resume_obj ) },
219271
220272 // Properties
221273 { MP_ROM_QSTR (MP_QSTR_playing ), MP_ROM_PTR (& audioio_audioout_playing_obj ) },
274+ { MP_ROM_QSTR (MP_QSTR_paused ), MP_ROM_PTR (& audioio_audioout_paused_obj ) },
222275};
223276STATIC MP_DEFINE_CONST_DICT (audioio_audioout_locals_dict , audioio_audioout_locals_dict_table );
224277
0 commit comments