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
main(int argc,char ** argv)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