Home | History | Annotate | Download | only in itf
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /* Virtualizer implementation */
     18 
     19 #include "sles_allinclusive.h"
     20 #ifdef ANDROID
     21 #include <audio_effects/effect_virtualizer.h>
     22 #endif
     23 
     24 #define VIRTUALIZER_STRENGTH_MIN 0
     25 #define VIRTUALIZER_STRENGTH_MAX 1000
     26 
     27 
     28 #if defined(ANDROID)
     29 /**
     30  * returns true if this interface is not associated with an initialized Virtualizer effect
     31  */
     32 static inline bool NO_VIRTUALIZER(IVirtualizer* v) {
     33     return (v->mVirtualizerEffect == 0);
     34 }
     35 #endif
     36 
     37 
     38 static SLresult IVirtualizer_SetEnabled(SLVirtualizerItf self, SLboolean enabled)
     39 {
     40     SL_ENTER_INTERFACE
     41 
     42     IVirtualizer *thiz = (IVirtualizer *) self;
     43     interface_lock_exclusive(thiz);
     44     thiz->mEnabled = (SLboolean) enabled;
     45 #if !defined(ANDROID)
     46     result = SL_RESULT_SUCCESS;
     47 #else
     48     if (NO_VIRTUALIZER(thiz)) {
     49         result = SL_RESULT_CONTROL_LOST;
     50     } else {
     51         android::status_t status =
     52                 thiz->mVirtualizerEffect->setEnabled((bool) thiz->mEnabled);
     53         result = android_fx_statusToResult(status);
     54     }
     55 #endif
     56     interface_unlock_exclusive(thiz);
     57 
     58     SL_LEAVE_INTERFACE
     59 
     60 }
     61 
     62 
     63 static SLresult IVirtualizer_IsEnabled(SLVirtualizerItf self, SLboolean *pEnabled)
     64 {
     65     SL_ENTER_INTERFACE
     66 
     67     if (NULL == pEnabled) {
     68         result = SL_RESULT_PARAMETER_INVALID;
     69     } else {
     70         IVirtualizer *thiz = (IVirtualizer *) self;
     71         interface_lock_exclusive(thiz);
     72         SLboolean enabled = thiz->mEnabled;
     73 #if !defined(ANDROID)
     74         *pEnabled = enabled;
     75         result = SL_RESULT_SUCCESS;
     76 #else
     77         if (NO_VIRTUALIZER(thiz)) {
     78             result = SL_RESULT_CONTROL_LOST;
     79         } else {
     80             *pEnabled = (SLboolean) thiz->mVirtualizerEffect->getEnabled();
     81             result = SL_RESULT_SUCCESS;
     82         }
     83 #endif
     84         interface_unlock_exclusive(thiz);
     85     }
     86 
     87     SL_LEAVE_INTERFACE
     88 }
     89 
     90 
     91 static SLresult IVirtualizer_SetStrength(SLVirtualizerItf self, SLpermille strength)
     92 {
     93     SL_ENTER_INTERFACE
     94 
     95     if ((VIRTUALIZER_STRENGTH_MIN > strength) || (VIRTUALIZER_STRENGTH_MAX < strength)) {
     96         result = SL_RESULT_PARAMETER_INVALID;
     97     } else {
     98         IVirtualizer *thiz = (IVirtualizer *) self;
     99         interface_lock_exclusive(thiz);
    100 #if !defined(ANDROID)
    101         thiz->mStrength = strength;
    102         result = SL_RESULT_SUCCESS;
    103 #else
    104         if (NO_VIRTUALIZER(thiz)) {
    105             result = SL_RESULT_CONTROL_LOST;
    106         } else {
    107             android::status_t status = android_virt_setParam(thiz->mVirtualizerEffect,
    108                     VIRTUALIZER_PARAM_STRENGTH, &strength);
    109             result = android_fx_statusToResult(status);
    110         }
    111 #endif
    112         interface_unlock_exclusive(thiz);
    113     }
    114 
    115     SL_LEAVE_INTERFACE
    116 }
    117 
    118 
    119 static SLresult IVirtualizer_GetRoundedStrength(SLVirtualizerItf self, SLpermille *pStrength)
    120 {
    121     SL_ENTER_INTERFACE
    122 
    123     if (NULL == pStrength) {
    124         result = SL_RESULT_PARAMETER_INVALID;
    125     } else {
    126         IVirtualizer *thiz = (IVirtualizer *) self;
    127         interface_lock_exclusive(thiz);
    128         SLpermille strength = thiz->mStrength;;
    129 #if !defined(ANDROID)
    130         result = SL_RESULT_SUCCESS;
    131 #else
    132         if (NO_VIRTUALIZER(thiz)) {
    133             result = SL_RESULT_CONTROL_LOST;
    134         } else {
    135             android::status_t status = android_virt_getParam(thiz->mVirtualizerEffect,
    136                            VIRTUALIZER_PARAM_STRENGTH, &strength);
    137             result = android_fx_statusToResult(status);
    138         }
    139 #endif
    140         interface_unlock_exclusive(thiz);
    141         *pStrength = strength;
    142     }
    143 
    144     SL_LEAVE_INTERFACE
    145 }
    146 
    147 
    148 static SLresult IVirtualizer_IsStrengthSupported(SLVirtualizerItf self, SLboolean *pSupported)
    149 {
    150     SL_ENTER_INTERFACE
    151 
    152     if (NULL == pSupported) {
    153         result = SL_RESULT_PARAMETER_INVALID;
    154     } else {
    155 #if !defined(ANDROID)
    156         *pSupported = SL_BOOLEAN_TRUE;
    157         result = SL_RESULT_SUCCESS;
    158 #else
    159         IVirtualizer *thiz = (IVirtualizer *) self;
    160         int32_t supported = 0;
    161         interface_lock_exclusive(thiz);
    162         if (NO_VIRTUALIZER(thiz)) {
    163             result = SL_RESULT_CONTROL_LOST;
    164         } else {
    165             android::status_t status =
    166                 android_virt_getParam(thiz->mVirtualizerEffect,
    167                         VIRTUALIZER_PARAM_STRENGTH_SUPPORTED, &supported);
    168             result = android_fx_statusToResult(status);
    169         }
    170         interface_unlock_exclusive(thiz);
    171         *pSupported = (SLboolean) (supported != 0);
    172 #endif
    173     }
    174 
    175     SL_LEAVE_INTERFACE
    176 }
    177 
    178 
    179 static const struct SLVirtualizerItf_ IVirtualizer_Itf = {
    180     IVirtualizer_SetEnabled,
    181     IVirtualizer_IsEnabled,
    182     IVirtualizer_SetStrength,
    183     IVirtualizer_GetRoundedStrength,
    184     IVirtualizer_IsStrengthSupported
    185 };
    186 
    187 void IVirtualizer_init(void *self)
    188 {
    189     IVirtualizer *thiz = (IVirtualizer *) self;
    190     thiz->mItf = &IVirtualizer_Itf;
    191     thiz->mEnabled = SL_BOOLEAN_FALSE;
    192     thiz->mStrength = 0;
    193 #if defined(ANDROID)
    194     memset(&thiz->mVirtualizerDescriptor, 0, sizeof(effect_descriptor_t));
    195     // placement new (explicit constructor)
    196     (void) new (&thiz->mVirtualizerEffect) android::sp<android::AudioEffect>();
    197 #endif
    198 }
    199 
    200 void IVirtualizer_deinit(void *self)
    201 {
    202 #if defined(ANDROID)
    203     IVirtualizer *thiz = (IVirtualizer *) self;
    204     // explicit destructor
    205     thiz->mVirtualizerEffect.~sp();
    206 #endif
    207 }
    208 
    209 bool IVirtualizer_Expose(void *self)
    210 {
    211 #if defined(ANDROID)
    212     IVirtualizer *thiz = (IVirtualizer *) self;
    213     if (!android_fx_initEffectDescriptor(SL_IID_VIRTUALIZER, &thiz->mVirtualizerDescriptor)) {
    214         SL_LOGE("Virtualizer initialization failed.");
    215         return false;
    216     }
    217 #endif
    218     return true;
    219 }
    220