Skip to content

Commit d4fb4e8

Browse files
authored
Merge pull request #9899 from relic-se/mixervoice_level_blockinput
Implement `audiomixer.MixerVoice.level` as `synthio.BlockInput`
2 parents fabd4a6 + a5956ea commit d4fb4e8

File tree

5 files changed

+41
-13
lines changed

5 files changed

+41
-13
lines changed

shared-bindings/audiomixer/MixerVoice.c

+9-5
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
#include "py/objproperty.h"
1414
#include "py/runtime.h"
1515
#include "shared-bindings/util.h"
16+
#if CIRCUITPY_SYNTHIO
17+
#include "shared-module/synthio/block.h"
18+
#endif
1619

1720
//| class MixerVoice:
1821
//| """Voice objects used with Mixer
@@ -75,17 +78,18 @@ static mp_obj_t audiomixer_mixervoice_obj_stop(size_t n_args, const mp_obj_t *po
7578
}
7679
MP_DEFINE_CONST_FUN_OBJ_KW(audiomixer_mixervoice_stop_obj, 1, audiomixer_mixervoice_obj_stop);
7780

78-
//| level: float
79-
//| """The volume level of a voice, as a floating point number between 0 and 1."""
81+
//| level: synthio.BlockInput
82+
//| """The volume level of a voice, as a floating point number between 0 and 1. If your board
83+
//| does not support synthio, this property will only accept a float value.
84+
//| """
8085
static mp_obj_t audiomixer_mixervoice_obj_get_level(mp_obj_t self_in) {
81-
return mp_obj_new_float(common_hal_audiomixer_mixervoice_get_level(self_in));
86+
return common_hal_audiomixer_mixervoice_get_level(self_in);
8287
}
8388
MP_DEFINE_CONST_FUN_OBJ_1(audiomixer_mixervoice_get_level_obj, audiomixer_mixervoice_obj_get_level);
8489

8590
static mp_obj_t audiomixer_mixervoice_obj_set_level(mp_obj_t self_in, mp_obj_t level_in) {
8691
audiomixer_mixervoice_obj_t *self = MP_OBJ_TO_PTR(self_in);
87-
mp_float_t level = mp_arg_validate_obj_float_range(level_in, 0, 1, MP_QSTR_level);
88-
common_hal_audiomixer_mixervoice_set_level(self, level);
92+
common_hal_audiomixer_mixervoice_set_level(self, level_in);
8993
return mp_const_none;
9094
}
9195
MP_DEFINE_CONST_FUN_OBJ_2(audiomixer_mixervoice_set_level_obj, audiomixer_mixervoice_obj_set_level);

shared-bindings/audiomixer/MixerVoice.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ void common_hal_audiomixer_mixervoice_construct(audiomixer_mixervoice_obj_t *sel
1515
void common_hal_audiomixer_mixervoice_set_parent(audiomixer_mixervoice_obj_t *self, audiomixer_mixer_obj_t *parent);
1616
void common_hal_audiomixer_mixervoice_play(audiomixer_mixervoice_obj_t *self, mp_obj_t sample, bool loop);
1717
void common_hal_audiomixer_mixervoice_stop(audiomixer_mixervoice_obj_t *self);
18-
mp_float_t common_hal_audiomixer_mixervoice_get_level(audiomixer_mixervoice_obj_t *self);
19-
void common_hal_audiomixer_mixervoice_set_level(audiomixer_mixervoice_obj_t *self, mp_float_t gain);
18+
mp_obj_t common_hal_audiomixer_mixervoice_get_level(audiomixer_mixervoice_obj_t *self);
19+
void common_hal_audiomixer_mixervoice_set_level(audiomixer_mixervoice_obj_t *self, mp_obj_t gain);
2020

2121
bool common_hal_audiomixer_mixervoice_get_playing(audiomixer_mixervoice_obj_t *self);
2222

shared-module/audiomixer/Mixer.c

+10-1
Original file line numberDiff line numberDiff line change
@@ -188,9 +188,18 @@ static void mix_down_one_voice(audiomixer_mixer_obj_t *self,
188188
}
189189
}
190190

191-
uint32_t n = MIN(voice->buffer_length, length);
192191
uint32_t *src = voice->remaining_buffer;
192+
193+
#if CIRCUITPY_SYNTHIO
194+
uint32_t n = MIN(MIN(voice->buffer_length, length), SYNTHIO_MAX_DUR * self->channel_count);
195+
196+
// Get the current level from the BlockInput. These may change at run time so you need to do bounds checking if required.
197+
shared_bindings_synthio_lfo_tick(self->sample_rate);
198+
uint16_t level = (uint16_t)(synthio_block_slot_get_limited(&voice->level, MICROPY_FLOAT_CONST(0.0), MICROPY_FLOAT_CONST(1.0)) * (1 << 15));
199+
#else
200+
uint32_t n = MIN(voice->buffer_length, length);
193201
uint16_t level = voice->level;
202+
#endif
194203

195204
// First active voice gets copied over verbatim.
196205
if (!voices_active) {

shared-module/audiomixer/MixerVoice.c

+13-5
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,27 @@
1515

1616
void common_hal_audiomixer_mixervoice_construct(audiomixer_mixervoice_obj_t *self) {
1717
self->sample = NULL;
18-
self->level = 1 << 15;
18+
common_hal_audiomixer_mixervoice_set_level(self, mp_obj_new_float(1.0));
1919
}
2020

2121
void common_hal_audiomixer_mixervoice_set_parent(audiomixer_mixervoice_obj_t *self, audiomixer_mixer_obj_t *parent) {
2222
self->parent = parent;
2323
}
2424

25-
mp_float_t common_hal_audiomixer_mixervoice_get_level(audiomixer_mixervoice_obj_t *self) {
26-
return (mp_float_t)self->level / (1 << 15);
25+
mp_obj_t common_hal_audiomixer_mixervoice_get_level(audiomixer_mixervoice_obj_t *self) {
26+
#if CIRCUITPY_SYNTHIO
27+
return self->level.obj;
28+
#else
29+
return mp_obj_new_float((mp_float_t)self->level / (1 << 15));
30+
#endif
2731
}
2832

29-
void common_hal_audiomixer_mixervoice_set_level(audiomixer_mixervoice_obj_t *self, mp_float_t level) {
30-
self->level = (uint16_t)(level * (1 << 15));
33+
void common_hal_audiomixer_mixervoice_set_level(audiomixer_mixervoice_obj_t *self, mp_obj_t arg) {
34+
#if CIRCUITPY_SYNTHIO
35+
synthio_block_assign_slot(arg, &self->level, MP_QSTR_level);
36+
#else
37+
self->level = (uint16_t)(mp_arg_validate_obj_float_range(arg, 0, 1, MP_QSTR_level) * (1 << 15));
38+
#endif
3139
}
3240

3341
bool common_hal_audiomixer_mixervoice_get_loop(audiomixer_mixervoice_obj_t *self) {

shared-module/audiomixer/MixerVoice.h

+7
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99

1010
#include "shared-module/audiomixer/__init__.h"
1111
#include "shared-module/audiomixer/Mixer.h"
12+
#if CIRCUITPY_SYNTHIO
13+
#include "shared-module/synthio/block.h"
14+
#endif
1215

1316
typedef struct {
1417
mp_obj_base_t base;
@@ -18,5 +21,9 @@ typedef struct {
1821
bool more_data;
1922
uint32_t *remaining_buffer;
2023
uint32_t buffer_length;
24+
#if CIRCUITPY_SYNTHIO
25+
synthio_block_slot_t level;
26+
#else
2127
uint16_t level;
28+
#endif
2229
} audiomixer_mixervoice_obj_t;

0 commit comments

Comments
 (0)