Index: apps/dsp_arm.S =================================================================== --- apps/dsp_arm.S (revision 16685) +++ apps/dsp_arm.S (working copy) @@ -16,8 +16,117 @@ * KIND, either express or implied. * ****************************************************************************/ + +/**************************************************************************** + * void channels_process_sound_chan_karaoke(int count, int32_t *buf[]) + */ + .section .icode, "ax", %progbits + .align 2 + .global channels_process_sound_chan_karaoke + .type channels_process_sound_chan_karaoke, %function +channels_process_sound_chan_karaoke: + @ input: r0 = count, r1 = buf + stmfd sp!, {r4, lr} + ldmia r1, {r2-r3} @ r4 = src[0], r5 = src[1] +.karaokeloop: + ldr r4, [r2] + ldr lr, [r3] + + sub r4, r4, lr @ r4 = r4 - lr + mov r4, r4, asr #1 @ r4 = r4/2 = buf[0]/2 - buf[1]/2 + rsb lr, r4, #0 @ lr = -r4 + + str r4, [r2], #4 + str lr, [r3], #4 + + subs r0, r0, #1 + bgt .karaokeloop + + ldmfd sp!, {r4, pc} +.karaokeend: + .size channels_process_sound_chan_karaoke,.karaokeend-channels_process_sound_chan_karaoke + /**************************************************************************** + * void sample_output_mono(int count, struct dsp_data *data, + int32_t *src[], int16_t *dst) + */ + .section .icode, "ax", %progbits + .align 2 + .global sample_output_mono + .type sample_output_mono, %function +sample_output_mono: + @ input: r0 = count, r1 = data, r2 = src, r3 = dst + stmfd sp!, {r4-r6, lr} + + ldr r4, [r2] @ r4 = src[0] + ldr r5, [r1] @ lr = data->output_scale + sub r1, r5, #1 @ r1 = r5-1 + mov r2, #1 + mov r2, r2, asl r1 @ r2 = 1<> scale + mov lr, r6, asr #15 + teq lr, lr, asr #31 + eorne r6, r1, lr, asr #31 @ Clip (-32768...+32767) + strh r6, [r3], #2 + strh r6, [r3], #2 + + subs r0, r0, #1 + bgt .somloop + + ldmfd sp!, {r4-r6, pc} +.somend: + .size sample_output_mono,.somend-sample_output_mono + +/**************************************************************************** + * void sample_output_stereo(int count, struct dsp_data *data, + int32_t *src[], int16_t *dst) + */ + .section .icode, "ax", %progbits + .align 2 + .global sample_output_stereo + .type sample_output_stereo, %function +sample_output_stereo: + @ input: r0 = count, r1 = data, r2 = src, r3 = dst + stmfd sp!, {r4-r7, lr} + + ldmia r2, {r4-r5} @ r4 = src[0], r5 = src[1] + ldr r6, [r1] @ r6 = data->output_scale + sub r1, r6, #1 @ r1 = r6-1 + mov r2, #1 + mov r2, r2, asl r1 @ r2 = 1<> scale + mov lr, r7, asr #15 + teq lr, lr, asr #31 + eorne r7, r1, lr, asr #31 @ Clip (-32768...+32767) + strh r7, [r3], #2 + + ldr r7, [r5], #4 + add r7, r7, r2 + mov r7, r7, asr r6 @ r7 = (r7 + 1<<(scale-1)) >> scale + mov lr, r7, asr #15 + teq lr, lr, asr #31 + eorne r7, r1, lr, asr #31 @ Clip (-32768...+32767) + strh r7, [r3], #2 + + subs r0, r0, #1 + bgt .sosloop + + ldmfd sp!, {r4-r7, pc} +.sosend: + .size sample_output_stereo,.sosend-sample_output_stereo + +/**************************************************************************** * void apply_crossfeed(int count, int32_t* src[]) */ .section .text Index: apps/dsp_asm.h =================================================================== --- apps/dsp_asm.h (revision 16685) +++ apps/dsp_asm.h (working copy) @@ -26,6 +26,9 @@ #if defined(CPU_ARM) #define DSP_HAVE_ASM_RESAMPLING #define DSP_HAVE_ASM_CROSSFEED +#define DSP_HAVE_ASM_SAMPLE_OUTPUT_MONO +#define DSP_HAVE_ASM_SAMPLE_OUTPUT_STEREO +#define DSP_HAVE_ASM_SOUND_CHAN_KARAOKE #elif defined (CPU_COLDFIRE) #define DSP_HAVE_ASM_APPLY_GAIN #define DSP_HAVE_ASM_RESAMPLING