IEffectSend.cpp revision 61ac0ade16f84d877dfd8d0e984eb203d4a2901d
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
2161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic struct EnableLevel *getEnableLevel(IEffectSend *this,
2261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    const void *pAuxEffect)
2361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
2461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    COutputMix *outputMix = this->mOutputMix;
2561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    // Make sure the sink for this player is an output mix
2661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten#if 0 // not necessary
2761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    if (NULL == outputMix)
2861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten        return NULL;
2961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten#endif
3061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    if (pAuxEffect == &outputMix->mEnvironmentalReverb)
3161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten        return &this->mEnableLevels[AUX_ENVIRONMENTALREVERB];
3261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    if (pAuxEffect == &outputMix->mPresetReverb)
3361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten        return &this->mEnableLevels[AUX_PRESETREVERB];
3461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    return NULL;
3561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten#if 0 // App couldn't have an interface for effect without exposure
3661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    unsigned interfaceMask = 1 << MPH_to_OutputMix[AUX_to_MPH[aux]];
3761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    if (outputMix->mExposedMask & interfaceMask)
3861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
3961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten#endif
4061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
4161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
4261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IEffectSend_EnableEffectSend(SLEffectSendItf self,
4361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    const void *pAuxEffect, SLboolean enable, SLmillibel initialLevel)
4461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
4561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IEffectSend *this = (IEffectSend *) self;
4661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    struct EnableLevel *enableLevel = getEnableLevel(this, pAuxEffect);
4761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    if (NULL == enableLevel)
4861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten        return SL_RESULT_PARAMETER_INVALID;
4961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_lock_exclusive(this);
5061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    enableLevel->mEnable = enable;
5161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    enableLevel->mSendLevel = initialLevel;
5261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_unlock_exclusive(this);
5361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    return SL_RESULT_SUCCESS;
5461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
5561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
5661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IEffectSend_IsEnabled(SLEffectSendItf self,
5761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    const void *pAuxEffect, SLboolean *pEnable)
5861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
5961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    if (NULL == pEnable)
6061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten        return SL_RESULT_PARAMETER_INVALID;
6161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IEffectSend *this = (IEffectSend *) self;
6261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    struct EnableLevel *enableLevel = getEnableLevel(this, pAuxEffect);
6361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    if (NULL == enableLevel)
6461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten        return SL_RESULT_PARAMETER_INVALID;
6561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_lock_peek(this);
6661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLboolean enable = enableLevel->mEnable;
6761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_unlock_peek(this);
6861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    *pEnable = enable;
6961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    return SL_RESULT_SUCCESS;
7061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
7161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
7261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IEffectSend_SetDirectLevel(SLEffectSendItf self,
7361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLmillibel directLevel)
7461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
7561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IEffectSend *this = (IEffectSend *) self;
7661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_lock_poke(this);
7761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    this->mDirectLevel = directLevel;
7861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_unlock_poke(this);
7961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    return SL_RESULT_SUCCESS;
8061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
8161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
8261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IEffectSend_GetDirectLevel(SLEffectSendItf self,
8361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLmillibel *pDirectLevel)
8461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
8561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    if (NULL == pDirectLevel)
8661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten        return SL_RESULT_PARAMETER_INVALID;
8761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IEffectSend *this = (IEffectSend *) self;
8861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_lock_peek(this);
8961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLmillibel directLevel = this->mDirectLevel;
9061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_unlock_peek(this);
9161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    *pDirectLevel = directLevel;
9261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    return SL_RESULT_SUCCESS;
9361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
9461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
9561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IEffectSend_SetSendLevel(SLEffectSendItf self,
9661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    const void *pAuxEffect, SLmillibel sendLevel)
9761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
9861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IEffectSend *this = (IEffectSend *) self;
9961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    struct EnableLevel *enableLevel = getEnableLevel(this, pAuxEffect);
10061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    if (NULL == enableLevel)
10161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten        return SL_RESULT_PARAMETER_INVALID;
10261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    // EnableEffectSend is exclusive, so this has to be also
10361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_lock_exclusive(this);
10461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    enableLevel->mSendLevel = sendLevel;
10561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_unlock_exclusive(this);
10661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    return SL_RESULT_SUCCESS;
10761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
10861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
10961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IEffectSend_GetSendLevel(SLEffectSendItf self,
11061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    const void *pAuxEffect, SLmillibel *pSendLevel)
11161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
11261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    if (NULL == pSendLevel)
11361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten        return SL_RESULT_PARAMETER_INVALID;
11461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IEffectSend *this = (IEffectSend *) self;
11561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    struct EnableLevel *enableLevel = getEnableLevel(this, pAuxEffect);
11661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    if (NULL == enableLevel)
11761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten        return SL_RESULT_PARAMETER_INVALID;
11861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_lock_peek(this);
11961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLmillibel sendLevel = enableLevel->mSendLevel;
12061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_unlock_peek(this);
12161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    *pSendLevel = sendLevel;
12261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    return SL_RESULT_SUCCESS;
12361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
12461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
12561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic const struct SLEffectSendItf_ IEffectSend_Itf = {
12661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IEffectSend_EnableEffectSend,
12761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IEffectSend_IsEnabled,
12861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IEffectSend_SetDirectLevel,
12961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IEffectSend_GetDirectLevel,
13061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IEffectSend_SetSendLevel,
13161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IEffectSend_GetSendLevel
13261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten};
13361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
13461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenvoid IEffectSend_init(void *self)
13561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
13661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IEffectSend *this = (IEffectSend *) self;
13761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    this->mItf = &IEffectSend_Itf;
13861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten#ifndef NDEBUG
13961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    this->mOutputMix = NULL; // FIXME wrong
14061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    this->mDirectLevel = 0;
14161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    this->mEnableLevels[AUX_ENVIRONMENTALREVERB].mEnable = SL_BOOLEAN_FALSE;
14261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    this->mEnableLevels[AUX_ENVIRONMENTALREVERB].mSendLevel = 0;
14361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    this->mEnableLevels[AUX_PRESETREVERB].mEnable = SL_BOOLEAN_FALSE;
14461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    this->mEnableLevels[AUX_PRESETREVERB].mSendLevel = 0;
14561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten#endif
14661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
147