AudioFlinger: Improve effect compatibility with RAW and FAST
Effects without process function now are allowed with RAW
and FAST playback and record tracks.
Bug: 32053844
Change-Id: I58064eb2c357043c2da1a781a20988f42570d97e
diff --git a/services/audioflinger/Effects.cpp b/services/audioflinger/Effects.cpp
index aedde69..9711f2d 100644
--- a/services/audioflinger/Effects.cpp
+++ b/services/audioflinger/Effects.cpp
@@ -2032,15 +2032,49 @@
}
}
-bool AudioFlinger::EffectChain::hasSoftwareEffect() const
+void AudioFlinger::EffectChain::checkOutputFlagCompatibility(audio_output_flags_t *flags) const
+{
+ if ((*flags & AUDIO_OUTPUT_FLAG_RAW) != 0 && !isRawCompatible()) {
+ *flags = (audio_output_flags_t)(*flags & ~AUDIO_OUTPUT_FLAG_RAW);
+ }
+ if ((*flags & AUDIO_OUTPUT_FLAG_FAST) != 0 && !isFastCompatible()) {
+ *flags = (audio_output_flags_t)(*flags & ~AUDIO_OUTPUT_FLAG_FAST);
+ }
+}
+
+void AudioFlinger::EffectChain::checkInputFlagCompatibility(audio_input_flags_t *flags) const
+{
+ if ((*flags & AUDIO_INPUT_FLAG_RAW) != 0 && !isRawCompatible()) {
+ *flags = (audio_input_flags_t)(*flags & ~AUDIO_INPUT_FLAG_RAW);
+ }
+ if ((*flags & AUDIO_INPUT_FLAG_FAST) != 0 && !isFastCompatible()) {
+ *flags = (audio_input_flags_t)(*flags & ~AUDIO_INPUT_FLAG_FAST);
+ }
+}
+
+bool AudioFlinger::EffectChain::isRawCompatible() const
{
Mutex::Autolock _l(mLock);
- for (size_t i = 0; i < mEffects.size(); i++) {
- if (mEffects[i]->isImplementationSoftware()) {
- return true;
+ for (const auto &effect : mEffects) {
+ if (effect->isProcessImplemented()) {
+ return false;
}
}
- return false;
+ // Allow effects without processing.
+ return true;
+}
+
+bool AudioFlinger::EffectChain::isFastCompatible() const
+{
+ Mutex::Autolock _l(mLock);
+ for (const auto &effect : mEffects) {
+ if (effect->isProcessImplemented()
+ && effect->isImplementationSoftware()) {
+ return false;
+ }
+ }
+ // Allow effects without processing or hw accelerated effects.
+ return true;
}
// isCompatibleWithThread_l() must be called with thread->mLock held