IPresetReverb.c revision ab657fa824d329357b66ceee2b350b9049847f06
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/* PresetReverb implementation */
18
19#include "sles_allinclusive.h"
20
21#if defined(ANDROID)
22/**
23 * returns true if this interface is not associated with an initialized PresetReverb effect
24 */
25static inline bool NO_PRESETREVERB(IPresetReverb* ipr) {
26    return (ipr->mPresetReverbEffect == 0);
27}
28#endif
29
30static SLresult IPresetReverb_SetPreset(SLPresetReverbItf self, SLuint16 preset)
31{
32    SL_ENTER_INTERFACE
33
34    IPresetReverb *thiz = (IPresetReverb *) self;
35    switch (preset) {
36    case SL_REVERBPRESET_NONE:
37    case SL_REVERBPRESET_SMALLROOM:
38    case SL_REVERBPRESET_MEDIUMROOM:
39    case SL_REVERBPRESET_LARGEROOM:
40    case SL_REVERBPRESET_MEDIUMHALL:
41    case SL_REVERBPRESET_LARGEHALL:
42    case SL_REVERBPRESET_PLATE:
43        interface_lock_exclusive(thiz);
44        thiz->mPreset = preset;
45#if !defined(ANDROID)
46        result = SL_RESULT_SUCCESS;
47#else
48        if (NO_PRESETREVERB(thiz)) {
49            result = SL_RESULT_CONTROL_LOST;
50        } else {
51            android::status_t status = android_prev_setPreset(thiz->mPresetReverbEffect, preset);
52            result = android_fx_statusToResult(status);
53        }
54#endif
55        interface_unlock_exclusive(thiz);
56        break;
57    default:
58        result = SL_RESULT_PARAMETER_INVALID;
59        break;
60    }
61
62    SL_LEAVE_INTERFACE
63}
64
65static SLresult IPresetReverb_GetPreset(SLPresetReverbItf self, SLuint16 *pPreset)
66{
67    SL_ENTER_INTERFACE
68
69    if (NULL == pPreset) {
70        result = SL_RESULT_PARAMETER_INVALID;
71    } else {
72        IPresetReverb *thiz = (IPresetReverb *) self;
73        interface_lock_shared(thiz);
74        SLuint16 preset = SL_REVERBPRESET_NONE;
75#if !defined(ANDROID)
76        preset = thiz->mPreset;
77        result = SL_RESULT_SUCCESS;
78#else
79        if (NO_PRESETREVERB(thiz)) {
80            preset = thiz->mPreset;
81            result = SL_RESULT_CONTROL_LOST;
82        } else {
83            android::status_t status = android_prev_getPreset(thiz->mPresetReverbEffect, &preset);
84            result = android_fx_statusToResult(status);
85        }
86        // OpenSL ES 1.0.1 spec and conformance test do not permit SL_RESULT_CONTROL_LOST
87        if (SL_RESULT_CONTROL_LOST == result) {
88            result = SL_RESULT_SUCCESS;
89        }
90#endif
91        interface_unlock_shared(thiz);
92        *pPreset = preset;
93    }
94
95    SL_LEAVE_INTERFACE
96}
97
98static const struct SLPresetReverbItf_ IPresetReverb_Itf = {
99    IPresetReverb_SetPreset,
100    IPresetReverb_GetPreset
101};
102
103void IPresetReverb_init(void *self)
104{
105    IPresetReverb *thiz = (IPresetReverb *) self;
106    thiz->mItf = &IPresetReverb_Itf;
107    thiz->mPreset = SL_REVERBPRESET_NONE;
108#if defined(ANDROID)
109    memset(&thiz->mPresetReverbDescriptor, 0, sizeof(effect_descriptor_t));
110    // placement new (explicit constructor)
111    (void) new (&thiz->mPresetReverbEffect) android::sp<android::AudioEffect>();
112#endif
113}
114
115void IPresetReverb_deinit(void *self)
116{
117#if defined(ANDROID)
118    IPresetReverb *thiz = (IPresetReverb *) self;
119    // explicit destructor
120    thiz->mPresetReverbEffect.~sp();
121#endif
122}
123
124bool IPresetReverb_Expose(void *self)
125{
126#if defined(ANDROID)
127    IPresetReverb *thiz = (IPresetReverb *) self;
128    if (!android_fx_initEffectDescriptor(SL_IID_PRESETREVERB, &thiz->mPresetReverbDescriptor)) {
129        SL_LOGE("PresetReverb initialization failed.");
130        return false;
131    }
132#endif
133    return true;
134}
135