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 // Test dynamic interface management 18 19 #include <assert.h> 20 #include <math.h> 21 #include <stdio.h> 22 #include <stdlib.h> 23 24 #include <SLES/OpenSLES.h> 25 #ifdef ANDROID 26 #include <SLES/OpenSLES_Android.h> 27 #endif 28 29 int main(int argc, char **argv) 30 { 31 if (argc != 1) { 32 fprintf(stderr, "usage: %s\n", argv[0]); 33 return EXIT_FAILURE; 34 } 35 36 SLresult result; 37 SLObjectItf engineObject; 38 39 // create engine 40 result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL); 41 assert(SL_RESULT_SUCCESS == result); 42 SLEngineItf engineEngine; 43 result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE); 44 assert(SL_RESULT_SUCCESS == result); 45 result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine); 46 assert(SL_RESULT_SUCCESS == result); 47 48 // create output mix 49 SLObjectItf outputMixObject; 50 result = (*engineEngine)->CreateOutputMix(engineEngine, &outputMixObject, 0, NULL, NULL); 51 assert(SL_RESULT_SUCCESS == result); 52 53 // get the dynamic interface management interface for output mix, before realize 54 SLDynamicInterfaceManagementItf outputMixDIM; 55 result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_DYNAMICINTERFACEMANAGEMENT, 56 &outputMixDIM); 57 assert(SL_RESULT_PRECONDITIONS_VIOLATED == result); 58 assert(NULL == outputMixDIM); 59 60 // realize output mix 61 result = (*outputMixObject)->Realize(outputMixObject, SL_BOOLEAN_FALSE); 62 assert(SL_RESULT_SUCCESS == result); 63 64 // get the dynamic interface management interface for output mix, after realize 65 result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_DYNAMICINTERFACEMANAGEMENT, 66 &outputMixDIM); 67 assert(SL_RESULT_SUCCESS == result); 68 assert(NULL != outputMixDIM); 69 70 // register callback 71 result = (*outputMixDIM)->RegisterCallback(outputMixDIM, NULL, NULL); 72 assert(SL_RESULT_SUCCESS == result); 73 74 // get environmental reverb interface, before add or resume 75 SLEnvironmentalReverbItf outputMixEnvironmentalReverb; 76 result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_ENVIRONMENTALREVERB, 77 &outputMixEnvironmentalReverb); 78 assert(SL_RESULT_FEATURE_UNSUPPORTED == result); 79 assert(NULL == outputMixEnvironmentalReverb); 80 81 // resume environmental reverb interface 82 result = (*outputMixDIM)->ResumeInterface(outputMixDIM, SL_IID_ENVIRONMENTALREVERB, 83 SL_BOOLEAN_FALSE); 84 assert(SL_RESULT_PRECONDITIONS_VIOLATED == result); 85 86 // get environmental reverb interface, after resume but before add 87 result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_ENVIRONMENTALREVERB, 88 &outputMixEnvironmentalReverb); 89 assert(SL_RESULT_FEATURE_UNSUPPORTED == result); 90 assert(NULL == outputMixEnvironmentalReverb); 91 92 // add environmental reverb interface 93 result = (*outputMixDIM)->AddInterface(outputMixDIM, SL_IID_ENVIRONMENTALREVERB, 94 SL_BOOLEAN_FALSE); 95 assert(SL_RESULT_SUCCESS == result); 96 97 // get environmental reverb interface, after add 98 result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_ENVIRONMENTALREVERB, 99 &outputMixEnvironmentalReverb); 100 assert(SL_RESULT_SUCCESS == result); 101 assert(NULL != outputMixEnvironmentalReverb); 102 103 // add environmental reverb interface again 104 result = (*outputMixDIM)->AddInterface(outputMixDIM, SL_IID_ENVIRONMENTALREVERB, 105 SL_BOOLEAN_FALSE); 106 assert(SL_RESULT_PRECONDITIONS_VIOLATED == result); 107 108 // resume environmental reverb interface 109 result = (*outputMixDIM)->ResumeInterface(outputMixDIM, SL_IID_ENVIRONMENTALREVERB, 110 SL_BOOLEAN_FALSE); 111 assert(SL_RESULT_PRECONDITIONS_VIOLATED == result); 112 113 // remove environmental reverb interface (FIXME not yet implemented) 114 result = (*outputMixDIM)->RemoveInterface(outputMixDIM, SL_IID_ENVIRONMENTALREVERB); 115 assert((SL_RESULT_SUCCESS == result) || (SL_RESULT_FEATURE_UNSUPPORTED == result)); 116 117 // FIXME once remove is implemented we can try this 118 if (SL_RESULT_SUCCESS == result) { 119 result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_ENVIRONMENTALREVERB, 120 &outputMixEnvironmentalReverb); 121 assert(SL_RESULT_PRECONDITIONS_VIOLATED == result); 122 assert(NULL == outputMixEnvironmentalReverb); 123 result = (*outputMixDIM)->RemoveInterface(outputMixDIM, SL_IID_ENVIRONMENTALREVERB); 124 assert(SL_RESULT_PRECONDITIONS_VIOLATED == result); 125 result = (*outputMixDIM)->AddInterface(outputMixDIM, SL_IID_ENVIRONMENTALREVERB, 126 SL_BOOLEAN_FALSE); 127 assert(SL_RESULT_SUCCESS == result); 128 result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_ENVIRONMENTALREVERB, 129 &outputMixEnvironmentalReverb); 130 assert(SL_RESULT_SUCCESS == result); 131 assert(NULL != outputMixEnvironmentalReverb); 132 } 133 134 // get non-sensical play interface, before add 135 SLPlayItf outputMixPlay; 136 result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_PLAY, &outputMixPlay); 137 assert(SL_RESULT_FEATURE_UNSUPPORTED == result); 138 assert(NULL == outputMixPlay); 139 140 // add play interface 141 result = (*outputMixDIM)->AddInterface(outputMixDIM, SL_IID_PLAY, SL_BOOLEAN_FALSE); 142 assert(SL_RESULT_FEATURE_UNSUPPORTED == result); 143 144 // get play interface should still fail 145 result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_PLAY, &outputMixPlay); 146 assert(SL_RESULT_FEATURE_UNSUPPORTED == result); 147 assert(NULL == outputMixPlay); 148 149 // destroy output mix 150 (*outputMixObject)->Destroy(outputMixObject); 151 152 // destroy engine 153 (*engineObject)->Destroy(engineObject); 154 155 return EXIT_SUCCESS; 156 } 157