mirror of
https://github.com/italicsjenga/agb.git
synced 2024-12-23 08:11:33 +11:00
Pass the buffer size rather than using the global variable for it
This commit is contained in:
parent
86db9d15bf
commit
d38fea7f7a
|
@ -1,9 +1,3 @@
|
||||||
.section .iwram.buffer_size
|
|
||||||
.global agb_rs__buffer_size
|
|
||||||
.balign 4
|
|
||||||
agb_rs__buffer_size:
|
|
||||||
.word 0
|
|
||||||
|
|
||||||
.macro mixer_add fn_name:req is_first:req
|
.macro mixer_add fn_name:req is_first:req
|
||||||
agb_arm_func \fn_name
|
agb_arm_func \fn_name
|
||||||
@ Arguments
|
@ Arguments
|
||||||
|
@ -12,8 +6,9 @@ agb_arm_func \fn_name
|
||||||
@ r2 - playback speed (usize fixnum with 8 bits)
|
@ r2 - playback speed (usize fixnum with 8 bits)
|
||||||
@ r3 - amount to modify the left channel by (u16 fixnum with 4 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 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 SOUND_BUFFER_SIZE * 2 in size = 176 * 2
|
@ The sound buffer must be buffer_size * 2 in size
|
||||||
push {{r4-r8}}
|
push {{r4-r8}}
|
||||||
|
|
||||||
ldr r7, [sp, #20] @ load the right channel modification amount into r7
|
ldr r7, [sp, #20] @ load the right channel modification amount into r7
|
||||||
|
@ -25,9 +20,7 @@ agb_arm_func \fn_name
|
||||||
orr r7, r7, r3, lsl #16 @ r7 now is the left channel followed by the right channel modifications.
|
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
|
mov r5, #0 @ current index we're reading from
|
||||||
ldr r8, =agb_rs__buffer_size @ the number of steps left
|
ldr r8, [sp, #24]
|
||||||
ldr r8, [r8]
|
|
||||||
|
|
||||||
|
|
||||||
1:
|
1:
|
||||||
.rept 4
|
.rept 4
|
||||||
|
@ -69,8 +62,7 @@ agb_arm_func \fn_name
|
||||||
sub r3, r3, #1
|
sub r3, r3, #1
|
||||||
|
|
||||||
mov r5, #0 @ current index we're reading from
|
mov r5, #0 @ current index we're reading from
|
||||||
ldr r8, =agb_rs__buffer_size @ the number of steps left
|
ldr r8, [sp, #24] @ the number of steps we have left
|
||||||
ldr r8, [r8]
|
|
||||||
|
|
||||||
1:
|
1:
|
||||||
.rept 4
|
.rept 4
|
||||||
|
@ -110,14 +102,14 @@ agb_arm_func \fn_name
|
||||||
@ r0 - pointer to the data to be copied (u8 array)
|
@ 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)
|
@ r1 - pointer to the sound buffer (i16 array which will alternate left and right channels, 32-bit aligned)
|
||||||
@ r2 - volume to play the sound at
|
@ r2 - volume to play the sound at
|
||||||
|
@ r3 - the buffer size
|
||||||
@
|
@
|
||||||
@ The sound buffer must be SOUND_BUFFER_SIZE * 2 in size = 176 * 2
|
@ The sound buffer must be SOUND_BUFFER_SIZE * 2 in size = 176 * 2
|
||||||
push {{r4-r11}}
|
push {{r4-r11}}
|
||||||
|
|
||||||
ldr r5, =0x00000FFF
|
ldr r5, =0x00000FFF
|
||||||
|
|
||||||
ldr r8, =agb_rs__buffer_size
|
mov r8, r3
|
||||||
ldr r8, [r8]
|
|
||||||
|
|
||||||
.macro add_stereo_sample sample_reg:req
|
.macro add_stereo_sample sample_reg:req
|
||||||
ldrsh r6, [r0], #2 @ load the current sound sample to r6
|
ldrsh r6, [r0], #2 @ load the current sound sample to r6
|
||||||
|
|
|
@ -27,6 +27,7 @@ extern "C" {
|
||||||
playback_speed: Num<u32, 8>,
|
playback_speed: Num<u32, 8>,
|
||||||
left_amount: Num<i16, 4>,
|
left_amount: Num<i16, 4>,
|
||||||
right_amount: Num<i16, 4>,
|
right_amount: Num<i16, 4>,
|
||||||
|
buffer_size: usize,
|
||||||
);
|
);
|
||||||
|
|
||||||
fn agb_rs__mixer_add_first(
|
fn agb_rs__mixer_add_first(
|
||||||
|
@ -35,18 +36,21 @@ extern "C" {
|
||||||
playback_speed: Num<u32, 8>,
|
playback_speed: Num<u32, 8>,
|
||||||
left_amount: Num<i16, 4>,
|
left_amount: Num<i16, 4>,
|
||||||
right_amount: Num<i16, 4>,
|
right_amount: Num<i16, 4>,
|
||||||
|
buffer_size: usize,
|
||||||
);
|
);
|
||||||
|
|
||||||
fn agb_rs__mixer_add_stereo(
|
fn agb_rs__mixer_add_stereo(
|
||||||
sound_data: *const u8,
|
sound_data: *const u8,
|
||||||
sound_buffer: *mut Num<i16, 4>,
|
sound_buffer: *mut Num<i16, 4>,
|
||||||
volume: Num<i16, 4>,
|
volume: Num<i16, 4>,
|
||||||
|
buffer_size: usize,
|
||||||
);
|
);
|
||||||
|
|
||||||
fn agb_rs__mixer_add_stereo_first(
|
fn agb_rs__mixer_add_stereo_first(
|
||||||
sound_data: *const u8,
|
sound_data: *const u8,
|
||||||
sound_buffer: *mut Num<i16, 4>,
|
sound_buffer: *mut Num<i16, 4>,
|
||||||
volume: Num<i16, 4>,
|
volume: Num<i16, 4>,
|
||||||
|
buffer_size: usize,
|
||||||
);
|
);
|
||||||
|
|
||||||
fn agb_rs__mixer_collapse(
|
fn agb_rs__mixer_collapse(
|
||||||
|
@ -164,8 +168,6 @@ impl Mixer<'_> {
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
set_asm_buffer_size(frequency);
|
|
||||||
|
|
||||||
let mut working_buffer =
|
let mut working_buffer =
|
||||||
Vec::with_capacity_in(frequency.buffer_size() * 2, InternalAllocator);
|
Vec::with_capacity_in(frequency.buffer_size() * 2, InternalAllocator);
|
||||||
working_buffer.resize(frequency.buffer_size() * 2, 0.into());
|
working_buffer.resize(frequency.buffer_size() * 2, 0.into());
|
||||||
|
@ -322,16 +324,6 @@ impl Mixer<'_> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_asm_buffer_size(frequency: Frequency) {
|
|
||||||
extern "C" {
|
|
||||||
static mut agb_rs__buffer_size: usize;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe {
|
|
||||||
agb_rs__buffer_size = frequency.buffer_size();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct SoundBuffer(Box<[i8], InternalAllocator>);
|
struct SoundBuffer(Box<[i8], InternalAllocator>);
|
||||||
|
|
||||||
impl SoundBuffer {
|
impl SoundBuffer {
|
||||||
|
@ -452,6 +444,7 @@ impl MixerBuffer {
|
||||||
channel.data.as_ptr().add(channel.pos.floor() as usize),
|
channel.data.as_ptr().add(channel.pos.floor() as usize),
|
||||||
working_buffer.as_mut_ptr(),
|
working_buffer.as_mut_ptr(),
|
||||||
channel.volume,
|
channel.volume,
|
||||||
|
self.frequency.buffer_size(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -465,6 +458,7 @@ impl MixerBuffer {
|
||||||
playback_speed,
|
playback_speed,
|
||||||
left_amount,
|
left_amount,
|
||||||
right_amount,
|
right_amount,
|
||||||
|
self.frequency.buffer_size(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -485,6 +479,7 @@ impl MixerBuffer {
|
||||||
channel.data.as_ptr().add(channel.pos.floor() as usize),
|
channel.data.as_ptr().add(channel.pos.floor() as usize),
|
||||||
working_buffer.as_mut_ptr(),
|
working_buffer.as_mut_ptr(),
|
||||||
channel.volume,
|
channel.volume,
|
||||||
|
self.frequency.buffer_size(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -498,6 +493,7 @@ impl MixerBuffer {
|
||||||
playback_speed,
|
playback_speed,
|
||||||
left_amount,
|
left_amount,
|
||||||
right_amount,
|
right_amount,
|
||||||
|
self.frequency.buffer_size(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue