@@ -81,6 +81,37 @@ static mp_obj_t microbit_audio_track_unary_op(mp_unary_op_t op, mp_obj_t self_in
81
81
}
82
82
}
83
83
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
+
84
115
static mp_obj_t microbit_audio_track_subscr (mp_obj_t self_in , mp_obj_t index , mp_obj_t value_in ) {
85
116
microbit_audio_track_obj_t * self = MP_OBJ_TO_PTR (self_in );
86
117
if (value_in == MP_OBJ_NULL ) {
@@ -161,6 +192,7 @@ MP_DEFINE_CONST_OBJ_TYPE(
161
192
MP_TYPE_FLAG_NONE ,
162
193
make_new , microbit_audio_track_make_new ,
163
194
unary_op , microbit_audio_track_unary_op ,
195
+ binary_op , microbit_audio_track_binary_op ,
164
196
subscr , microbit_audio_track_subscr ,
165
197
buffer , microbit_audio_track_get_buffer ,
166
198
locals_dict , & microbit_audio_track_locals_dict
0 commit comments