HapticGenerator: Use HapticBiquadFilter type
Allows greater control over Biquad implementation,
now templated on floating point type.
Test: atest SoundPoolHapticTest
Bug: 161393057
Change-Id: If0be9197251d38471dc73b2f604d966784701e30
diff --git a/media/libeffects/hapticgenerator/EffectHapticGenerator.cpp b/media/libeffects/hapticgenerator/EffectHapticGenerator.cpp
index 311e5ba..9b93659 100644
--- a/media/libeffects/hapticgenerator/EffectHapticGenerator.cpp
+++ b/media/libeffects/hapticgenerator/EffectHapticGenerator.cpp
@@ -108,7 +108,7 @@
void addBiquadFilter(
std::vector<std::function<void(float *, const float *, size_t)>> &processingChain,
struct HapticGeneratorProcessorsRecord &processorsRecord,
- std::shared_ptr<BiquadFilter> filter) {
+ std::shared_ptr<HapticBiquadFilter> filter) {
// The process chain captures the shared pointer of the filter in lambda.
// The process record will keep a shared pointer to the filter so that it is possible to access
// the filter outside of the process chain.
diff --git a/media/libeffects/hapticgenerator/EffectHapticGenerator.h b/media/libeffects/hapticgenerator/EffectHapticGenerator.h
index a5688de..57b4338 100644
--- a/media/libeffects/hapticgenerator/EffectHapticGenerator.h
+++ b/media/libeffects/hapticgenerator/EffectHapticGenerator.h
@@ -55,7 +55,7 @@
// A structure to keep all shared pointers for all processors in HapticGenerator.
struct HapticGeneratorProcessorsRecord {
- std::vector<std::shared_ptr<BiquadFilter>> filters;
+ std::vector<std::shared_ptr<HapticBiquadFilter>> filters;
std::vector<std::shared_ptr<Ramp>> ramps;
std::vector<std::shared_ptr<SlowEnvelope>> slowEnvs;
};
diff --git a/media/libeffects/hapticgenerator/Processors.cpp b/media/libeffects/hapticgenerator/Processors.cpp
index 179b5dc..3157b35 100644
--- a/media/libeffects/hapticgenerator/Processors.cpp
+++ b/media/libeffects/hapticgenerator/Processors.cpp
@@ -134,22 +134,22 @@
return coefficient;
}
-std::shared_ptr<BiquadFilter> createLPF(const float cornerFrequency,
+std::shared_ptr<HapticBiquadFilter> createLPF(const float cornerFrequency,
const float sampleRate,
const size_t channelCount) {
BiquadFilterCoefficients coefficient = lpfCoefs(cornerFrequency, sampleRate);
- return std::make_shared<BiquadFilter>(channelCount, coefficient);
+ return std::make_shared<HapticBiquadFilter>(channelCount, coefficient);
}
-std::shared_ptr<BiquadFilter> createLPF2(const float cornerFrequency,
+std::shared_ptr<HapticBiquadFilter> createLPF2(const float cornerFrequency,
const float sampleRate,
const size_t channelCount) {
BiquadFilterCoefficients coefficient = lpfCoefs(cornerFrequency, sampleRate);
- return std::make_shared<BiquadFilter>(
+ return std::make_shared<HapticBiquadFilter>(
channelCount, cascadeFirstOrderFilters(coefficient, coefficient));
}
-std::shared_ptr<BiquadFilter> createHPF2(const float cornerFrequency,
+std::shared_ptr<HapticBiquadFilter> createHPF2(const float cornerFrequency,
const float sampleRate,
const size_t channelCount) {
BiquadFilterCoefficients coefficient;
@@ -162,7 +162,7 @@
coefficient[2] = 0.0f;
coefficient[3] = -realPoleZ;
coefficient[4] = 0.0f;
- return std::make_shared<BiquadFilter>(
+ return std::make_shared<HapticBiquadFilter>(
channelCount, cascadeFirstOrderFilters(coefficient, coefficient));
}
@@ -178,24 +178,24 @@
return coefficient;
}
-std::shared_ptr<BiquadFilter> createAPF(const float cornerFrequency,
+std::shared_ptr<HapticBiquadFilter> createAPF(const float cornerFrequency,
const float sampleRate,
const size_t channelCount) {
BiquadFilterCoefficients coefficient = apfCoefs(cornerFrequency, sampleRate);
- return std::make_shared<BiquadFilter>(channelCount, coefficient);
+ return std::make_shared<HapticBiquadFilter>(channelCount, coefficient);
}
-std::shared_ptr<BiquadFilter> createAPF2(const float cornerFrequency1,
+std::shared_ptr<HapticBiquadFilter> createAPF2(const float cornerFrequency1,
const float cornerFrequency2,
const float sampleRate,
const size_t channelCount) {
BiquadFilterCoefficients coefs1 = apfCoefs(cornerFrequency1, sampleRate);
BiquadFilterCoefficients coefs2 = apfCoefs(cornerFrequency2, sampleRate);
- return std::make_shared<BiquadFilter>(
+ return std::make_shared<HapticBiquadFilter>(
channelCount, cascadeFirstOrderFilters(coefs1, coefs2));
}
-std::shared_ptr<BiquadFilter> createBPF(const float ringingFrequency,
+std::shared_ptr<HapticBiquadFilter> createBPF(const float ringingFrequency,
const float q,
const float sampleRate,
const size_t channelCount) {
@@ -207,10 +207,10 @@
coefficient[2] = 0.0f;
coefficient[3] = -2 * real;
coefficient[4] = real * real + img * img;
- return std::make_shared<BiquadFilter>(channelCount, coefficient);
+ return std::make_shared<HapticBiquadFilter>(channelCount, coefficient);
}
-std::shared_ptr<BiquadFilter> createBSF(const float ringingFrequency,
+std::shared_ptr<HapticBiquadFilter> createBSF(const float ringingFrequency,
const float zq,
const float pq,
const float sampleRate,
@@ -228,7 +228,7 @@
coefficient[2] = zeroCoeff2 * norm;
coefficient[3] = poleCoeff1;
coefficient[4] = poleCoeff2;
- return std::make_shared<BiquadFilter>(channelCount, coefficient);
+ return std::make_shared<HapticBiquadFilter>(channelCount, coefficient);
}
} // namespace android::audio_effect::haptic_generator
diff --git a/media/libeffects/hapticgenerator/Processors.h b/media/libeffects/hapticgenerator/Processors.h
index e14458b..5cf0557 100644
--- a/media/libeffects/hapticgenerator/Processors.h
+++ b/media/libeffects/hapticgenerator/Processors.h
@@ -24,7 +24,7 @@
#include <audio_utils/BiquadFilter.h>
-using android::audio_utils::BiquadFilter;
+using HapticBiquadFilter = android::audio_utils::BiquadFilter<float>;
using BiquadFilterCoefficients = std::array<float, android::audio_utils::kBiquadNumCoefs>;
namespace android::audio_effect::haptic_generator {
@@ -51,7 +51,7 @@
void clear();
private:
- const std::shared_ptr<BiquadFilter> mLpf;
+ const std::shared_ptr<HapticBiquadFilter> mLpf;
std::vector<float> mLpfInBuffer;
std::vector<float> mLpfOutBuffer;
const float mNormalizationPower;
@@ -64,36 +64,36 @@
BiquadFilterCoefficients cascadeFirstOrderFilters(const BiquadFilterCoefficients &coefs1,
const BiquadFilterCoefficients &coefs2);
-std::shared_ptr<BiquadFilter> createLPF(const float cornerFrequency,
+std::shared_ptr<HapticBiquadFilter> createLPF(const float cornerFrequency,
const float sampleRate,
const size_t channelCount);
// Create two cascaded LPF with same corner frequency.
-std::shared_ptr<BiquadFilter> createLPF2(const float cornerFrequency,
+std::shared_ptr<HapticBiquadFilter> createLPF2(const float cornerFrequency,
const float sampleRate,
const size_t channelCount);
// Create two cascaded HPF with same corner frequency.
-std::shared_ptr<BiquadFilter> createHPF2(const float cornerFrequency,
+std::shared_ptr<HapticBiquadFilter> createHPF2(const float cornerFrequency,
const float sampleRate,
const size_t channelCount);
-std::shared_ptr<BiquadFilter> createAPF(const float cornerFrequency,
+std::shared_ptr<HapticBiquadFilter> createAPF(const float cornerFrequency,
const float sampleRate,
const size_t channelCount);
// Create two cascaded APF with two different corner frequency.
-std::shared_ptr<BiquadFilter> createAPF2(const float cornerFrequency1,
+std::shared_ptr<HapticBiquadFilter> createAPF2(const float cornerFrequency1,
const float cornerFrequency2,
const float sampleRate,
const size_t channelCount);
-std::shared_ptr<BiquadFilter> createBPF(const float ringingFrequency,
+std::shared_ptr<HapticBiquadFilter> createBPF(const float ringingFrequency,
const float q,
const float sampleRate,
const size_t channelCount);
-std::shared_ptr<BiquadFilter> createBSF(const float ringingFrequency,
+std::shared_ptr<HapticBiquadFilter> createBSF(const float ringingFrequency,
const float zq,
const float pq,
const float sampleRate,