@@ -114,7 +114,12 @@ STATIC mp_obj_t audiopwmio_pwmaudioout_make_new(const mp_obj_type_t *type, size_
114
114
validate_obj_is_free_pin_or_none (args [ARG_right_channel ].u_obj , MP_QSTR_right_channel );
115
115
116
116
// create AudioOut object from the given pin
117
- audiopwmio_pwmaudioout_obj_t * self = m_new_obj (audiopwmio_pwmaudioout_obj_t );
117
+ // The object is made long-lived because many implementations keep
118
+ // a pointer to the object (e.g., for the interrupt handler), which
119
+ // will not work properly if the object is moved. It is created
120
+ // with a finaliser as some ports use these (rather than 'reset' functions)
121
+ // to ensure resources are collected at interpreter shutdown.
122
+ audiopwmio_pwmaudioout_obj_t * self = m_new_ll_obj_with_finaliser (audiopwmio_pwmaudioout_obj_t );
118
123
self -> base .type = & audiopwmio_pwmaudioout_type ;
119
124
common_hal_audiopwmio_pwmaudioout_construct (self , left_channel_pin , right_channel_pin , args [ARG_quiescent_value ].u_int );
120
125
@@ -249,6 +254,7 @@ MP_PROPERTY_GETTER(audiopwmio_pwmaudioout_paused_obj,
249
254
STATIC const mp_rom_map_elem_t audiopwmio_pwmaudioout_locals_dict_table [] = {
250
255
// Methods
251
256
{ MP_ROM_QSTR (MP_QSTR_deinit ), MP_ROM_PTR (& audiopwmio_pwmaudioout_deinit_obj ) },
257
+ { MP_ROM_QSTR (MP_QSTR___del__ ), MP_ROM_PTR (& audiopwmio_pwmaudioout_deinit_obj ) },
252
258
{ MP_ROM_QSTR (MP_QSTR___enter__ ), MP_ROM_PTR (& default___enter___obj ) },
253
259
{ MP_ROM_QSTR (MP_QSTR___exit__ ), MP_ROM_PTR (& audiopwmio_pwmaudioout___exit___obj ) },
254
260
{ MP_ROM_QSTR (MP_QSTR_play ), MP_ROM_PTR (& audiopwmio_pwmaudioout_play_obj ) },
0 commit comments