Skip to content

Commit 69a5da3

Browse files
committed
codal_port/microbit_audiotrack: Implement +,+=,-,-=,*,*= on AudioTrack.
Signed-off-by: Damien George <[email protected]>
1 parent 99fcfc9 commit 69a5da3

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed

src/codal_port/microbit_audiotrack.c

+32
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,37 @@ static mp_obj_t microbit_audio_track_unary_op(mp_unary_op_t op, mp_obj_t self_in
8181
}
8282
}
8383

84+
static mp_obj_t microbit_audio_track_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
85+
microbit_audio_track_obj_t *lhs = MP_OBJ_TO_PTR(lhs_in);
86+
87+
// Make a copy of LHS if the operation is not inplace.
88+
if (op == MP_BINARY_OP_ADD || op == MP_BINARY_OP_SUBTRACT || op == MP_BINARY_OP_MULTIPLY) {
89+
microbit_audio_track_obj_t *lhs_copy = microbit_audio_track_new(lhs->buffer_obj, lhs->size, lhs->data, lhs->rate);
90+
memcpy(lhs_copy->data, lhs->data, lhs->size);
91+
lhs = lhs_copy;
92+
}
93+
94+
switch(op) {
95+
case MP_BINARY_OP_ADD:
96+
case MP_BINARY_OP_SUBTRACT:
97+
case MP_BINARY_OP_INPLACE_ADD:
98+
case MP_BINARY_OP_INPLACE_SUBTRACT:
99+
if (mp_obj_get_type(rhs_in) != &microbit_audio_track_type) {
100+
return MP_OBJ_NULL; // op not supported
101+
}
102+
microbit_audio_track_obj_t *rhs = MP_OBJ_TO_PTR(rhs_in);
103+
size_t size = MIN(lhs->size, rhs->size);
104+
microbit_audio_data_add_inplace(lhs->data, rhs->data, size, op == MP_BINARY_OP_ADD || op == MP_BINARY_OP_INPLACE_ADD);
105+
return lhs;
106+
case MP_BINARY_OP_MULTIPLY:
107+
case MP_BINARY_OP_INPLACE_MULTIPLY:
108+
microbit_audio_data_mult_inplace(lhs->data, lhs->size, mp_obj_get_float(rhs_in));
109+
return lhs;
110+
default:
111+
return MP_OBJ_NULL; // op not supported
112+
}
113+
}
114+
84115
static mp_obj_t microbit_audio_track_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value_in) {
85116
microbit_audio_track_obj_t *self = MP_OBJ_TO_PTR(self_in);
86117
if (value_in == MP_OBJ_NULL) {
@@ -161,6 +192,7 @@ MP_DEFINE_CONST_OBJ_TYPE(
161192
MP_TYPE_FLAG_NONE,
162193
make_new, microbit_audio_track_make_new,
163194
unary_op, microbit_audio_track_unary_op,
195+
binary_op, microbit_audio_track_binary_op,
164196
subscr, microbit_audio_track_subscr,
165197
buffer, microbit_audio_track_get_buffer,
166198
locals_dict, &microbit_audio_track_locals_dict

0 commit comments

Comments
 (0)