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
29int 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