@ -2949,16 +2949,74 @@ status_t AudioFlinger::queryEffect(uint32_t index, effect_descriptor_t *descript
}
status_t AudioFlinger : : getEffectDescriptor ( const effect_uuid_t * pUuid ,
effect_descriptor_t * descriptor ) const
const effect_uuid_t * pTypeUuid ,
uint32_t preferredTypeFlag ,
effect_descriptor_t * descriptor ) const
{
if ( pUuid = = NULL | | pTypeUuid = = NULL | | descriptor = = NULL ) {
return BAD_VALUE ;
}
Mutex : : Autolock _l ( mLock ) ;
if ( mEffectsFactoryHal . get ( ) ) {
return mEffectsFactoryHal - > getDescriptor ( pUuid , descriptor ) ;
} else {
if ( ! mEffectsFactoryHal . get ( ) ) {
return - ENODEV ;
}
}
status_t status = NO_ERROR ;
if ( ! EffectsFactoryHalInterface : : isNullUuid ( pUuid ) ) {
// If uuid is specified, request effect descriptor from that.
status = mEffectsFactoryHal - > getDescriptor ( pUuid , descriptor ) ;
} else if ( ! EffectsFactoryHalInterface : : isNullUuid ( pTypeUuid ) ) {
// If uuid is not specified, look for an available implementation
// of the required type instead.
// Use a temporary descriptor to avoid modifying |descriptor| in the failure case.
effect_descriptor_t desc ;
desc . flags = 0 ; // prevent compiler warning
uint32_t numEffects = 0 ;
status = mEffectsFactoryHal - > queryNumberEffects ( & numEffects ) ;
if ( status < 0 ) {
ALOGW ( " getEffectDescriptor() error %d from FactoryHal queryNumberEffects " , status ) ;
return status ;
}
bool found = false ;
for ( uint32_t i = 0 ; i < numEffects ; i + + ) {
status = mEffectsFactoryHal - > getDescriptor ( i , & desc ) ;
if ( status < 0 ) {
ALOGW ( " getEffectDescriptor() error %d from FactoryHal getDescriptor " , status ) ;
continue ;
}
if ( memcmp ( & desc . type , pTypeUuid , sizeof ( effect_uuid_t ) ) = = 0 ) {
// If matching type found save effect descriptor.
found = true ;
* descriptor = desc ;
// If there's no preferred flag or this descriptor matches the preferred
// flag, success! If this descriptor doesn't match the preferred
// flag, continue enumeration in case a better matching version of this
// effect type is available. Note that this means if no effect with a
// correct flag is found, the descriptor returned will correspond to the
// last effect that at least had a matching type uuid (if any).
if ( preferredTypeFlag = = EFFECT_FLAG_TYPE_MASK | |
( desc . flags & EFFECT_FLAG_TYPE_MASK ) = = preferredTypeFlag ) {
break ;
}
}
}
if ( ! found ) {
status = NAME_NOT_FOUND ;
ALOGW ( " getEffectDescriptor(): Effect not found by type. " ) ;
}
} else {
status = BAD_VALUE ;
ALOGE ( " getEffectDescriptor(): Either uuid or type uuid must be non-null UUIDs. " ) ;
}
return status ;
}
sp < IEffect > AudioFlinger : : createEffect (
effect_descriptor_t * pDesc ,
@ -3012,60 +3070,15 @@ sp<IEffect> AudioFlinger::createEffect(
}
{
if ( ! EffectsFactoryHalInterface : : isNullUuid ( & pDesc - > uuid ) ) {
// if uuid is specified, request effect descriptor
lStatus = mEffectsFactoryHal - > getDescriptor ( & pDesc - > uuid , & desc ) ;
if ( lStatus < 0 ) {
ALOGW ( " createEffect() error %d from EffectGetDescriptor " , lStatus ) ;
goto Exit ;
}
} else {
// if uuid is not specified, look for an available implementation
// of the required type in effect factory
if ( EffectsFactoryHalInterface : : isNullUuid ( & pDesc - > type ) ) {
ALOGW ( " createEffect() no effect type " ) ;
lStatus = BAD_VALUE ;
goto Exit ;
}
uint32_t numEffects = 0 ;
effect_descriptor_t d ;
d . flags = 0 ; // prevent compiler warning
bool found = false ;
lStatus = mEffectsFactoryHal - > queryNumberEffects ( & numEffects ) ;
if ( lStatus < 0 ) {
ALOGW ( " createEffect() error %d from EffectQueryNumberEffects " , lStatus ) ;
goto Exit ;
}
for ( uint32_t i = 0 ; i < numEffects ; i + + ) {
lStatus = mEffectsFactoryHal - > getDescriptor ( i , & desc ) ;
if ( lStatus < 0 ) {
ALOGW ( " createEffect() error %d from EffectQueryEffect " , lStatus ) ;
continue ;
}
if ( memcmp ( & desc . type , & pDesc - > type , sizeof ( effect_uuid_t ) ) = = 0 ) {
// If matching type found save effect descriptor. If the session is
// 0 and the effect is not auxiliary, continue enumeration in case
// an auxiliary version of this effect type is available
found = true ;
d = desc ;
if ( sessionId ! = AUDIO_SESSION_OUTPUT_MIX | |
( desc . flags & EFFECT_FLAG_TYPE_MASK ) = = EFFECT_FLAG_TYPE_AUXILIARY ) {
break ;
}
}
}
if ( ! found ) {
lStatus = BAD_VALUE ;
ALOGW ( " createEffect() effect not found " ) ;
goto Exit ;
}
// For same effect type, chose auxiliary version over insert version if
// connect to output mix (Compliance to OpenSL ES)
if ( sessionId = = AUDIO_SESSION_OUTPUT_MIX & &
( d . flags & EFFECT_FLAG_TYPE_MASK ) ! = EFFECT_FLAG_TYPE_AUXILIARY ) {
desc = d ;
}
// Get the full effect descriptor from the uuid/type.
// If the session is the output mix, prefer an auxiliary effect,
// otherwise no preference.
uint32_t preferredType = ( sessionId = = AUDIO_SESSION_OUTPUT_MIX ?
EFFECT_FLAG_TYPE_AUXILIARY : EFFECT_FLAG_TYPE_MASK ) ;
lStatus = getEffectDescriptor ( & pDesc - > uuid , & pDesc - > type , preferredType , & desc ) ;
if ( lStatus < 0 ) {
ALOGW ( " createEffect() error %d from getEffectDescriptor " , lStatus ) ;
goto Exit ;
}
// Do not allow auxiliary effects on a session different from 0 (output mix)