Skip to content

Commit 542c7c9

Browse files
committed
Implement level as BlockInput.
1 parent 5602618 commit 542c7c9

File tree

5 files changed

+18
-14
lines changed

5 files changed

+18
-14
lines changed

shared-bindings/audiomixer/MixerVoice.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "py/objproperty.h"
1414
#include "py/runtime.h"
1515
#include "shared-bindings/util.h"
16+
#include "shared-module/synthio/block.h"
1617

1718
//| class MixerVoice:
1819
//| """Voice objects used with Mixer
@@ -75,17 +76,16 @@ static mp_obj_t audiomixer_mixervoice_obj_stop(size_t n_args, const mp_obj_t *po
7576
}
7677
MP_DEFINE_CONST_FUN_OBJ_KW(audiomixer_mixervoice_stop_obj, 1, audiomixer_mixervoice_obj_stop);
7778

78-
//| level: float
79+
//| level: synthio.BlockInput
7980
//| """The volume level of a voice, as a floating point number between 0 and 1."""
8081
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));
82+
return common_hal_audiomixer_mixervoice_get_level(self_in);
8283
}
8384
MP_DEFINE_CONST_FUN_OBJ_1(audiomixer_mixervoice_get_level_obj, audiomixer_mixervoice_obj_get_level);
8485

8586
static mp_obj_t audiomixer_mixervoice_obj_set_level(mp_obj_t self_in, mp_obj_t level_in) {
8687
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);
88+
common_hal_audiomixer_mixervoice_set_level(self, level_in);
8989
return mp_const_none;
9090
}
9191
MP_DEFINE_CONST_FUN_OBJ_2(audiomixer_mixervoice_set_level_obj, audiomixer_mixervoice_obj_set_level);

shared-bindings/audiomixer/MixerVoice.h

Lines changed: 2 additions & 2 deletions
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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,9 +188,12 @@ static void mix_down_one_voice(audiomixer_mixer_obj_t *self,
188188
}
189189
}
190190

191-
uint32_t n = MIN(voice->buffer_length, length);
191+
uint32_t n = MIN(MIN(voice->buffer_length, length), SYNTHIO_MAX_DUR * self->channel_count);
192192
uint32_t *src = voice->remaining_buffer;
193-
uint16_t level = voice->level;
193+
194+
// Get the current level from the BlockInput. These may change at run time so you need to do bounds checking if required.
195+
shared_bindings_synthio_lfo_tick(self->sample_rate); //, n / self->channel_count); // Requires #9776
196+
uint16_t level = (uint16_t)(synthio_block_slot_get_limited(&voice->level, MICROPY_FLOAT_CONST(0.0), MICROPY_FLOAT_CONST(1.0)) * (1 << 15));
194197

195198
// First active voice gets copied over verbatim.
196199
if (!voices_active) {

shared-module/audiomixer/MixerVoice.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,19 @@
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+
return self->level.obj;
2727
}
2828

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));
29+
void common_hal_audiomixer_mixervoice_set_level(audiomixer_mixervoice_obj_t *self, mp_obj_t arg) {
30+
synthio_block_assign_slot(arg, &self->level, MP_QSTR_level);
3131
}
3232

3333
bool common_hal_audiomixer_mixervoice_get_loop(audiomixer_mixervoice_obj_t *self) {

shared-module/audiomixer/MixerVoice.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include "shared-module/audiomixer/__init__.h"
1111
#include "shared-module/audiomixer/Mixer.h"
12+
#include "shared-module/synthio/block.h"
1213

1314
typedef struct {
1415
mp_obj_base_t base;
@@ -18,5 +19,5 @@ typedef struct {
1819
bool more_data;
1920
uint32_t *remaining_buffer;
2021
uint32_t buffer_length;
21-
uint16_t level;
22+
synthio_block_slot_t level;
2223
} audiomixer_mixervoice_obj_t;

0 commit comments

Comments
 (0)