Loading services/audioflinger/AudioFlinger.cpp +0 −8 Original line number Diff line number Diff line Loading @@ -2942,14 +2942,6 @@ sp<AudioFlinger::ThreadBase> AudioFlinger::openOutput_l(audio_module_handle_t mo return nullptr; } #ifndef MULTICHANNEL_EFFECT_CHAIN if (flags & AUDIO_OUTPUT_FLAG_SPATIALIZER) { ALOGE("openOutput_l() cannot create spatializer thread " "without #define MULTICHANNEL_EFFECT_CHAIN"); return nullptr; } #endif mHardwareStatus = AUDIO_HW_OUTPUT_OPEN; // FOR TESTING ONLY: Loading services/audioflinger/AudioFlinger.h +0 −5 Original line number Diff line number Diff line Loading @@ -596,13 +596,8 @@ private: }; // --- PlaybackThread --- #ifdef FLOAT_EFFECT_CHAIN #define EFFECT_BUFFER_FORMAT AUDIO_FORMAT_PCM_FLOAT using effect_buffer_t = float; #else #define EFFECT_BUFFER_FORMAT AUDIO_FORMAT_PCM_16_BIT using effect_buffer_t = int16_t; #endif #include "Threads.h" Loading services/audioflinger/Configuration.h +0 −11 Original line number Diff line number Diff line Loading @@ -41,15 +41,4 @@ // uncomment to log CPU statistics every n wall clock seconds //#define DEBUG_CPU_USAGE 10 // define FLOAT_EFFECT_CHAIN to request float effects (falls back to int16_t if unavailable) #define FLOAT_EFFECT_CHAIN #ifdef FLOAT_EFFECT_CHAIN // define FLOAT_AUX to process aux effect buffers in float (FLOAT_EFFECT_CHAIN must be defined) #define FLOAT_AUX // define MULTICHANNEL_EFFECT_CHAIN to allow multichannel effects (FLOAT_EFFECT_CHAIN defined) #define MULTICHANNEL_EFFECT_CHAIN #endif #endif // ANDROID_AUDIOFLINGER_CONFIGURATION_H services/audioflinger/Effects.cpp +3 −83 Original line number Diff line number Diff line Loading @@ -572,9 +572,7 @@ AudioFlinger::EffectModule::EffectModule(const sp<AudioFlinger::EffectCallbackIn mOffloaded(false), mAddedToHal(false), mIsOutput(false) #ifdef FLOAT_EFFECT_CHAIN , mSupportsFloat(false) #endif { ALOGV("Constructor %p pinned %d", this, pinned); int lStatus; Loading Loading @@ -693,31 +691,16 @@ void AudioFlinger::EffectModule::process() mConfig.inputCfg.buffer.frameCount, mConfig.outputCfg.buffer.frameCount); const auto accumulateInputToOutput = [this, safeInputOutputSampleCount]() { #ifdef FLOAT_EFFECT_CHAIN accumulate_float( mConfig.outputCfg.buffer.f32, mConfig.inputCfg.buffer.f32, safeInputOutputSampleCount); #else accumulate_i16( mConfig.outputCfg.buffer.s16, mConfig.inputCfg.buffer.s16, safeInputOutputSampleCount); #endif }; const auto copyInputToOutput = [this, safeInputOutputSampleCount]() { #ifdef FLOAT_EFFECT_CHAIN memcpy( mConfig.outputCfg.buffer.f32, mConfig.inputCfg.buffer.f32, safeInputOutputSampleCount * sizeof(*mConfig.outputCfg.buffer.f32)); #else memcpy( mConfig.outputCfg.buffer.s16, mConfig.inputCfg.buffer.s16, safeInputOutputSampleCount * sizeof(*mConfig.outputCfg.buffer.s16)); #endif }; if (isProcessEnabled()) { Loading @@ -726,35 +709,14 @@ void AudioFlinger::EffectModule::process() if (auxType) { // We overwrite the aux input buffer here and clear after processing. // aux input is always mono. #ifdef FLOAT_EFFECT_CHAIN if (mSupportsFloat) { #ifndef FLOAT_AUX // Do in-place float conversion for auxiliary effect input buffer. static_assert(sizeof(float) <= sizeof(int32_t), "in-place conversion requires sizeof(float) <= sizeof(int32_t)"); memcpy_to_float_from_q4_27( mConfig.inputCfg.buffer.f32, mConfig.inputCfg.buffer.s32, mConfig.inputCfg.buffer.frameCount); #endif // !FLOAT_AUX } else #endif // FLOAT_EFFECT_CHAIN { #ifdef FLOAT_AUX if (!mSupportsFloat) { memcpy_to_i16_from_float( mConfig.inputCfg.buffer.s16, mConfig.inputCfg.buffer.f32, mConfig.inputCfg.buffer.frameCount); #else memcpy_to_i16_from_q4_27( mConfig.inputCfg.buffer.s16, mConfig.inputCfg.buffer.s32, mConfig.inputCfg.buffer.frameCount); #endif } } #ifdef FLOAT_EFFECT_CHAIN sp<EffectBufferHalInterface> inBuffer = mInBuffer; sp<EffectBufferHalInterface> outBuffer = mOutBuffer; Loading Loading @@ -801,9 +763,7 @@ void AudioFlinger::EffectModule::process() outBuffer = mOutConversionBuffer; } } #endif ret = mEffectInterface->process(); #ifdef FLOAT_EFFECT_CHAIN if (!mSupportsFloat) { // convert output int16_t back to float. sp<EffectBufferHalInterface> target = mOutChannelCountRequested != outChannelCount Loading @@ -820,11 +780,8 @@ void AudioFlinger::EffectModule::process() sizeof(float), sizeof(float) * outChannelCount * mConfig.outputCfg.buffer.frameCount); } #endif } else { #ifdef FLOAT_EFFECT_CHAIN data_bypass: #endif if (!auxType /* aux effects do not require data bypass */ && mConfig.inputCfg.buffer.raw != mConfig.outputCfg.buffer.raw) { if (mConfig.outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE) { Loading @@ -843,13 +800,8 @@ void AudioFlinger::EffectModule::process() // clear auxiliary effect input buffer for next accumulation if (auxType) { #ifdef FLOAT_AUX const size_t size = mConfig.inputCfg.buffer.frameCount * inChannelCount * sizeof(float); #else const size_t size = mConfig.inputCfg.buffer.frameCount * inChannelCount * sizeof(int32_t); #endif memset(mConfig.inputCfg.buffer.raw, 0, size); } } else if ((mDescriptor.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_INSERT && Loading Loading @@ -904,23 +856,6 @@ status_t AudioFlinger::EffectModule::configure() ALOGV("Overriding auxiliary effect input channels %#x as MONO", mConfig.inputCfg.channels); } #ifndef MULTICHANNEL_EFFECT_CHAIN if (mConfig.outputCfg.channels != AUDIO_CHANNEL_OUT_STEREO) { mConfig.outputCfg.channels = AUDIO_CHANNEL_OUT_STEREO; ALOGV("Overriding auxiliary effect output channels %#x as STEREO", mConfig.outputCfg.channels); } #endif } else { #ifndef MULTICHANNEL_EFFECT_CHAIN // TODO: Update this logic when multichannel effects are implemented. // For offloaded tracks consider mono output as stereo for proper effect initialization if (channelMask == AUDIO_CHANNEL_OUT_MONO) { mConfig.inputCfg.channels = AUDIO_CHANNEL_OUT_STEREO; mConfig.outputCfg.channels = AUDIO_CHANNEL_OUT_STEREO; ALOGV("Overriding effect input and output as STEREO"); } #endif } if (isHapticGenerator()) { audio_channel_mask_t hapticChannelMask = callback->hapticChannelMask(); Loading Loading @@ -981,7 +916,6 @@ status_t AudioFlinger::EffectModule::configure() status = cmdStatus; } #ifdef MULTICHANNEL_EFFECT_CHAIN if (status != NO_ERROR && mIsOutput && (mConfig.inputCfg.channels != AUDIO_CHANNEL_OUT_STEREO Loading @@ -1006,9 +940,7 @@ status_t AudioFlinger::EffectModule::configure() status = cmdStatus; } } #endif #ifdef FLOAT_EFFECT_CHAIN if (status == NO_ERROR) { mSupportsFloat = true; } Loading @@ -1033,7 +965,6 @@ status_t AudioFlinger::EffectModule::configure() ALOGE("%s failed %d with int16_t (as well as float)", __func__, status); } } #endif if (status == NO_ERROR) { // Establish Buffer strategy Loading Loading @@ -1347,7 +1278,6 @@ void AudioFlinger::EffectModule::setInBuffer(const sp<EffectBufferHalInterface>& mInBuffer = buffer; mEffectInterface->setInBuffer(buffer); #ifdef FLOAT_EFFECT_CHAIN // aux effects do in place conversion to float - we don't allocate mInConversionBuffer. // Theoretically insert effects can also do in-place conversions (destroying // the original buffer) when the output buffer is identical to the input buffer, Loading Loading @@ -1379,7 +1309,6 @@ void AudioFlinger::EffectModule::setInBuffer(const sp<EffectBufferHalInterface>& ALOGE("%s cannot create mInConversionBuffer", __func__); } } #endif } void AudioFlinger::EffectModule::setOutBuffer(const sp<EffectBufferHalInterface>& buffer) { Loading @@ -1395,7 +1324,6 @@ void AudioFlinger::EffectModule::setOutBuffer(const sp<EffectBufferHalInterface> mOutBuffer = buffer; mEffectInterface->setOutBuffer(buffer); #ifdef FLOAT_EFFECT_CHAIN // Note: Any effect that does not accumulate does not need mOutConversionBuffer and // can do in-place conversion from int16_t to float. We don't optimize here. const uint32_t outChannelCount = Loading Loading @@ -1423,7 +1351,6 @@ void AudioFlinger::EffectModule::setOutBuffer(const sp<EffectBufferHalInterface> ALOGE("%s cannot create mOutConversionBuffer", __func__); } } #endif } status_t AudioFlinger::EffectModule::setVolume(uint32_t *left, uint32_t *right, bool controller) Loading Loading @@ -1719,15 +1646,12 @@ NO_THREAD_SAFETY_ANALYSIS // conditional try lock mConfig.outputCfg.format, formatToString((audio_format_t)mConfig.outputCfg.format).c_str()); #ifdef FLOAT_EFFECT_CHAIN result.appendFormat("\t\t- HAL buffers:\n" "\t\t\tIn(%s) InConversion(%s) Out(%s) OutConversion(%s)\n", dumpInOutBuffer(true /* isInput */, mInBuffer).c_str(), dumpInOutBuffer(true /* isInput */, mInConversionBuffer).c_str(), dumpInOutBuffer(false /* isInput */, mOutBuffer).c_str(), dumpInOutBuffer(false /* isInput */, mOutConversionBuffer).c_str()); #endif write(fd, result.string(), result.length()); Loading Loading @@ -2354,13 +2278,9 @@ status_t AudioFlinger::EffectChain::addEffect_ll(const sp<EffectModule>& effect) // calling the process in effect engine size_t numSamples = mEffectCallback->frameCount(); sp<EffectBufferHalInterface> halBuffer; #ifdef FLOAT_EFFECT_CHAIN status_t result = mEffectCallback->allocateHalBuffer( numSamples * sizeof(float), &halBuffer); #else status_t result = mEffectCallback->allocateHalBuffer( numSamples * sizeof(int32_t), &halBuffer); #endif if (result != OK) return result; effect->configure(); Loading services/audioflinger/Effects.h +0 −2 Original line number Diff line number Diff line Loading @@ -322,13 +322,11 @@ private: bool mAddedToHal; // effect has been added to the audio HAL bool mIsOutput; // direction of the AF thread #ifdef FLOAT_EFFECT_CHAIN bool mSupportsFloat; // effect supports float processing sp<EffectBufferHalInterface> mInConversionBuffer; // Buffers for HAL conversion if needed. sp<EffectBufferHalInterface> mOutConversionBuffer; uint32_t mInChannelCountRequested; uint32_t mOutChannelCountRequested; #endif class AutoLockReentrant { public: Loading Loading
services/audioflinger/AudioFlinger.cpp +0 −8 Original line number Diff line number Diff line Loading @@ -2942,14 +2942,6 @@ sp<AudioFlinger::ThreadBase> AudioFlinger::openOutput_l(audio_module_handle_t mo return nullptr; } #ifndef MULTICHANNEL_EFFECT_CHAIN if (flags & AUDIO_OUTPUT_FLAG_SPATIALIZER) { ALOGE("openOutput_l() cannot create spatializer thread " "without #define MULTICHANNEL_EFFECT_CHAIN"); return nullptr; } #endif mHardwareStatus = AUDIO_HW_OUTPUT_OPEN; // FOR TESTING ONLY: Loading
services/audioflinger/AudioFlinger.h +0 −5 Original line number Diff line number Diff line Loading @@ -596,13 +596,8 @@ private: }; // --- PlaybackThread --- #ifdef FLOAT_EFFECT_CHAIN #define EFFECT_BUFFER_FORMAT AUDIO_FORMAT_PCM_FLOAT using effect_buffer_t = float; #else #define EFFECT_BUFFER_FORMAT AUDIO_FORMAT_PCM_16_BIT using effect_buffer_t = int16_t; #endif #include "Threads.h" Loading
services/audioflinger/Configuration.h +0 −11 Original line number Diff line number Diff line Loading @@ -41,15 +41,4 @@ // uncomment to log CPU statistics every n wall clock seconds //#define DEBUG_CPU_USAGE 10 // define FLOAT_EFFECT_CHAIN to request float effects (falls back to int16_t if unavailable) #define FLOAT_EFFECT_CHAIN #ifdef FLOAT_EFFECT_CHAIN // define FLOAT_AUX to process aux effect buffers in float (FLOAT_EFFECT_CHAIN must be defined) #define FLOAT_AUX // define MULTICHANNEL_EFFECT_CHAIN to allow multichannel effects (FLOAT_EFFECT_CHAIN defined) #define MULTICHANNEL_EFFECT_CHAIN #endif #endif // ANDROID_AUDIOFLINGER_CONFIGURATION_H
services/audioflinger/Effects.cpp +3 −83 Original line number Diff line number Diff line Loading @@ -572,9 +572,7 @@ AudioFlinger::EffectModule::EffectModule(const sp<AudioFlinger::EffectCallbackIn mOffloaded(false), mAddedToHal(false), mIsOutput(false) #ifdef FLOAT_EFFECT_CHAIN , mSupportsFloat(false) #endif { ALOGV("Constructor %p pinned %d", this, pinned); int lStatus; Loading Loading @@ -693,31 +691,16 @@ void AudioFlinger::EffectModule::process() mConfig.inputCfg.buffer.frameCount, mConfig.outputCfg.buffer.frameCount); const auto accumulateInputToOutput = [this, safeInputOutputSampleCount]() { #ifdef FLOAT_EFFECT_CHAIN accumulate_float( mConfig.outputCfg.buffer.f32, mConfig.inputCfg.buffer.f32, safeInputOutputSampleCount); #else accumulate_i16( mConfig.outputCfg.buffer.s16, mConfig.inputCfg.buffer.s16, safeInputOutputSampleCount); #endif }; const auto copyInputToOutput = [this, safeInputOutputSampleCount]() { #ifdef FLOAT_EFFECT_CHAIN memcpy( mConfig.outputCfg.buffer.f32, mConfig.inputCfg.buffer.f32, safeInputOutputSampleCount * sizeof(*mConfig.outputCfg.buffer.f32)); #else memcpy( mConfig.outputCfg.buffer.s16, mConfig.inputCfg.buffer.s16, safeInputOutputSampleCount * sizeof(*mConfig.outputCfg.buffer.s16)); #endif }; if (isProcessEnabled()) { Loading @@ -726,35 +709,14 @@ void AudioFlinger::EffectModule::process() if (auxType) { // We overwrite the aux input buffer here and clear after processing. // aux input is always mono. #ifdef FLOAT_EFFECT_CHAIN if (mSupportsFloat) { #ifndef FLOAT_AUX // Do in-place float conversion for auxiliary effect input buffer. static_assert(sizeof(float) <= sizeof(int32_t), "in-place conversion requires sizeof(float) <= sizeof(int32_t)"); memcpy_to_float_from_q4_27( mConfig.inputCfg.buffer.f32, mConfig.inputCfg.buffer.s32, mConfig.inputCfg.buffer.frameCount); #endif // !FLOAT_AUX } else #endif // FLOAT_EFFECT_CHAIN { #ifdef FLOAT_AUX if (!mSupportsFloat) { memcpy_to_i16_from_float( mConfig.inputCfg.buffer.s16, mConfig.inputCfg.buffer.f32, mConfig.inputCfg.buffer.frameCount); #else memcpy_to_i16_from_q4_27( mConfig.inputCfg.buffer.s16, mConfig.inputCfg.buffer.s32, mConfig.inputCfg.buffer.frameCount); #endif } } #ifdef FLOAT_EFFECT_CHAIN sp<EffectBufferHalInterface> inBuffer = mInBuffer; sp<EffectBufferHalInterface> outBuffer = mOutBuffer; Loading Loading @@ -801,9 +763,7 @@ void AudioFlinger::EffectModule::process() outBuffer = mOutConversionBuffer; } } #endif ret = mEffectInterface->process(); #ifdef FLOAT_EFFECT_CHAIN if (!mSupportsFloat) { // convert output int16_t back to float. sp<EffectBufferHalInterface> target = mOutChannelCountRequested != outChannelCount Loading @@ -820,11 +780,8 @@ void AudioFlinger::EffectModule::process() sizeof(float), sizeof(float) * outChannelCount * mConfig.outputCfg.buffer.frameCount); } #endif } else { #ifdef FLOAT_EFFECT_CHAIN data_bypass: #endif if (!auxType /* aux effects do not require data bypass */ && mConfig.inputCfg.buffer.raw != mConfig.outputCfg.buffer.raw) { if (mConfig.outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE) { Loading @@ -843,13 +800,8 @@ void AudioFlinger::EffectModule::process() // clear auxiliary effect input buffer for next accumulation if (auxType) { #ifdef FLOAT_AUX const size_t size = mConfig.inputCfg.buffer.frameCount * inChannelCount * sizeof(float); #else const size_t size = mConfig.inputCfg.buffer.frameCount * inChannelCount * sizeof(int32_t); #endif memset(mConfig.inputCfg.buffer.raw, 0, size); } } else if ((mDescriptor.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_INSERT && Loading Loading @@ -904,23 +856,6 @@ status_t AudioFlinger::EffectModule::configure() ALOGV("Overriding auxiliary effect input channels %#x as MONO", mConfig.inputCfg.channels); } #ifndef MULTICHANNEL_EFFECT_CHAIN if (mConfig.outputCfg.channels != AUDIO_CHANNEL_OUT_STEREO) { mConfig.outputCfg.channels = AUDIO_CHANNEL_OUT_STEREO; ALOGV("Overriding auxiliary effect output channels %#x as STEREO", mConfig.outputCfg.channels); } #endif } else { #ifndef MULTICHANNEL_EFFECT_CHAIN // TODO: Update this logic when multichannel effects are implemented. // For offloaded tracks consider mono output as stereo for proper effect initialization if (channelMask == AUDIO_CHANNEL_OUT_MONO) { mConfig.inputCfg.channels = AUDIO_CHANNEL_OUT_STEREO; mConfig.outputCfg.channels = AUDIO_CHANNEL_OUT_STEREO; ALOGV("Overriding effect input and output as STEREO"); } #endif } if (isHapticGenerator()) { audio_channel_mask_t hapticChannelMask = callback->hapticChannelMask(); Loading Loading @@ -981,7 +916,6 @@ status_t AudioFlinger::EffectModule::configure() status = cmdStatus; } #ifdef MULTICHANNEL_EFFECT_CHAIN if (status != NO_ERROR && mIsOutput && (mConfig.inputCfg.channels != AUDIO_CHANNEL_OUT_STEREO Loading @@ -1006,9 +940,7 @@ status_t AudioFlinger::EffectModule::configure() status = cmdStatus; } } #endif #ifdef FLOAT_EFFECT_CHAIN if (status == NO_ERROR) { mSupportsFloat = true; } Loading @@ -1033,7 +965,6 @@ status_t AudioFlinger::EffectModule::configure() ALOGE("%s failed %d with int16_t (as well as float)", __func__, status); } } #endif if (status == NO_ERROR) { // Establish Buffer strategy Loading Loading @@ -1347,7 +1278,6 @@ void AudioFlinger::EffectModule::setInBuffer(const sp<EffectBufferHalInterface>& mInBuffer = buffer; mEffectInterface->setInBuffer(buffer); #ifdef FLOAT_EFFECT_CHAIN // aux effects do in place conversion to float - we don't allocate mInConversionBuffer. // Theoretically insert effects can also do in-place conversions (destroying // the original buffer) when the output buffer is identical to the input buffer, Loading Loading @@ -1379,7 +1309,6 @@ void AudioFlinger::EffectModule::setInBuffer(const sp<EffectBufferHalInterface>& ALOGE("%s cannot create mInConversionBuffer", __func__); } } #endif } void AudioFlinger::EffectModule::setOutBuffer(const sp<EffectBufferHalInterface>& buffer) { Loading @@ -1395,7 +1324,6 @@ void AudioFlinger::EffectModule::setOutBuffer(const sp<EffectBufferHalInterface> mOutBuffer = buffer; mEffectInterface->setOutBuffer(buffer); #ifdef FLOAT_EFFECT_CHAIN // Note: Any effect that does not accumulate does not need mOutConversionBuffer and // can do in-place conversion from int16_t to float. We don't optimize here. const uint32_t outChannelCount = Loading Loading @@ -1423,7 +1351,6 @@ void AudioFlinger::EffectModule::setOutBuffer(const sp<EffectBufferHalInterface> ALOGE("%s cannot create mOutConversionBuffer", __func__); } } #endif } status_t AudioFlinger::EffectModule::setVolume(uint32_t *left, uint32_t *right, bool controller) Loading Loading @@ -1719,15 +1646,12 @@ NO_THREAD_SAFETY_ANALYSIS // conditional try lock mConfig.outputCfg.format, formatToString((audio_format_t)mConfig.outputCfg.format).c_str()); #ifdef FLOAT_EFFECT_CHAIN result.appendFormat("\t\t- HAL buffers:\n" "\t\t\tIn(%s) InConversion(%s) Out(%s) OutConversion(%s)\n", dumpInOutBuffer(true /* isInput */, mInBuffer).c_str(), dumpInOutBuffer(true /* isInput */, mInConversionBuffer).c_str(), dumpInOutBuffer(false /* isInput */, mOutBuffer).c_str(), dumpInOutBuffer(false /* isInput */, mOutConversionBuffer).c_str()); #endif write(fd, result.string(), result.length()); Loading Loading @@ -2354,13 +2278,9 @@ status_t AudioFlinger::EffectChain::addEffect_ll(const sp<EffectModule>& effect) // calling the process in effect engine size_t numSamples = mEffectCallback->frameCount(); sp<EffectBufferHalInterface> halBuffer; #ifdef FLOAT_EFFECT_CHAIN status_t result = mEffectCallback->allocateHalBuffer( numSamples * sizeof(float), &halBuffer); #else status_t result = mEffectCallback->allocateHalBuffer( numSamples * sizeof(int32_t), &halBuffer); #endif if (result != OK) return result; effect->configure(); Loading
services/audioflinger/Effects.h +0 −2 Original line number Diff line number Diff line Loading @@ -322,13 +322,11 @@ private: bool mAddedToHal; // effect has been added to the audio HAL bool mIsOutput; // direction of the AF thread #ifdef FLOAT_EFFECT_CHAIN bool mSupportsFloat; // effect supports float processing sp<EffectBufferHalInterface> mInConversionBuffer; // Buffers for HAL conversion if needed. sp<EffectBufferHalInterface> mOutConversionBuffer; uint32_t mInChannelCountRequested; uint32_t mOutChannelCountRequested; #endif class AutoLockReentrant { public: Loading