1a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten/* 2a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * Copyright (C) 2010 The Android Open Source Project 3a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * 4a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 5a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * you may not use this file except in compliance with the License. 6a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * You may obtain a copy of the License at 7a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * 8a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 9a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * 10a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * Unless required by applicable law or agreed to in writing, software 11a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 12a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * See the License for the specific language governing permissions and 14a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * limitations under the License. 15a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten */ 16a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 17a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten/* Virtualizer implementation */ 18a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 19a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "sles_allinclusive.h" 2063c002ab68761be0eace98f28320d8eb2f3f7695Jean-Michel Trivi#ifdef ANDROID 21ea429ee1007c36ade812199ad365c0e659e8053fEric Laurent#include <audio_effects/effect_virtualizer.h> 2263c002ab68761be0eace98f28320d8eb2f3f7695Jean-Michel Trivi#endif 23a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 24cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi#define VIRTUALIZER_STRENGTH_MIN 0 25cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi#define VIRTUALIZER_STRENGTH_MAX 1000 26cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi 27cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi 28faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID) 29cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi/** 30cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi * returns true if this interface is not associated with an initialized Virtualizer effect 31cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi */ 32cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivistatic inline bool NO_VIRTUALIZER(IVirtualizer* v) { 33cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi return (v->mVirtualizerEffect == 0); 34cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi} 35768edbc2a8e7f197548cf1141689dd237d19c455Glenn Kasten#endif 36cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi 37ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 38a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IVirtualizer_SetEnabled(SLVirtualizerItf self, SLboolean enabled) 39a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 40ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 41ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 42bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVirtualizer *thiz = (IVirtualizer *) self; 43bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 44bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mEnabled = (SLboolean) enabled; 45faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID) 46ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 47cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi#else 48bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten if (NO_VIRTUALIZER(thiz)) { 49cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 50cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi } else { 51cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi android::status_t status = 52bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mVirtualizerEffect->setEnabled((bool) thiz->mEnabled); 53cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi result = android_fx_statusToResult(status); 54cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi } 55cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi#endif 56bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 57ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 58ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 59cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi 60a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 61a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 62ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 63d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IVirtualizer_IsEnabled(SLVirtualizerItf self, SLboolean *pEnabled) 64a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 65ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 66ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 6722ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten if (NULL == pEnabled) { 6822ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten result = SL_RESULT_PARAMETER_INVALID; 6922ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten } else { 7022ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten IVirtualizer *thiz = (IVirtualizer *) self; 7122ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten interface_lock_exclusive(thiz); 7222ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten SLboolean enabled = thiz->mEnabled; 73faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID) 7422ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten *pEnabled = enabled; 7522ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten result = SL_RESULT_SUCCESS; 76a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#else 7722ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten if (NO_VIRTUALIZER(thiz)) { 7822ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten result = SL_RESULT_CONTROL_LOST; 7922ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten } else { 8022ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten *pEnabled = (SLboolean) thiz->mVirtualizerEffect->getEnabled(); 8122ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten result = SL_RESULT_SUCCESS; 8222ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten } 83a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#endif 8422ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten interface_unlock_exclusive(thiz); 8522ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten } 86cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi 8722ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten SL_LEAVE_INTERFACE 88a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 89a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 90ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 91d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IVirtualizer_SetStrength(SLVirtualizerItf self, SLpermille strength) 92a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 93ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 94ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 9522ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten if ((VIRTUALIZER_STRENGTH_MIN > strength) || (VIRTUALIZER_STRENGTH_MAX < strength)) { 9622ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten result = SL_RESULT_PARAMETER_INVALID; 9722ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten } else { 9822ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten IVirtualizer *thiz = (IVirtualizer *) self; 9922ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten interface_lock_exclusive(thiz); 100faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID) 10122ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten thiz->mStrength = strength; 10222ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten result = SL_RESULT_SUCCESS; 103a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#else 10422ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten if (NO_VIRTUALIZER(thiz)) { 10522ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten result = SL_RESULT_CONTROL_LOST; 10622ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten } else { 10722ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten android::status_t status = android_virt_setParam(thiz->mVirtualizerEffect, 10822ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten VIRTUALIZER_PARAM_STRENGTH, &strength); 10922ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten result = android_fx_statusToResult(status); 11022ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten } 111a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#endif 11222ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten interface_unlock_exclusive(thiz); 11322ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten } 114cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi 11522ced1dc023dc000118e3a26517b14e9babd7c5aGlenn Kasten SL_LEAVE_INTERFACE 116a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 117a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 118ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 119d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IVirtualizer_GetRoundedStrength(SLVirtualizerItf self, SLpermille *pStrength) 120a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 121ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 122ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 123ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pStrength) { 124ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 125ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 126bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVirtualizer *thiz = (IVirtualizer *) self; 127bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 128bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLpermille strength = thiz->mStrength;; 129faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID) 130ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 131cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi#else 132bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten if (NO_VIRTUALIZER(thiz)) { 133cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 134cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi } else { 135bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten android::status_t status = android_virt_getParam(thiz->mVirtualizerEffect, 136cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi VIRTUALIZER_PARAM_STRENGTH, &strength); 137cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi result = android_fx_statusToResult(status); 138cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi } 139cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi#endif 140bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 141cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi *pStrength = strength; 142ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 143ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 144ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 145a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 146a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 147ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 148d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IVirtualizer_IsStrengthSupported(SLVirtualizerItf self, SLboolean *pSupported) 149a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 150ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 151ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 152ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pSupported) { 153ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 154ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 155faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID) 156ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pSupported = SL_BOOLEAN_TRUE; 157ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 158cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi#else 159bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVirtualizer *thiz = (IVirtualizer *) self; 160cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi int32_t supported = 0; 161bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 162bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten if (NO_VIRTUALIZER(thiz)) { 163cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi result = SL_RESULT_CONTROL_LOST; 164cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi } else { 165cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi android::status_t status = 166bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten android_virt_getParam(thiz->mVirtualizerEffect, 167cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi VIRTUALIZER_PARAM_STRENGTH_SUPPORTED, &supported); 168cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi result = android_fx_statusToResult(status); 169cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi } 170bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 171cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi *pSupported = (SLboolean) (supported != 0); 172cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi#endif 173ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 174ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 175ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 176a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 177a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 178ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 179a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic const struct SLVirtualizerItf_ IVirtualizer_Itf = { 180a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IVirtualizer_SetEnabled, 181a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IVirtualizer_IsEnabled, 182a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IVirtualizer_SetStrength, 183a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IVirtualizer_GetRoundedStrength, 184a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten IVirtualizer_IsStrengthSupported 185a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}; 186a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 187a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenvoid IVirtualizer_init(void *self) 188a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 189bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVirtualizer *thiz = (IVirtualizer *) self; 190bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mItf = &IVirtualizer_Itf; 191bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mEnabled = SL_BOOLEAN_FALSE; 192bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mStrength = 0; 193faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID) 194bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten memset(&thiz->mVirtualizerDescriptor, 0, sizeof(effect_descriptor_t)); 195a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // placement new (explicit constructor) 196bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten (void) new (&thiz->mVirtualizerEffect) android::sp<android::AudioEffect>(); 197a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#endif 198a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten} 199cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi 200a9a70a4451545034c9263dd55b181f2912534c37Glenn Kastenvoid IVirtualizer_deinit(void *self) 201a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten{ 202faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID) 203bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVirtualizer *thiz = (IVirtualizer *) self; 204a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // explicit destructor 205bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mVirtualizerEffect.~sp(); 206a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#endif 207a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten} 208a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten 209a9a70a4451545034c9263dd55b181f2912534c37Glenn Kastenbool IVirtualizer_Expose(void *self) 210a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten{ 211faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID) 212bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVirtualizer *thiz = (IVirtualizer *) self; 213bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten if (!android_fx_initEffectDescriptor(SL_IID_VIRTUALIZER, &thiz->mVirtualizerDescriptor)) { 214cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi SL_LOGE("Virtualizer initialization failed."); 215a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten return false; 216cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi } 217cfe5b1c6f0b65499d9aed2cf4b2a7e805fb02758Jean-Michel Trivi#endif 218a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten return true; 219a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 220