@ -1164,7 +1164,7 @@ void AudioFlinger::ThreadBase::checkSuspendOnEffectEnabled_l(const sp<EffectModu
// and applications not using global effects.
// Enabling post processing in AUDIO_SESSION_OUTPUT_STAGE session does not affect
// global effects
if ( ( sessionId ! = AUDIO_SESSION_OUTPUT_MIX ) & & ( sessionId ! = AUDIO_SESSION_OUTPUT_STAGE ) ) {
if ( ! audio_is_global_session ( sessionId ) ) {
setEffectSuspended_l ( NULL , enabled , AUDIO_SESSION_OUTPUT_MIX ) ;
}
}
@ -1179,8 +1179,9 @@ void AudioFlinger::ThreadBase::checkSuspendOnEffectEnabled_l(const sp<EffectModu
status_t AudioFlinger : : RecordThread : : checkEffectCompatibility_l (
const effect_descriptor_t * desc , audio_session_t sessionId )
{
// No global effect sessions on record threads
if ( sessionId = = AUDIO_SESSION_OUTPUT_MIX | | sessionId = = AUDIO_SESSION_OUTPUT_STAGE ) {
// No global output effect sessions on record threads
if ( sessionId = = AUDIO_SESSION_OUTPUT_MIX
| | sessionId = = AUDIO_SESSION_OUTPUT_STAGE ) {
ALOGW ( " checkEffectCompatibility_l(): global effect %s on record thread %s " ,
desc - > name , mThreadName ) ;
return BAD_VALUE ;
@ -1254,6 +1255,13 @@ status_t AudioFlinger::PlaybackThread::checkEffectCompatibility_l(
" on output stage session " , desc - > name ) ;
return BAD_VALUE ;
}
} else if ( sessionId = = AUDIO_SESSION_DEVICE ) {
// only post processing on output stage session
if ( ( desc - > flags & EFFECT_FLAG_TYPE_MASK ) ! = EFFECT_FLAG_TYPE_POST_PROC ) {
ALOGW ( " checkEffectCompatibility_l(): non post processing effect %s not allowed "
" on device session " , desc - > name ) ;
return BAD_VALUE ;
}
} else {
// no restriction on effects applied on non fast tracks
if ( ( hasAudioSession_l ( sessionId ) & ThreadBase : : FAST_SESSION ) = = 0 ) {
@ -1295,7 +1303,7 @@ status_t AudioFlinger::PlaybackThread::checkEffectCompatibility_l(
return BAD_VALUE ;
}
# endif
if ( ( sessionId = = AUDIO_SESSION_OUTPUT_STAGE ) | | ( sessionId = = AUDIO_SESSION_OUTPUT_MIX ) ) {
if ( audio_is_global_ session( sessionId ) ) {
ALOGW ( " checkEffectCompatibility_l(): global effect %s on DUPLICATING "
" thread %s " , desc - > name , mThreadName ) ;
return BAD_VALUE ;
@ -2051,6 +2059,7 @@ sp<AudioFlinger::PlaybackThread::Track> AudioFlinger::PlaybackThread::createTrac
{ // scope for mLock
Mutex : : Autolock _l ( mLock ) ;
for ( audio_session_t session : {
AUDIO_SESSION_DEVICE ,
AUDIO_SESSION_OUTPUT_STAGE ,
AUDIO_SESSION_OUTPUT_MIX ,
sessionId ,
@ -3103,7 +3112,7 @@ status_t AudioFlinger::PlaybackThread::addEffectChain_l(const sp<EffectChain>& c
halOutBuffer = halInBuffer ;
effect_buffer_t * buffer = reinterpret_cast < effect_buffer_t * > ( halInBuffer - > externalData ( ) ) ;
ALOGV ( " addEffectChain_l() %p on thread %p for session %d " , chain . get ( ) , this , session ) ;
if ( session > AUDIO_SESSION_OUTPUT_MIX ) {
if ( ! audio_is_global_session ( session ) ) {
// Only one effect chain can be present in direct output thread and it uses
// the sink buffer as input
if ( mType ! = DIRECT ) {
@ -3143,8 +3152,11 @@ status_t AudioFlinger::PlaybackThread::addEffectChain_l(const sp<EffectChain>& c
chain - > setThread ( this ) ;
chain - > setInBuffer ( halInBuffer ) ;
chain - > setOutBuffer ( halOutBuffer ) ;
// Effect chain for session AUDIO_SESSION_OUTPUT_STAGE is inserted at end of effect
// chains list in order to be processed last as it contains output stage effects.
// Effect chain for session AUDIO_SESSION_DEVICE is inserted at end of effect
// chains list in order to be processed last as it contains output device effects.
// Effect chain for session AUDIO_SESSION_OUTPUT_STAGE is inserted just before to apply post
// processing effects specific to an output stream before effects applied to all streams
// routed to a given device.
// Effect chain for session AUDIO_SESSION_OUTPUT_MIX is inserted before
// session AUDIO_SESSION_OUTPUT_STAGE to be processed
// after track specific effects and before output stage.
@ -3154,7 +3166,8 @@ status_t AudioFlinger::PlaybackThread::addEffectChain_l(const sp<EffectChain>& c
// chains list to be processed before output mix effects. Relative order between other
// sessions is not important.
static_assert ( AUDIO_SESSION_OUTPUT_MIX = = 0 & &
AUDIO_SESSION_OUTPUT_STAGE < AUDIO_SESSION_OUTPUT_MIX ,
AUDIO_SESSION_OUTPUT_STAGE < AUDIO_SESSION_OUTPUT_MIX & &
AUDIO_SESSION_DEVICE < AUDIO_SESSION_OUTPUT_STAGE ,
" audio_session_t constants misdefined " ) ;
size_t size = mEffectChains . size ( ) ;
size_t i = 0 ;
@ -9099,8 +9112,8 @@ status_t AudioFlinger::MmapThread::checkEffectCompatibility_l(
const effect_descriptor_t * desc , audio_session_t sessionId )
{
// No global effect sessions on mmap threads
if ( sessionId = = AUDIO_SESSION_OUTPUT_MIX | | sessionId = = AUDIO_SESSION_OUTPUT_STAGE ) {
ALOGW ( " checkEffectCompatibility_l(): global effect %s on record thread %s" ,
if ( audio_is_global_session( sessionId ) ) {
ALOGW ( " checkEffectCompatibility_l(): global effect %s on MMAP thread %s" ,
desc - > name , mThreadName ) ;
return BAD_VALUE ;
}
@ -9122,7 +9135,6 @@ status_t AudioFlinger::MmapThread::checkEffectCompatibility_l(
}
return NO_ERROR ;
}
void AudioFlinger : : MmapThread : : checkInvalidTracks_l ( )