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);
72faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID)
7362496886cb4620c09bc5df0de70a883319616c25Aurimas Liutikas        SLboolean enabled = thiz->mEnabled;
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