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