@@ -428,16 +428,15 @@ static mp_int_t audio_frame_get_buffer(mp_obj_t self_in, mp_buffer_info_t *bufin
428428 return 0 ;
429429}
430430
431- static void add_into ( microbit_audio_frame_obj_t * self , microbit_audio_frame_obj_t * other , bool add ) {
431+ void microbit_audio_data_add_inplace ( uint8_t * lhs_data , const uint8_t * rhs_data , size_t size , bool add ) {
432432 int mult = add ? 1 : -1 ;
433- size_t size = MIN (self -> alloc_size , other -> alloc_size );
434433 for (int i = 0 ; i < size ; i ++ ) {
435- unsigned val = (int )self -> data [i ] + mult * (other -> data [i ]- 128 );
434+ unsigned val = (int )lhs_data [i ] + mult * (rhs_data [i ]- 128 );
436435 // Clamp to 0-255
437436 if (val > 255 ) {
438437 val = (1 - (val >>31 ))* 255 ;
439438 }
440- self -> data [i ] = val ;
439+ lhs_data [i ] = val ;
441440 }
442441}
443442
@@ -488,14 +487,14 @@ int32_t float_to_fixed(float f, uint32_t scale) {
488487 return result ;
489488}
490489
491- static void mult ( microbit_audio_frame_obj_t * self , float f ) {
490+ void microbit_audio_data_mult_inplace ( uint8_t * data , size_t size , float f ) {
492491 int scaled = float_to_fixed (f , 15 );
493- for (int i = 0 ; i < self -> alloc_size ; i ++ ) {
494- unsigned val = ((((int )self -> data [i ]- 128 ) * scaled ) >> 15 )+ 128 ;
492+ for (int i = 0 ; i < size ; i ++ ) {
493+ unsigned val = ((((int )data [i ]- 128 ) * scaled ) >> 15 )+ 128 ;
495494 if (val > 255 ) {
496495 val = (1 - (val >>31 ))* 255 ;
497496 }
498- self -> data [i ] = val ;
497+ data [i ] = val ;
499498 }
500499}
501500
@@ -513,12 +512,14 @@ static mp_obj_t audio_frame_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_obj
513512 if (mp_obj_get_type (rhs_in ) != & microbit_audio_frame_type ) {
514513 return MP_OBJ_NULL ; // op not supported
515514 }
516- add_into (lhs , (microbit_audio_frame_obj_t * )rhs_in , op == MP_BINARY_OP_ADD || op == MP_BINARY_OP_INPLACE_ADD );
515+ microbit_audio_frame_obj_t * rhs = MP_OBJ_TO_PTR (rhs_in );
516+ size_t size = MIN (lhs -> alloc_size , rhs -> alloc_size );
517+ microbit_audio_data_add_inplace (lhs -> data , rhs -> data , size , op == MP_BINARY_OP_ADD || op == MP_BINARY_OP_INPLACE_ADD );
517518 return lhs ;
518519 case MP_BINARY_OP_MULTIPLY :
519520 lhs = copy (lhs );
520521 case MP_BINARY_OP_INPLACE_MULTIPLY :
521- mult (lhs , mp_obj_get_float (rhs_in ));
522+ microbit_audio_data_mult_inplace (lhs -> data , lhs -> alloc_size , mp_obj_get_float (rhs_in ));
522523 return lhs ;
523524 default :
524525 return MP_OBJ_NULL ; // op not supported
0 commit comments