Skip to content

Commit d4fb4e8

Browse files
authored
Merge pull request adafruit#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

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

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: 10 additions & 1 deletion
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

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

Lines changed: 7 additions & 0 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy