IEffectSend.c revision d2a7f0d6883a6d3835642e7b282f05ed1c54fe63
161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten/*
261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * Copyright (C) 2010 The Android Open Source Project
361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten *
461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * you may not use this file except in compliance with the License.
661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * You may obtain a copy of the License at
761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten *
861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten *
1061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * Unless required by applicable law or agreed to in writing, software
1161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
1261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * See the License for the specific language governing permissions and
1461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * limitations under the License.
1561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten */
1661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
1761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten/* EffectSend implementation */
1861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
1961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten#include "sles_allinclusive.h"
2061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
21d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic struct EnableLevel *getEnableLevel(IEffectSend *this, const void *pAuxEffect)
2261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
2361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    COutputMix *outputMix = this->mOutputMix;
2461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    // Make sure the sink for this player is an output mix
2561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten#if 0 // not necessary
2661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    if (NULL == outputMix)
2761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten        return NULL;
2861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten#endif
2961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    if (pAuxEffect == &outputMix->mEnvironmentalReverb)
3061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten        return &this->mEnableLevels[AUX_ENVIRONMENTALREVERB];
3161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    if (pAuxEffect == &outputMix->mPresetReverb)
3261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten        return &this->mEnableLevels[AUX_PRESETREVERB];
3361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    return NULL;
3461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten#if 0 // App couldn't have an interface for effect without exposure
3561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    unsigned interfaceMask = 1 << MPH_to_OutputMix[AUX_to_MPH[aux]];
3661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    if (outputMix->mExposedMask & interfaceMask)
3761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
3861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten#endif
3961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
4061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
4161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IEffectSend_EnableEffectSend(SLEffectSendItf self,
4261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    const void *pAuxEffect, SLboolean enable, SLmillibel initialLevel)
4361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
44d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    if (!((SL_MILLIBEL_MIN <= initialLevel) && (initialLevel <= 0)))
45d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
4661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IEffectSend *this = (IEffectSend *) self;
4761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    struct EnableLevel *enableLevel = getEnableLevel(this, pAuxEffect);
4861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    if (NULL == enableLevel)
4961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten        return SL_RESULT_PARAMETER_INVALID;
5061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_lock_exclusive(this);
51d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    enableLevel->mEnable = SL_BOOLEAN_FALSE != enable; // normalize
5261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    enableLevel->mSendLevel = initialLevel;
5361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_unlock_exclusive(this);
5461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    return SL_RESULT_SUCCESS;
5561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
5661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
5761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IEffectSend_IsEnabled(SLEffectSendItf self,
5861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    const void *pAuxEffect, SLboolean *pEnable)
5961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
6061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    if (NULL == pEnable)
6161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten        return SL_RESULT_PARAMETER_INVALID;
6261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IEffectSend *this = (IEffectSend *) self;
6361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    struct EnableLevel *enableLevel = getEnableLevel(this, pAuxEffect);
6461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    if (NULL == enableLevel)
6561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten        return SL_RESULT_PARAMETER_INVALID;
6661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_lock_peek(this);
6761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLboolean enable = enableLevel->mEnable;
6861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_unlock_peek(this);
6961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    *pEnable = enable;
7061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    return SL_RESULT_SUCCESS;
7161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
7261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
73d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IEffectSend_SetDirectLevel(SLEffectSendItf self, SLmillibel directLevel)
7461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
75d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    if (!((SL_MILLIBEL_MIN <= directLevel) && (directLevel <= 0)))
76d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
7761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IEffectSend *this = (IEffectSend *) self;
7861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_lock_poke(this);
7961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    this->mDirectLevel = directLevel;
8061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_unlock_poke(this);
8161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    return SL_RESULT_SUCCESS;
8261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
8361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
84d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IEffectSend_GetDirectLevel(SLEffectSendItf self, SLmillibel *pDirectLevel)
8561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
8661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    if (NULL == pDirectLevel)
8761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten        return SL_RESULT_PARAMETER_INVALID;
8861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IEffectSend *this = (IEffectSend *) self;
8961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_lock_peek(this);
9061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLmillibel directLevel = this->mDirectLevel;
9161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_unlock_peek(this);
9261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    *pDirectLevel = directLevel;
9361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    return SL_RESULT_SUCCESS;
9461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
9561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
96d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IEffectSend_SetSendLevel(SLEffectSendItf self, const void *pAuxEffect, SLmillibel sendLevel)
9761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
98d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    if (!((SL_MILLIBEL_MIN <= sendLevel) && (sendLevel <= 0)))
99d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
10061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IEffectSend *this = (IEffectSend *) self;
10161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    struct EnableLevel *enableLevel = getEnableLevel(this, pAuxEffect);
10261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    if (NULL == enableLevel)
10361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten        return SL_RESULT_PARAMETER_INVALID;
10461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    // EnableEffectSend is exclusive, so this has to be also
10561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_lock_exclusive(this);
10661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    enableLevel->mSendLevel = sendLevel;
10761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_unlock_exclusive(this);
10861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    return SL_RESULT_SUCCESS;
10961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
11061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
111d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IEffectSend_GetSendLevel(SLEffectSendItf self, const void *pAuxEffect, SLmillibel *pSendLevel)
11261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
11361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    if (NULL == pSendLevel)
11461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten        return SL_RESULT_PARAMETER_INVALID;
11561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IEffectSend *this = (IEffectSend *) self;
11661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    struct EnableLevel *enableLevel = getEnableLevel(this, pAuxEffect);
11761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    if (NULL == enableLevel)
11861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten        return SL_RESULT_PARAMETER_INVALID;
11961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_lock_peek(this);
12061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLmillibel sendLevel = enableLevel->mSendLevel;
12161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_unlock_peek(this);
12261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    *pSendLevel = sendLevel;
12361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    return SL_RESULT_SUCCESS;
12461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
12561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
12661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic const struct SLEffectSendItf_ IEffectSend_Itf = {
12761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IEffectSend_EnableEffectSend,
12861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IEffectSend_IsEnabled,
12961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IEffectSend_SetDirectLevel,
13061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IEffectSend_GetDirectLevel,
13161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IEffectSend_SetSendLevel,
13261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IEffectSend_GetSendLevel
13361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten};
13461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
13561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenvoid IEffectSend_init(void *self)
13661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
13761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IEffectSend *this = (IEffectSend *) self;
13861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    this->mItf = &IEffectSend_Itf;
13961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    this->mOutputMix = NULL; // FIXME wrong
14061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    this->mDirectLevel = 0;
1410b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    // FIXME hard-coded array initialization should be loop on AUX_MAX
14261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    this->mEnableLevels[AUX_ENVIRONMENTALREVERB].mEnable = SL_BOOLEAN_FALSE;
143d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    this->mEnableLevels[AUX_ENVIRONMENTALREVERB].mSendLevel = SL_MILLIBEL_MIN;
14461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    this->mEnableLevels[AUX_PRESETREVERB].mEnable = SL_BOOLEAN_FALSE;
145d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    this->mEnableLevels[AUX_PRESETREVERB].mSendLevel = SL_MILLIBEL_MIN;
14661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
147