@@ -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+
84115static 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