aboutsummaryrefslogtreecommitdiff
path: root/audio/rate_arm.cpp
diff options
context:
space:
mode:
authorD G Turner2014-06-01 21:58:28 +0100
committerD G Turner2014-06-01 21:58:28 +0100
commit9003ce517ff9906b0288f9f7c02197fd091d4554 (patch)
tree3f203eec1009c31779219f77360c8ef1fff570c9 /audio/rate_arm.cpp
parent8f5a7cde2f99de9fef849b0ff688906f05f4643e (diff)
downloadscummvm-rg350-9003ce517ff9906b0288f9f7c02197fd091d4554.tar.gz
scummvm-rg350-9003ce517ff9906b0288f9f7c02197fd091d4554.tar.bz2
scummvm-rg350-9003ce517ff9906b0288f9f7c02197fd091d4554.zip
AUDIO: Support 96kHz audio rates in ARM assembler rate conversion.
This should be the same changes as fuzzie's previous commit to the C++ version.
Diffstat (limited to 'audio/rate_arm.cpp')
-rw-r--r--audio/rate_arm.cpp21
1 files changed, 16 insertions, 5 deletions
diff --git a/audio/rate_arm.cpp b/audio/rate_arm.cpp
index 4135cdd1af..371e615efd 100644
--- a/audio/rate_arm.cpp
+++ b/audio/rate_arm.cpp
@@ -68,6 +68,16 @@ namespace Audio {
*/
#define INTERMEDIATE_BUFFER_SIZE 512
+/**
+ * The default fractional type in frac.h (with 16 fractional bits) limits
+ * the rate conversion code to 65536Hz audio: we need to able to handle
+ * 96kHz audio, so we use fewer fractional bits in this code.
+ */
+enum {
+ FRAC_BITS_LOW = 15,
+ FRAC_ONE_LOW = (1L << FRAC_BITS_LOW),
+ FRAC_HALF_LOW = (1L << (FRAC_BITS_LOW-1))
+};
/**
* Audio rate converter based on simple resampling. Used when no
@@ -287,17 +297,18 @@ LinearRateConverter<stereo, reverseStereo>::LinearRateConverter(st_rate_t inrate
error("Input and Output rates must be different to use rate effect");
}
- if (inrate >= 65536 || outrate >= 65536) {
- error("rate effect can only handle rates < 65536");
+ if (inrate >= 131072 || outrate >= 131072) {
+ error("rate effect can only handle rates < 131072");
}
- lr.opos = FRAC_ONE;
+ lr.opos = FRAC_ONE_LOW;
/* increment */
- incr = (inrate << FRAC_BITS) / outrate;
+ incr = (inrate << FRAC_BITS_LOW) / outrate;
lr.opos_inc = incr;
+ // FIXME: Does 32768 here need changing to 65536 or 0? Compare to rate.cpp code...
lr.ilast[0] = lr.ilast[1] = 32768;
lr.icur[0] = lr.icur[1] = 0;
@@ -438,7 +449,7 @@ public:
*/
RateConverter *makeRateConverter(st_rate_t inrate, st_rate_t outrate, bool stereo, bool reverseStereo) {
if (inrate != outrate) {
- if ((inrate % outrate) == 0) {
+ if ((inrate % outrate) == 0 && (inrate < 65536)) {
if (stereo) {
if (reverseStereo)
return new SimpleRateConverter<true, true>(inrate, outrate);