diff --git a/agb/src/sound/mixer/mixer.s b/agb/src/sound/mixer/mixer.s index 8cc44ea0..0ba3e3e9 100644 --- a/agb/src/sound/mixer/mixer.s +++ b/agb/src/sound/mixer/mixer.s @@ -1,139 +1,3 @@ -.macro mixer_add fn_name:req is_first:req -agb_arm_func \fn_name - @ Arguments - @ r0 - pointer to the data to be copied (u8 array) - @ r1 - pointer to the sound buffer (i16 array which will alternate left and right channels, 32-bit aligned) - @ r2 - playback speed (usize fixnum with 8 bits) - @ r3 - amount to modify the left channel by (u16 fixnum with 4 bits) - @ stack position 1 - amount to modify the right channel by (u16 fixnum with 4 bits) - @ stack position 2 - the buffer_size (usize) - @ - @ The sound buffer must be buffer_size * 2 in size - push {{r4-r8}} - - ldr r7, [sp, #20] @ load the right channel modification amount into r7 - ldr r8, [sp, #24] @ load the buffer size into r8 - - movs r8, r8 @ check that the buffer size isn't 0 - bne 1f - - pop {{r4-r8}} - bx lr -1: - - cmp r7, r3 @ check if left and right channel need the same modifications - beq 3f @ same modification - -4: @ modification fallback - orr r7, r7, r3, lsl #16 @ r7 now is the left channel followed by the right channel modifications. - - mov r5, #0 @ current index we're reading from - -.macro add_one_sample - add r4, r0, r5, asr #8 @ calculate the address of the next read from the sound buffer - ldrsb r6, [r4] @ load the current sound sample to r6 - add r5, r5, r2 @ calculate the position to read the next sample from - -.ifc \is_first,true - mul r4, r6, r7 @ r4 = r6 * r7 (calculating both the left and right samples together) -.else - ldr r4, [r1] @ read the current value - mla r4, r6, r7, r4 @ r4 += r6 * r7 (calculating both the left and right samples together) -.endif - - str r4, [r1], #4 @ store the new value, and increment the pointer -.endm - -@ handle the non-multiple of 4 buffer size case - and r3, r8, #3 -1: - subs r3, r3, #1 - bmi 1f - - add_one_sample - subs r8, r8, #1 - beq 2f - b 1b - -1: -.rept 4 - add_one_sample -.endr -.purgem add_one_sample - subs r8, r8, #4 @ loop counter - bne 1b @ jump back if we're done with the loop - -2: - pop {{r4-r8}} - bx lr - -3: @ same modification - @ check to see if this is a perfect power of 2 - @ r5 is a scratch register, r7 = r3 = amount to modify - sub r5, r7, #1 - ands r5, r5, r7 - - bne 4b @ not 0 means we need to do the full modification, jump to modification fallback - - @ count leading zeros of r7 into r3 - mov r3, #0 -1: - add r3, r3, #1 - lsrs r7, r7, #1 - bne 1b - - sub r3, r3, #1 - - mov r5, #0 @ current index we're reading from - -.macro add_one_sample_same_modification - add r4, r0, r5, asr #8 @ calculate the address of the next read from the sound buffer - ldrsb r6, [r4] @ load the current sound sample to r6 - add r5, r5, r2 @ calculate the position to read the next sample from - - lsl r6, r6, #16 - orr r6, r6, lsr #16 - -.ifc \is_first,true - mov r4, r6, lsl r3 @ r4 = r6 << r3 -.else - ldr r4, [r1] @ read the current value - add r4, r4, r6, lsl r3 @ r4 += r6 << r3 (calculating both the left and right samples together) -.endif - - str r4, [r1], #4 @ store the new value, and increment the pointer -.endm - -@ handle the non-multiple of 4 buffer size case - and r7, r8, #3 -1: - subs r7, r7, #1 - bmi 1f - - add_one_sample_same_modification - subs r8, r8, #1 - beq 2f - b 1b - -1: -.rept 4 - add_one_sample_same_modification -.endr -.purgem add_one_sample_same_modification - - subs r8, r8, #4 @ loop counter - bne 1b @ jump back if we're done with the loop - -2: - pop {{r4-r8}} - bx lr - -agb_arm_end \fn_name -.endm - -mixer_add agb_rs__mixer_add false -mixer_add agb_rs__mixer_add_first true - .macro stereo_add_fn fn_name:req is_first:req agb_arm_func \fn_name @ Arguments @@ -202,7 +66,9 @@ agb_arm_end \fn_name .endm stereo_add_fn agb_rs__mixer_add_stereo false -stereo_add_fn agb_rs__mixer_add_stereo_first true + +@ TODO(GI): Might bring this back later +@ stereo_add_fn agb_rs__mixer_add_stereo_first true agb_arm_func agb_rs__mixer_collapse @ Arguments: diff --git a/agb/src/sound/mixer/sw_mixer.rs b/agb/src/sound/mixer/sw_mixer.rs index f7f64d39..c5d50bce 100644 --- a/agb/src/sound/mixer/sw_mixer.rs +++ b/agb/src/sound/mixer/sw_mixer.rs @@ -1,6 +1,5 @@ use core::cell::RefCell; use core::marker::PhantomData; -use core::ops::ControlFlow; use core::pin::Pin; use alloc::boxed::Box; @@ -22,24 +21,6 @@ use crate::{ // Defined in mixer.s extern "C" { - fn agb_rs__mixer_add( - sound_data: *const u8, - sound_buffer: *mut Num, - playback_speed: Num, - left_amount: Num, - right_amount: Num, - buffer_size: usize, - ); - - fn agb_rs__mixer_add_first( - sound_data: *const u8, - sound_buffer: *mut Num, - playback_speed: Num, - left_amount: Num, - right_amount: Num, - buffer_size: usize, - ); - fn agb_rs__mixer_add_stereo( sound_data: *const u8, sound_buffer: *mut Num, @@ -47,13 +28,6 @@ extern "C" { buffer_size: usize, ); - fn agb_rs__mixer_add_stereo_first( - sound_data: *const u8, - sound_buffer: *mut Num, - volume: Num, - buffer_size: usize, - ); - fn agb_rs__mixer_collapse( sound_buffer: *mut i8, input_buffer: *const Num,