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