Index: apps/dsp_asm.h =================================================================== --- apps/dsp_asm.h (revision 16685) +++ apps/dsp_asm.h (working copy) @@ -26,6 +26,8 @@ #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 #elif defined (CPU_COLDFIRE) #define DSP_HAVE_ASM_APPLY_GAIN #define DSP_HAVE_ASM_RESAMPLING Index: apps/dsp_arm.S =================================================================== --- apps/dsp_arm.S (revision 16685) +++ apps/dsp_arm.S (working copy) @@ -16,8 +16,94 @@ * KIND, either express or implied. * ****************************************************************************/ + +/**************************************************************************** + * 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} + ldr r4, [r2] @ r4 = src[0] + ldr r5, [r1] @ r6 = data->output_scale + sub r1, r5, #1 @ r1 = r5-1 + mov r2, #1 + mov r2, r2, asl r1 @ r2 = 1<> scale + cmp r6, r1 + movgt r6, r1 @ Clip positive (+32767) + cmn r6, r1 + rsblt r6, r1, #0 @ Clip negative (-32767) + strh r6, [r3], #2 + strh r6, [r3], #2 + + subs r0, r0, #1 + bgt .somloop + + ldmfd sp!, {r4-r6} + bx lr +.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} + + 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 + cmp r7, r1 + movgt r7, r1 @ Clip positive (+32767) + cmn r7, r1 + rsblt r7, r1, #0 @ Clip negative (-32767) + strh r7, [r3], #2 + + ldr r7, [r5], #4 + add r7, r7, r2 + mov r7, r7, asr r6 @ r7 = (r7 + 1<<(scale-1)) >> scale + cmp r7, r1 + movgt r7, r1 @ Clip positive (+32767) + cmn r7, r1 + rsblt r7, r1, #0 @ Clip negative (-32767) + strh r7, [r3], #2 + + subs r0, r0, #1 + bgt .sosloop + + ldmfd sp!, {r4-r7} + bx lr +.sosend: + .size sample_output_stereo,.sosend-sample_output_stereo + +/**************************************************************************** * void apply_crossfeed(int count, int32_t* src[]) */ .section .text