From 61c413e1149d56f491a6e66bf931755384ac58bf Mon Sep 17 00:00:00 2001 From: Robin Watts Date: Tue, 5 Jan 2010 21:56:13 +0000 Subject: Update ARM version of rate filler code in line with LordHoto's change in revision 47014. svn-id: r47051 --- sound/rate_arm.cpp | 96 ++++++++++++++++++++++++++++++---------------------- sound/rate_arm_asm.s | 14 ++++++++ 2 files changed, 69 insertions(+), 41 deletions(-) diff --git a/sound/rate_arm.cpp b/sound/rate_arm.cpp index bf72d4e00e..5bab6ca59d 100644 --- a/sound/rate_arm.cpp +++ b/sound/rate_arm.cpp @@ -137,7 +137,8 @@ extern "C" { #endif } -extern "C" void ARM_SimpleRate_M(AudioStream &input, +extern "C" st_sample_t *ARM_SimpleRate_M( + AudioStream &input, int (*fn)(Audio::AudioStream&,int16*,int), SimpleRateDetails *sr, st_sample_t *obuf, @@ -145,7 +146,8 @@ extern "C" void ARM_SimpleRate_M(AudioStream &input, st_volume_t vol_l, st_volume_t vol_r); -extern "C" void ARM_SimpleRate_S(AudioStream &input, +extern "C" st_sample_t *ARM_SimpleRate_S( + AudioStream &input, int (*fn)(Audio::AudioStream&,int16*,int), SimpleRateDetails *sr, st_sample_t *obuf, @@ -153,7 +155,8 @@ extern "C" void ARM_SimpleRate_S(AudioStream &input, st_volume_t vol_l, st_volume_t vol_r); -extern "C" void ARM_SimpleRate_R(AudioStream &input, +extern "C" st_sample_t *ARM_SimpleRate_R( + AudioStream &input, int (*fn)(Audio::AudioStream&,int16*,int), SimpleRateDetails *sr, st_sample_t *obuf, @@ -178,23 +181,25 @@ int SimpleRateConverter::flow(AudioStream &input, st_samp fprintf(stderr, "Simple st=%d rev=%d\n", stereo, reverseStereo); fflush(stderr); #endif + st_sample_t *ostart = obuf; + if (!stereo) { - ARM_SimpleRate_M(input, - &SimpleRate_readFudge, - &sr, - obuf, osamp, vol_l, vol_r); + obuf = ARM_SimpleRate_M(input, + &SimpleRate_readFudge, + &sr, + obuf, osamp, vol_l, vol_r); } else if (reverseStereo) { - ARM_SimpleRate_R(input, - &SimpleRate_readFudge, - &sr, - obuf, osamp, vol_l, vol_r); + obuf = ARM_SimpleRate_R(input, + &SimpleRate_readFudge, + &sr, + obuf, osamp, vol_l, vol_r); } else { - ARM_SimpleRate_S(input, - &SimpleRate_readFudge, - &sr, - obuf, osamp, vol_l, vol_r); + obuf = ARM_SimpleRate_S(input, + &SimpleRate_readFudge, + &sr, + obuf, osamp, vol_l, vol_r); } - return (ST_SUCCESS); + return (obuf-ostart)/2; } /** @@ -236,7 +241,8 @@ extern "C" { #endif } -extern "C" void ARM_LinearRate_M(AudioStream &input, +extern "C" st_sample_t *ARM_LinearRate_M( + AudioStream &input, int (*fn)(Audio::AudioStream&,int16*,int), LinearRateDetails *lr, st_sample_t *obuf, @@ -244,7 +250,8 @@ extern "C" void ARM_LinearRate_M(AudioStream &input, st_volume_t vol_l, st_volume_t vol_r); -extern "C" void ARM_LinearRate_S(AudioStream &input, +extern "C" st_sample_t *ARM_LinearRate_S( + AudioStream &input, int (*fn)(Audio::AudioStream&,int16*,int), LinearRateDetails *lr, st_sample_t *obuf, @@ -252,7 +259,8 @@ extern "C" void ARM_LinearRate_S(AudioStream &input, st_volume_t vol_l, st_volume_t vol_r); -extern "C" void ARM_LinearRate_R(AudioStream &input, +extern "C" st_sample_t *ARM_LinearRate_R( + AudioStream &input, int (*fn)(Audio::AudioStream&,int16*,int), LinearRateDetails *lr, st_sample_t *obuf, @@ -304,7 +312,7 @@ LinearRateConverter::LinearRateConverter(st_rate_t inrate /* * Processed signed long samples from ibuf to obuf. - * Return number of samples processed. + * Return number of sample pairs processed. */ template int LinearRateConverter::flow(AudioStream &input, st_sample_t *obuf, st_size_t osamp, st_volume_t vol_l, st_volume_t vol_r) { @@ -313,23 +321,25 @@ int LinearRateConverter::flow(AudioStream &input, st_samp fprintf(stderr, "Linear st=%d rev=%d\n", stereo, reverseStereo); fflush(stderr); #endif + st_sample_t *ostart = obuf; + if (!stereo) { - ARM_LinearRate_M(input, - &SimpleRate_readFudge, - &lr, - obuf, osamp, vol_l, vol_r); + obuf = ARM_LinearRate_M(input, + &SimpleRate_readFudge, + &lr, + obuf, osamp, vol_l, vol_r); } else if (reverseStereo) { - ARM_LinearRate_R(input, - &SimpleRate_readFudge, - &lr, - obuf, osamp, vol_l, vol_r); + obuf = ARM_LinearRate_R(input, + &SimpleRate_readFudge, + &lr, + obuf, osamp, vol_l, vol_r); } else { - ARM_LinearRate_S(input, - &SimpleRate_readFudge, - &lr, - obuf, osamp, vol_l, vol_r); + obuf = ARM_LinearRate_S(input, + &SimpleRate_readFudge, + &lr, + obuf, osamp, vol_l, vol_r); } - return (ST_SUCCESS); + return (obuf-ostart)/2; } @@ -347,19 +357,22 @@ extern "C" { #endif } -extern "C" void ARM_CopyRate_M(st_size_t len, +extern "C" st_sample_t *ARM_CopyRate_M( + st_size_t len, st_sample_t *obuf, st_volume_t vol_l, st_volume_t vol_r, st_sample_t *_buffer); -extern "C" void ARM_CopyRate_S(st_size_t len, +extern "C" st_sample_t *ARM_CopyRate_S( + st_size_t len, st_sample_t *obuf, st_volume_t vol_l, st_volume_t vol_r, st_sample_t *_buffer); -extern "C" void ARM_CopyRate_R(st_size_t len, +extern "C" st_sample_t *ARM_CopyRate_R( + st_size_t len, st_sample_t *obuf, st_volume_t vol_l, st_volume_t vol_r, @@ -384,6 +397,7 @@ fprintf(stderr, "Copy st=%d rev=%d\n", stereo, reverseStereo); fflush(stderr); #endif st_size_t len; + st_sample_t *ostart = obuf; if (stereo) osamp *= 2; @@ -398,17 +412,17 @@ fflush(stderr); // Read up to 'osamp' samples into our temporary buffer len = input.readBuffer(_buffer, osamp); if (len <= 0) - return (ST_SUCCESS); + return 0; // Mix the data into the output buffer if (stereo && reverseStereo) - ARM_CopyRate_R(len, obuf, vol_l, vol_r, _buffer); + obuf = ARM_CopyRate_R(len, obuf, vol_l, vol_r, _buffer); else if (stereo) - ARM_CopyRate_S(len, obuf, vol_l, vol_r, _buffer); + obuf = ARM_CopyRate_S(len, obuf, vol_l, vol_r, _buffer); else - ARM_CopyRate_M(len, obuf, vol_l, vol_r, _buffer); + obuf = ARM_CopyRate_M(len, obuf, vol_l, vol_r, _buffer); - return (ST_SUCCESS); + return (obuf-ostart)/2; } virtual int drain(st_sample_t *obuf, st_size_t osamp, st_volume_t vol) { return (ST_SUCCESS); diff --git a/sound/rate_arm_asm.s b/sound/rate_arm_asm.s index 9731434e8e..a0e116f8f7 100644 --- a/sound/rate_arm_asm.s +++ b/sound/rate_arm_asm.s @@ -72,6 +72,8 @@ CopyRate_M_loop: SUBS r0,r0,#1 @ len-- BGT CopyRate_M_loop @ and loop + MOV r0, r1 @ return obuf + LDMFD r13!,{r4-r7,PC} _ARM_CopyRate_S: @@ -108,6 +110,8 @@ CopyRate_S_loop: SUBS r0,r0,#2 @ len -= 2 BGT CopyRate_S_loop @ and loop + MOV r0, r1 @ return obuf + LDMFD r13!,{r4-r7,PC} _ARM_CopyRate_R: @@ -144,6 +148,8 @@ CopyRate_R_loop: SUBS r0,r0,#2 @ len -= 2 BGT CopyRate_R_loop @ and loop + MOV r0, r1 @ return obuf + LDMFD r13!,{r4-r7,PC} _ARM_SimpleRate_M: @@ -199,6 +205,9 @@ SimpleRate_M_end: LDR r14,[r13,#8] @ r14 = sr ADD r13,r13,#12 @ Skip over r0-r2 on stack STMIA r14,{r0,r1,r2} @ Store back updated values + + MOV r0, r3 @ return obuf + LDMFD r13!,{r4-r8,r10-r11,PC} SimpleRate_M_read: LDR r0, [r13,#8] @ r0 = sr (8 = 4*2) @@ -283,6 +292,7 @@ SimpleRate_S_end: LDR r14,[r13,#8] @ r14 = sr ADD r13,r13,#12 @ skip over r0-r2 on stack STMIA r14,{r0,r1,r2} @ store back updated values + MOV r0, r3 @ return obuf LDMFD r13!,{r4-r8,r10-r11,PC} SimpleRate_S_read: LDR r0, [r13,#8] @ r0 = sr (8 = 4*2) @@ -367,6 +377,7 @@ SimpleRate_R_end: LDR r14,[r13,#8] @ r14 = sr ADD r13,r13,#12 @ Skip over r0-r2 on stack STMIA r14,{r0,r1,r2} @ Store back updated values + MOV r0, r3 @ return obuf LDMFD r13!,{r4-r8,r10-r11,PC} SimpleRate_R_read: LDR r0, [r13,#8] @ r0 = sr (8 = 4*2) @@ -469,6 +480,7 @@ LinearRate_M_part2: LinearRate_M_end: ADD r13,r13,#8 STMIA r2,{r0,r1,r8} + MOV r0, r3 @ return obuf LDMFD r13!,{r4-r11,PC} LinearRate_M_read: ADD r0, r2, #28 @ r0 = inPtr = inBuf @@ -576,6 +588,7 @@ LinearRate_S_part2: LinearRate_S_end: ADD r13,r13,#8 STMIA r2,{r0,r1,r8} + MOV r0, r3 @ return obuf LDMFD r13!,{r4-r11,PC} LinearRate_S_read: ADD r0, r2, #28 @ r0 = inPtr = inBuf @@ -680,6 +693,7 @@ LinearRate_R_part2: LinearRate_R_end: ADD r13,r13,#8 STMIA r2,{r0,r1,r8} + MOV r0, r3 @ return obuf LDMFD r13!,{r4-r11,PC} LinearRate_R_read: ADD r0, r2, #28 @ r0 = inPtr = inBuf -- cgit v1.2.3