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/* PresetReverb implementation */
18a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
19a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "sles_allinclusive.h"
20a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
21faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID)
22172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi/**
23172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi * returns true if this interface is not associated with an initialized PresetReverb effect
24172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi */
25172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivistatic inline bool NO_PRESETREVERB(IPresetReverb* ipr) {
26172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    return (ipr->mPresetReverbEffect == 0);
27172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi}
28172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi#endif
29172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi
30d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IPresetReverb_SetPreset(SLPresetReverbItf self, SLuint16 preset)
31a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
32ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
33ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
34bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IPresetReverb *thiz = (IPresetReverb *) self;
350b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    switch (preset) {
360b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    case SL_REVERBPRESET_NONE:
370b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    case SL_REVERBPRESET_SMALLROOM:
380b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    case SL_REVERBPRESET_MEDIUMROOM:
390b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    case SL_REVERBPRESET_LARGEROOM:
400b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    case SL_REVERBPRESET_MEDIUMHALL:
410b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    case SL_REVERBPRESET_LARGEHALL:
420b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    case SL_REVERBPRESET_PLATE:
43b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten        interface_lock_exclusive(thiz);
44bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        thiz->mPreset = preset;
45faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID)
46ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
47172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi#else
48bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_PRESETREVERB(thiz)) {
49172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
50172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi        } else {
51bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            android::status_t status = android_prev_setPreset(thiz->mPresetReverbEffect, preset);
52172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi            result = android_fx_statusToResult(status);
53172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi        }
54172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi#endif
55b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten        interface_unlock_exclusive(thiz);
560b167267bda99b68346045ccab14e810121d5de4Glenn Kasten        break;
570b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    default:
58ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
59ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        break;
600b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    }
61ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
62ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
63a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
64a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
65d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IPresetReverb_GetPreset(SLPresetReverbItf self, SLuint16 *pPreset)
66a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
67ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
68ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
69ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pPreset) {
70ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
71ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
72bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IPresetReverb *thiz = (IPresetReverb *) self;
73b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten        interface_lock_shared(thiz);
74172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi        SLuint16 preset = SL_REVERBPRESET_NONE;
757d77f0aed328363b188d2caa829bb836ba1abcc8Glenn Kasten#if 1 // !defined(ANDROID)
76bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        preset = thiz->mPreset;
77172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi        result = SL_RESULT_SUCCESS;
78172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi#else
79bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_PRESETREVERB(thiz)) {
80ab657fa824d329357b66ceee2b350b9049847f06Glenn Kasten            preset = thiz->mPreset;
81172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
82172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi        } else {
83bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            android::status_t status = android_prev_getPreset(thiz->mPresetReverbEffect, &preset);
84172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi            result = android_fx_statusToResult(status);
85172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi        }
86ab657fa824d329357b66ceee2b350b9049847f06Glenn Kasten        // OpenSL ES 1.0.1 spec and conformance test do not permit SL_RESULT_CONTROL_LOST
87ab657fa824d329357b66ceee2b350b9049847f06Glenn Kasten        if (SL_RESULT_CONTROL_LOST == result) {
88ab657fa824d329357b66ceee2b350b9049847f06Glenn Kasten            result = SL_RESULT_SUCCESS;
89ab657fa824d329357b66ceee2b350b9049847f06Glenn Kasten        }
90172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi#endif
91b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten        interface_unlock_shared(thiz);
92ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pPreset = preset;
93ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
94ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
95ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
96a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
97a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
98a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic const struct SLPresetReverbItf_ IPresetReverb_Itf = {
99a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IPresetReverb_SetPreset,
100a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IPresetReverb_GetPreset
101a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten};
102a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
103a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenvoid IPresetReverb_init(void *self)
104a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
105bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IPresetReverb *thiz = (IPresetReverb *) self;
106bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mItf = &IPresetReverb_Itf;
107bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mPreset = SL_REVERBPRESET_NONE;
108faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID)
109bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    memset(&thiz->mPresetReverbDescriptor, 0, sizeof(effect_descriptor_t));
110a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    // placement new (explicit constructor)
111bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    (void) new (&thiz->mPresetReverbEffect) android::sp<android::AudioEffect>();
112a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#endif
113a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten}
114172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi
115a9a70a4451545034c9263dd55b181f2912534c37Glenn Kastenvoid IPresetReverb_deinit(void *self)
116a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten{
117faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID)
118bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IPresetReverb *thiz = (IPresetReverb *) self;
119a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    // explicit destructor
120bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mPresetReverbEffect.~sp();
121a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#endif
122a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten}
123a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten
124a9a70a4451545034c9263dd55b181f2912534c37Glenn Kastenbool IPresetReverb_Expose(void *self)
125a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten{
126faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID)
127bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IPresetReverb *thiz = (IPresetReverb *) self;
128bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    if (!android_fx_initEffectDescriptor(SL_IID_PRESETREVERB, &thiz->mPresetReverbDescriptor)) {
129172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi        SL_LOGE("PresetReverb initialization failed.");
130a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten        return false;
131172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    }
132172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi#endif
133a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    return true;
134a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
135