182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten/*
282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * Copyright (C) 2010 The Android Open Source Project
382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten *
482b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
582b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * you may not use this file except in compliance with the License.
682b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * You may obtain a copy of the License at
782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten *
882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten *
1082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * Unless required by applicable law or agreed to in writing, software
1182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
1282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * See the License for the specific language governing permissions and
1482b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * limitations under the License.
1582b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten */
1682b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
1782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten/* PresetReverb implementation */
1882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
1982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten#include "sles_allinclusive.h"
2082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
2168817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi#if defined(ANDROID) && !defined(USE_BACKPORT)
2268817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi/**
2368817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi * returns true if this interface is not associated with an initialized PresetReverb effect
2468817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi */
2568817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivistatic inline bool NO_PRESETREVERB(IPresetReverb* ipr) {
2668817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi    return (ipr->mPresetReverbEffect == 0);
2768817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi}
2868817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi#endif
2968817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi
30437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenstatic SLresult IPresetReverb_SetPreset(SLPresetReverbItf self, SLuint16 preset)
3182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{
32f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
33f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
344c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    IPresetReverb *this = (IPresetReverb *) self;
354c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    switch (preset) {
364c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    case SL_REVERBPRESET_NONE:
374c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    case SL_REVERBPRESET_SMALLROOM:
384c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    case SL_REVERBPRESET_MEDIUMROOM:
394c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    case SL_REVERBPRESET_LARGEROOM:
404c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    case SL_REVERBPRESET_MEDIUMHALL:
414c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    case SL_REVERBPRESET_LARGEHALL:
424c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    case SL_REVERBPRESET_PLATE:
43f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        interface_lock_poke(this);
44f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        this->mPreset = preset;
4568817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi#if !defined(ANDROID) || defined(USE_BACKPORT)
46f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
4768817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi#else
4868817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi        if (NO_PRESETREVERB(this)) {
4968817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
5068817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi        } else {
5168817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi            android::status_t status = android_prev_setPreset(this->mPresetReverbEffect, preset);
5268817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi            result = android_fx_statusToResult(status);
5368817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi        }
5468817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi#endif
5568817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi        interface_unlock_poke(this);
564c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten        break;
574c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    default:
58f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
59f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        break;
604c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    }
61f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
62f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
6382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}
6482b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
65437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenstatic SLresult IPresetReverb_GetPreset(SLPresetReverbItf self, SLuint16 *pPreset)
6682b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{
67f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
68f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
69f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    if (NULL == pPreset) {
70f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
71f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    } else {
72f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        IPresetReverb *this = (IPresetReverb *) self;
73f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        interface_lock_peek(this);
7468817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi        SLuint16 preset = SL_REVERBPRESET_NONE;
7568817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi#if !defined(ANDROID) || defined(USE_BACKPORT)
7668817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi        preset = this->mPreset;
7768817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi        result = SL_RESULT_SUCCESS;
7868817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi#else
7968817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi        if (NO_PRESETREVERB(this)) {
8068817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
8168817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi        } else {
8268817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi            android::status_t status = android_prev_getPreset(this->mPresetReverbEffect, &preset);
8368817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi            result = android_fx_statusToResult(status);
8468817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi        }
8568817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi#endif
86f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        interface_unlock_peek(this);
87f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        *pPreset = preset;
88f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    }
89f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
90f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
9182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}
9282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
9382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic const struct SLPresetReverbItf_ IPresetReverb_Itf = {
9482b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    IPresetReverb_SetPreset,
9582b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    IPresetReverb_GetPreset
9682b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten};
9782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
9882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenvoid IPresetReverb_init(void *self)
9982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{
10082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    IPresetReverb *this = (IPresetReverb *) self;
10182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    this->mItf = &IPresetReverb_Itf;
1024c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    this->mPreset = SL_REVERBPRESET_NONE;
1032a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten#if defined(ANDROID) && !defined(USE_BACKPORT)
1042a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten    memset(&this->mPresetReverbDescriptor, 0, sizeof(effect_descriptor_t));
1052a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten    // placement new (explicit constructor)
1062a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten    (void) new (&this->mPresetReverbEffect) android::sp<android::AudioEffect>();
1072a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten#endif
1082a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten}
10968817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi
1102a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kastenvoid IPresetReverb_deinit(void *self)
1112a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten{
11268817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi#if defined(ANDROID) && !defined(USE_BACKPORT)
1132a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten    IPresetReverb *this = (IPresetReverb *) self;
1142a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten    // explicit destructor
1152a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten    this->mPresetReverbEffect.~sp();
1162a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten#endif
1172a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten}
1182a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten
1192a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kastenbool IPresetReverb_Expose(void *self)
1202a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten{
1212a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten#if defined(ANDROID) && !defined(USE_BACKPORT)
1222a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten    IPresetReverb *this = (IPresetReverb *) self;
12368817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi    if (!android_fx_initEffectDescriptor(SL_IID_PRESETREVERB, &this->mPresetReverbDescriptor)) {
12468817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi        SL_LOGE("PresetReverb initialization failed.");
1252a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten        return false;
12668817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi    }
12768817ee6ff2ede1dac61078894d8920fb961061fJean-Michel Trivi#endif
1282a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten    return true;
12982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}
130