aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Watts2010-01-05 21:56:13 +0000
committerRobin Watts2010-01-05 21:56:13 +0000
commit61c413e1149d56f491a6e66bf931755384ac58bf (patch)
tree7372a163e1d7deef99347a43defe2eeebff68b6c
parentd183420c8659181990dc8abf21ca9211473fd09e (diff)
downloadscummvm-rg350-61c413e1149d56f491a6e66bf931755384ac58bf.tar.gz
scummvm-rg350-61c413e1149d56f491a6e66bf931755384ac58bf.tar.bz2
scummvm-rg350-61c413e1149d56f491a6e66bf931755384ac58bf.zip
Update ARM version of rate filler code in line with LordHoto's change
in revision 47014. svn-id: r47051
-rw-r--r--sound/rate_arm.cpp96
-rw-r--r--sound/rate_arm_asm.s14
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<stereo, reverseStereo>::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<stereo, reverseStereo>::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<bool stereo, bool reverseStereo>
int LinearRateConverter<stereo, reverseStereo>::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<stereo, reverseStereo>::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