From 8c12ec27b0fd7729d4d97b16a793291dc1519e8e Mon Sep 17 00:00:00 2001 From: Bob Hammell Date: Mon, 5 May 2025 05:57:42 -0400 Subject: [PATCH 1/9] Add end() method to MixerVoice to allow samples to finish playing before ending looping --- shared-bindings/audiomixer/MixerVoice.c | 14 ++++++++++++++ shared-bindings/audiomixer/MixerVoice.h | 1 + shared-module/audiomixer/MixerVoice.c | 6 ++++++ 3 files changed, 21 insertions(+) diff --git a/shared-bindings/audiomixer/MixerVoice.c b/shared-bindings/audiomixer/MixerVoice.c index 90ee877734402..0100cb993c6cf 100644 --- a/shared-bindings/audiomixer/MixerVoice.c +++ b/shared-bindings/audiomixer/MixerVoice.c @@ -81,6 +81,19 @@ static mp_obj_t audiomixer_mixervoice_obj_stop(size_t n_args, const mp_obj_t *po } MP_DEFINE_CONST_FUN_OBJ_KW(audiomixer_mixervoice_stop_obj, 1, audiomixer_mixervoice_obj_stop); +//| def end() -> None +//| "" +//| Sets looping to False if sample is playing, allowing current looped +// sample to finish before looping again "" +//| +STATIC mp_obj_t audiomixer_mixervoice_obj_end(mp_obj_t self_in) { + audiomixer_mixervoice_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_audiomixer_mixervoice_end(self); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_1(audiomixer_mixervoice_end_obj, audiomixer_mixervoice_obj_end); + + //| level: synthio.BlockInput //| """The volume level of a voice, as a floating point number between 0 and 1. If your board //| does not support synthio, this property will only accept a float value. @@ -140,6 +153,7 @@ static const mp_rom_map_elem_t audiomixer_mixervoice_locals_dict_table[] = { // Methods { MP_ROM_QSTR(MP_QSTR_play), MP_ROM_PTR(&audiomixer_mixervoice_play_obj) }, { MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&audiomixer_mixervoice_stop_obj) }, + { MP_ROM_QSTR(MP_QSTR_end), MP_ROM_PTR(&audiomixer_mixervoice_end_obj) // Properties { MP_ROM_QSTR(MP_QSTR_playing), MP_ROM_PTR(&audiomixer_mixervoice_playing_obj) }, diff --git a/shared-bindings/audiomixer/MixerVoice.h b/shared-bindings/audiomixer/MixerVoice.h index cf6643d995c07..fe350eb1a7592 100644 --- a/shared-bindings/audiomixer/MixerVoice.h +++ b/shared-bindings/audiomixer/MixerVoice.h @@ -15,6 +15,7 @@ void common_hal_audiomixer_mixervoice_construct(audiomixer_mixervoice_obj_t *sel void common_hal_audiomixer_mixervoice_set_parent(audiomixer_mixervoice_obj_t *self, audiomixer_mixer_obj_t *parent); void common_hal_audiomixer_mixervoice_play(audiomixer_mixervoice_obj_t *self, mp_obj_t sample, bool loop); void common_hal_audiomixer_mixervoice_stop(audiomixer_mixervoice_obj_t *self); +void common_hal_audiomixer_mixervoice_end(audiomixer_mixervoice_obj_t *self); mp_obj_t common_hal_audiomixer_mixervoice_get_level(audiomixer_mixervoice_obj_t *self); void common_hal_audiomixer_mixervoice_set_level(audiomixer_mixervoice_obj_t *self, mp_obj_t gain); diff --git a/shared-module/audiomixer/MixerVoice.c b/shared-module/audiomixer/MixerVoice.c index a63229cf5af03..e0be869aa8e44 100644 --- a/shared-module/audiomixer/MixerVoice.c +++ b/shared-module/audiomixer/MixerVoice.c @@ -67,3 +67,9 @@ bool common_hal_audiomixer_mixervoice_get_playing(audiomixer_mixervoice_obj_t *s void common_hal_audiomixer_mixervoice_stop(audiomixer_mixervoice_obj_t *self) { self->sample = NULL; } + +void common_hal_audiomixer_mixervoice_end(audiomixer_mixervoice_obj_t *self) { + if (self->sample != NULL) { + self->loop = false; + } +} From 209d5160aba52fd726e7f7c650c392339b97ee54 Mon Sep 17 00:00:00 2001 From: Bob Hammell Date: Mon, 5 May 2025 15:28:41 -0400 Subject: [PATCH 2/9] Update docstring --- shared-bindings/audiomixer/MixerVoice.c | 37 +++++++++++++------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/shared-bindings/audiomixer/MixerVoice.c b/shared-bindings/audiomixer/MixerVoice.c index 0100cb993c6cf..91e28208280bf 100644 --- a/shared-bindings/audiomixer/MixerVoice.c +++ b/shared-bindings/audiomixer/MixerVoice.c @@ -81,10 +81,10 @@ static mp_obj_t audiomixer_mixervoice_obj_stop(size_t n_args, const mp_obj_t *po } MP_DEFINE_CONST_FUN_OBJ_KW(audiomixer_mixervoice_stop_obj, 1, audiomixer_mixervoice_obj_stop); -//| def end() -> None -//| "" -//| Sets looping to False if sample is playing, allowing current looped -// sample to finish before looping again "" +//| def end() -> None: +//| "" Sets looping to False if sample is playing, allowing current looped +//| sample to finish before looping again "" +//| ... //| STATIC mp_obj_t audiomixer_mixervoice_obj_end(mp_obj_t self_in) { audiomixer_mixervoice_obj_t *self = MP_OBJ_TO_PTR(self_in); @@ -155,17 +155,18 @@ static const mp_rom_map_elem_t audiomixer_mixervoice_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&audiomixer_mixervoice_stop_obj) }, { MP_ROM_QSTR(MP_QSTR_end), MP_ROM_PTR(&audiomixer_mixervoice_end_obj) - // Properties - { MP_ROM_QSTR(MP_QSTR_playing), MP_ROM_PTR(&audiomixer_mixervoice_playing_obj) }, - { MP_ROM_QSTR(MP_QSTR_level), MP_ROM_PTR(&audiomixer_mixervoice_level_obj) }, - { MP_ROM_QSTR(MP_QSTR_loop), MP_ROM_PTR(&audiomixer_mixervoice_loop_obj) }, -}; -static MP_DEFINE_CONST_DICT(audiomixer_mixervoice_locals_dict, audiomixer_mixervoice_locals_dict_table); - -MP_DEFINE_CONST_OBJ_TYPE( - audiomixer_mixervoice_type, - MP_QSTR_MixerVoice, - MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS, - make_new, audiomixer_mixervoice_make_new, - locals_dict, &audiomixer_mixervoice_locals_dict - ); + // Properties + { + MP_ROM_QSTR(MP_QSTR_playing), MP_ROM_PTR(&audiomixer_mixervoice_playing_obj) + }, + { MP_ROM_QSTR(MP_QSTR_level), MP_ROM_PTR(&audiomixer_mixervoice_level_obj) }, + { MP_ROM_QSTR(MP_QSTR_loop), MP_ROM_PTR(&audiomixer_mixervoice_loop_obj) }, }; + static MP_DEFINE_CONST_DICT(audiomixer_mixervoice_locals_dict, audiomixer_mixervoice_locals_dict_table); + + MP_DEFINE_CONST_OBJ_TYPE( + audiomixer_mixervoice_type, + MP_QSTR_MixerVoice, + MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS, + make_new, audiomixer_mixervoice_make_new, + locals_dict, &audiomixer_mixervoice_locals_dict + ); From 1c7a0ccf2dd80c22ff7f4d801b4c19b656c26886 Mon Sep 17 00:00:00 2001 From: Bob Hammell Date: Mon, 5 May 2025 15:42:34 -0400 Subject: [PATCH 3/9] Update docstring --- shared-bindings/audiomixer/MixerVoice.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared-bindings/audiomixer/MixerVoice.c b/shared-bindings/audiomixer/MixerVoice.c index 91e28208280bf..821b9746a0ab6 100644 --- a/shared-bindings/audiomixer/MixerVoice.c +++ b/shared-bindings/audiomixer/MixerVoice.c @@ -81,7 +81,7 @@ static mp_obj_t audiomixer_mixervoice_obj_stop(size_t n_args, const mp_obj_t *po } MP_DEFINE_CONST_FUN_OBJ_KW(audiomixer_mixervoice_stop_obj, 1, audiomixer_mixervoice_obj_stop); -//| def end() -> None: +//| def end(self) -> None: //| "" Sets looping to False if sample is playing, allowing current looped //| sample to finish before looping again "" //| ... From ba20540a1fb975d057b5a83cd1e7d7a736117220 Mon Sep 17 00:00:00 2001 From: Bob Hammell Date: Mon, 5 May 2025 21:14:46 -0400 Subject: [PATCH 4/9] Update shared-bindings/audiomixer/MixerVoice.c Co-authored-by: Scott Shawcroft --- shared-bindings/audiomixer/MixerVoice.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared-bindings/audiomixer/MixerVoice.c b/shared-bindings/audiomixer/MixerVoice.c index 821b9746a0ab6..3e1642a35c7ec 100644 --- a/shared-bindings/audiomixer/MixerVoice.c +++ b/shared-bindings/audiomixer/MixerVoice.c @@ -86,7 +86,7 @@ MP_DEFINE_CONST_FUN_OBJ_KW(audiomixer_mixervoice_stop_obj, 1, audiomixer_mixervo //| sample to finish before looping again "" //| ... //| -STATIC mp_obj_t audiomixer_mixervoice_obj_end(mp_obj_t self_in) { +static mp_obj_t audiomixer_mixervoice_obj_end(mp_obj_t self_in) { audiomixer_mixervoice_obj_t *self = MP_OBJ_TO_PTR(self_in); common_hal_audiomixer_mixervoice_end(self); return mp_const_none; From 2c80f37b872e586e5a340e2e003a55485808fe9c Mon Sep 17 00:00:00 2001 From: Bob Hammell Date: Tue, 6 May 2025 05:46:51 -0400 Subject: [PATCH 5/9] Update shared-bindings/audiomixer/MixerVoice.c Co-authored-by: Mark <56205165+gamblor21@users.noreply.github.com> --- shared-bindings/audiomixer/MixerVoice.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared-bindings/audiomixer/MixerVoice.c b/shared-bindings/audiomixer/MixerVoice.c index 3e1642a35c7ec..3fd3bf46aacf1 100644 --- a/shared-bindings/audiomixer/MixerVoice.c +++ b/shared-bindings/audiomixer/MixerVoice.c @@ -153,7 +153,7 @@ static const mp_rom_map_elem_t audiomixer_mixervoice_locals_dict_table[] = { // Methods { MP_ROM_QSTR(MP_QSTR_play), MP_ROM_PTR(&audiomixer_mixervoice_play_obj) }, { MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&audiomixer_mixervoice_stop_obj) }, - { MP_ROM_QSTR(MP_QSTR_end), MP_ROM_PTR(&audiomixer_mixervoice_end_obj) + { MP_ROM_QSTR(MP_QSTR_end), MP_ROM_PTR(&audiomixer_mixervoice_end_obj) }, // Properties { From bcda5a4d02d31e2046ea3f2474844a2aefa8547c Mon Sep 17 00:00:00 2001 From: Bob Hammell Date: Tue, 6 May 2025 05:46:59 -0400 Subject: [PATCH 6/9] Update shared-bindings/audiomixer/MixerVoice.c Co-authored-by: Mark <56205165+gamblor21@users.noreply.github.com> --- shared-bindings/audiomixer/MixerVoice.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared-bindings/audiomixer/MixerVoice.c b/shared-bindings/audiomixer/MixerVoice.c index 3fd3bf46aacf1..bd47b57ad6c50 100644 --- a/shared-bindings/audiomixer/MixerVoice.c +++ b/shared-bindings/audiomixer/MixerVoice.c @@ -82,7 +82,7 @@ static mp_obj_t audiomixer_mixervoice_obj_stop(size_t n_args, const mp_obj_t *po MP_DEFINE_CONST_FUN_OBJ_KW(audiomixer_mixervoice_stop_obj, 1, audiomixer_mixervoice_obj_stop); //| def end(self) -> None: -//| "" Sets looping to False if sample is playing, allowing current looped +//| """ Sets looping to False if sample is playing, allowing current looped //| sample to finish before looping again "" //| ... //| From fa565e5fa42f524dcee9b6236912b57697c5e3b5 Mon Sep 17 00:00:00 2001 From: Bob Hammell Date: Tue, 6 May 2025 05:47:08 -0400 Subject: [PATCH 7/9] Update shared-bindings/audiomixer/MixerVoice.c Co-authored-by: Mark <56205165+gamblor21@users.noreply.github.com> --- shared-bindings/audiomixer/MixerVoice.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared-bindings/audiomixer/MixerVoice.c b/shared-bindings/audiomixer/MixerVoice.c index bd47b57ad6c50..901a3f2c06f7a 100644 --- a/shared-bindings/audiomixer/MixerVoice.c +++ b/shared-bindings/audiomixer/MixerVoice.c @@ -83,7 +83,7 @@ MP_DEFINE_CONST_FUN_OBJ_KW(audiomixer_mixervoice_stop_obj, 1, audiomixer_mixervo //| def end(self) -> None: //| """ Sets looping to False if sample is playing, allowing current looped -//| sample to finish before looping again "" +//| sample to finish before looping again """ //| ... //| static mp_obj_t audiomixer_mixervoice_obj_end(mp_obj_t self_in) { From f8406397fe5ea93b39c14a0df82eeb8e9c2f38d6 Mon Sep 17 00:00:00 2001 From: Bob Hammell Date: Tue, 6 May 2025 09:17:29 -0400 Subject: [PATCH 8/9] Update end() docstring --- shared-bindings/audiomixer/MixerVoice.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/shared-bindings/audiomixer/MixerVoice.c b/shared-bindings/audiomixer/MixerVoice.c index 901a3f2c06f7a..1df15198ff4ba 100644 --- a/shared-bindings/audiomixer/MixerVoice.c +++ b/shared-bindings/audiomixer/MixerVoice.c @@ -82,9 +82,9 @@ static mp_obj_t audiomixer_mixervoice_obj_stop(size_t n_args, const mp_obj_t *po MP_DEFINE_CONST_FUN_OBJ_KW(audiomixer_mixervoice_stop_obj, 1, audiomixer_mixervoice_obj_stop); //| def end(self) -> None: -//| """ Sets looping to False if sample is playing, allowing current looped -//| sample to finish before looping again """ -//| ... +//| """ Sets looping to False if sample is playing. This allows the looped +//| sample to complete its current playback and end further looping """ +//| ... //| static mp_obj_t audiomixer_mixervoice_obj_end(mp_obj_t self_in) { audiomixer_mixervoice_obj_t *self = MP_OBJ_TO_PTR(self_in); From fd2500da6bbc8ccc9f953dabc35209d2416c7613 Mon Sep 17 00:00:00 2001 From: Bob Hammell Date: Tue, 6 May 2025 10:13:48 -0400 Subject: [PATCH 9/9] Update formatting --- shared-bindings/audiomixer/MixerVoice.c | 29 ++++++++++++------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/shared-bindings/audiomixer/MixerVoice.c b/shared-bindings/audiomixer/MixerVoice.c index 1df15198ff4ba..fc292d4ea2f68 100644 --- a/shared-bindings/audiomixer/MixerVoice.c +++ b/shared-bindings/audiomixer/MixerVoice.c @@ -155,18 +155,17 @@ static const mp_rom_map_elem_t audiomixer_mixervoice_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&audiomixer_mixervoice_stop_obj) }, { MP_ROM_QSTR(MP_QSTR_end), MP_ROM_PTR(&audiomixer_mixervoice_end_obj) }, - // Properties - { - MP_ROM_QSTR(MP_QSTR_playing), MP_ROM_PTR(&audiomixer_mixervoice_playing_obj) - }, - { MP_ROM_QSTR(MP_QSTR_level), MP_ROM_PTR(&audiomixer_mixervoice_level_obj) }, - { MP_ROM_QSTR(MP_QSTR_loop), MP_ROM_PTR(&audiomixer_mixervoice_loop_obj) }, }; - static MP_DEFINE_CONST_DICT(audiomixer_mixervoice_locals_dict, audiomixer_mixervoice_locals_dict_table); - - MP_DEFINE_CONST_OBJ_TYPE( - audiomixer_mixervoice_type, - MP_QSTR_MixerVoice, - MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS, - make_new, audiomixer_mixervoice_make_new, - locals_dict, &audiomixer_mixervoice_locals_dict - ); + // Properties + { MP_ROM_QSTR(MP_QSTR_playing), MP_ROM_PTR(&audiomixer_mixervoice_playing_obj) }, + { MP_ROM_QSTR(MP_QSTR_level), MP_ROM_PTR(&audiomixer_mixervoice_level_obj) }, + { MP_ROM_QSTR(MP_QSTR_loop), MP_ROM_PTR(&audiomixer_mixervoice_loop_obj) }, +}; +static MP_DEFINE_CONST_DICT(audiomixer_mixervoice_locals_dict, audiomixer_mixervoice_locals_dict_table); + +MP_DEFINE_CONST_OBJ_TYPE( + audiomixer_mixervoice_type, + MP_QSTR_MixerVoice, + MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS, + make_new, audiomixer_mixervoice_make_new, + locals_dict, &audiomixer_mixervoice_locals_dict + );