1*bebae9c0SAndroid Build Coastguard Worker /*
2*bebae9c0SAndroid Build Coastguard Worker * Copyright (C) 2010 The Android Open Source Project
3*bebae9c0SAndroid Build Coastguard Worker *
4*bebae9c0SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*bebae9c0SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*bebae9c0SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*bebae9c0SAndroid Build Coastguard Worker *
8*bebae9c0SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*bebae9c0SAndroid Build Coastguard Worker *
10*bebae9c0SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*bebae9c0SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*bebae9c0SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*bebae9c0SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*bebae9c0SAndroid Build Coastguard Worker * limitations under the License.
15*bebae9c0SAndroid Build Coastguard Worker */
16*bebae9c0SAndroid Build Coastguard Worker
17*bebae9c0SAndroid Build Coastguard Worker // output mix interface tests
18*bebae9c0SAndroid Build Coastguard Worker
19*bebae9c0SAndroid Build Coastguard Worker #include <SLES/OpenSLES.h>
20*bebae9c0SAndroid Build Coastguard Worker #include "OpenSLESUT.h"
21*bebae9c0SAndroid Build Coastguard Worker #include <assert.h>
22*bebae9c0SAndroid Build Coastguard Worker #include <stdio.h>
23*bebae9c0SAndroid Build Coastguard Worker #include <stdlib.h>
24*bebae9c0SAndroid Build Coastguard Worker #include <string.h>
25*bebae9c0SAndroid Build Coastguard Worker
main(int argc __unused,char ** argv __unused)26*bebae9c0SAndroid Build Coastguard Worker int main(int argc __unused, char **argv __unused)
27*bebae9c0SAndroid Build Coastguard Worker {
28*bebae9c0SAndroid Build Coastguard Worker // create engine
29*bebae9c0SAndroid Build Coastguard Worker SLObjectItf engineObject;
30*bebae9c0SAndroid Build Coastguard Worker SLresult result;
31*bebae9c0SAndroid Build Coastguard Worker result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL);
32*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
33*bebae9c0SAndroid Build Coastguard Worker printf("Engine object %p\n", engineObject);
34*bebae9c0SAndroid Build Coastguard Worker // realize engine
35*bebae9c0SAndroid Build Coastguard Worker result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);
36*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
37*bebae9c0SAndroid Build Coastguard Worker // get engine interface
38*bebae9c0SAndroid Build Coastguard Worker SLEngineItf engineEngine;
39*bebae9c0SAndroid Build Coastguard Worker result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine);
40*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
41*bebae9c0SAndroid Build Coastguard Worker // query supported interfaces on output mix object ID and display their IDs
42*bebae9c0SAndroid Build Coastguard Worker SLuint32 numSupportedInterfaces;
43*bebae9c0SAndroid Build Coastguard Worker result = (*engineEngine)->QueryNumSupportedInterfaces(engineEngine, SL_OBJECTID_OUTPUTMIX,
44*bebae9c0SAndroid Build Coastguard Worker &numSupportedInterfaces);
45*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
46*bebae9c0SAndroid Build Coastguard Worker printf("Output mix supports %u interfaces:\n", numSupportedInterfaces);
47*bebae9c0SAndroid Build Coastguard Worker SLuint32 i;
48*bebae9c0SAndroid Build Coastguard Worker for (i = 0; i < numSupportedInterfaces; ++i) {
49*bebae9c0SAndroid Build Coastguard Worker SLInterfaceID interfaceID;
50*bebae9c0SAndroid Build Coastguard Worker result = (*engineEngine)->QuerySupportedInterfaces(engineEngine, SL_OBJECTID_OUTPUTMIX, i,
51*bebae9c0SAndroid Build Coastguard Worker &interfaceID);
52*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
53*bebae9c0SAndroid Build Coastguard Worker printf(" [%u] = ", i);
54*bebae9c0SAndroid Build Coastguard Worker slesutPrintIID(interfaceID);
55*bebae9c0SAndroid Build Coastguard Worker }
56*bebae9c0SAndroid Build Coastguard Worker // create output mix, with no place to put the new object
57*bebae9c0SAndroid Build Coastguard Worker result = (*engineEngine)->CreateOutputMix(engineEngine, NULL, 0, NULL, NULL);
58*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_PARAMETER_INVALID == result);
59*bebae9c0SAndroid Build Coastguard Worker // create output mix, requesting no explicit interfaces
60*bebae9c0SAndroid Build Coastguard Worker SLObjectItf outputMixObject;
61*bebae9c0SAndroid Build Coastguard Worker result = (*engineEngine)->CreateOutputMix(engineEngine, &outputMixObject, 0, NULL, NULL);
62*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
63*bebae9c0SAndroid Build Coastguard Worker printf("Output mix object %p\n", outputMixObject);
64*bebae9c0SAndroid Build Coastguard Worker // get object interface before realization
65*bebae9c0SAndroid Build Coastguard Worker SLObjectItf outputMixObject2;
66*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_OBJECT, &outputMixObject2);
67*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
68*bebae9c0SAndroid Build Coastguard Worker assert(outputMixObject2 == outputMixObject);
69*bebae9c0SAndroid Build Coastguard Worker // get any other interface before realization should fail
70*bebae9c0SAndroid Build Coastguard Worker SLOutputMixItf outputMixOutputMix;
71*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_OUTPUTMIX,
72*bebae9c0SAndroid Build Coastguard Worker &outputMixOutputMix);
73*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_PRECONDITIONS_VIOLATED == result);
74*bebae9c0SAndroid Build Coastguard Worker // realize the output mix
75*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixObject)->Realize(outputMixObject, SL_BOOLEAN_FALSE);
76*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
77*bebae9c0SAndroid Build Coastguard Worker // get each expected implicit interface
78*bebae9c0SAndroid Build Coastguard Worker outputMixObject2 = NULL;
79*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_OBJECT, &outputMixObject2);
80*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
81*bebae9c0SAndroid Build Coastguard Worker assert(outputMixObject2 == outputMixObject);
82*bebae9c0SAndroid Build Coastguard Worker SLDynamicInterfaceManagementItf outputMixDynamicInterfaceManagement;
83*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_DYNAMICINTERFACEMANAGEMENT,
84*bebae9c0SAndroid Build Coastguard Worker &outputMixDynamicInterfaceManagement);
85*bebae9c0SAndroid Build Coastguard Worker assert((SL_RESULT_SUCCESS == result) || (SL_RESULT_FEATURE_UNSUPPORTED) == result);
86*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS == result) {
87*bebae9c0SAndroid Build Coastguard Worker printf("Output mix supports dynamic interface management\n");
88*bebae9c0SAndroid Build Coastguard Worker } else {
89*bebae9c0SAndroid Build Coastguard Worker printf("Output mix does not support dynamic interface management\n");
90*bebae9c0SAndroid Build Coastguard Worker }
91*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_OUTPUTMIX,
92*bebae9c0SAndroid Build Coastguard Worker &outputMixOutputMix);
93*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
94*bebae9c0SAndroid Build Coastguard Worker // get explicit and optional interfaces should fail since not requested at creation
95*bebae9c0SAndroid Build Coastguard Worker SLEnvironmentalReverbItf outputMixEnvironmentalReverb;
96*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_ENVIRONMENTALREVERB,
97*bebae9c0SAndroid Build Coastguard Worker &outputMixEnvironmentalReverb);
98*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_FEATURE_UNSUPPORTED == result);
99*bebae9c0SAndroid Build Coastguard Worker SLEqualizerItf outputMixEqualizer;
100*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_EQUALIZER,
101*bebae9c0SAndroid Build Coastguard Worker &outputMixEqualizer);
102*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_FEATURE_UNSUPPORTED == result);
103*bebae9c0SAndroid Build Coastguard Worker SLPresetReverbItf outputMixPresetReverb;
104*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_PRESETREVERB,
105*bebae9c0SAndroid Build Coastguard Worker &outputMixPresetReverb);
106*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_FEATURE_UNSUPPORTED == result);
107*bebae9c0SAndroid Build Coastguard Worker SLVirtualizerItf outputMixVirtualizer;
108*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_VIRTUALIZER,
109*bebae9c0SAndroid Build Coastguard Worker &outputMixVirtualizer);
110*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_FEATURE_UNSUPPORTED == result);
111*bebae9c0SAndroid Build Coastguard Worker SLVolumeItf outputMixVolume;
112*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_VOLUME,
113*bebae9c0SAndroid Build Coastguard Worker &outputMixVolume);
114*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_FEATURE_UNSUPPORTED == result);
115*bebae9c0SAndroid Build Coastguard Worker SLBassBoostItf outputMixBassBoost;
116*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_BASSBOOST,
117*bebae9c0SAndroid Build Coastguard Worker &outputMixBassBoost);
118*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_FEATURE_UNSUPPORTED == result);
119*bebae9c0SAndroid Build Coastguard Worker SLVisualizationItf outputMixVisualization;
120*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_VISUALIZATION,
121*bebae9c0SAndroid Build Coastguard Worker &outputMixVisualization);
122*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_FEATURE_UNSUPPORTED == result);
123*bebae9c0SAndroid Build Coastguard Worker // destroy output mix
124*bebae9c0SAndroid Build Coastguard Worker (*outputMixObject)->Destroy(outputMixObject);
125*bebae9c0SAndroid Build Coastguard Worker // re-create output mix, this time requesting implicit interfaces as "hard" requirements (must
126*bebae9c0SAndroid Build Coastguard Worker // be there), and explicit interfaces as "soft" requirements (OK if not available)
127*bebae9c0SAndroid Build Coastguard Worker SLInterfaceID ids[10] = {SL_IID_OBJECT, SL_IID_DYNAMICINTERFACEMANAGEMENT, SL_IID_OUTPUTMIX,
128*bebae9c0SAndroid Build Coastguard Worker SL_IID_ENVIRONMENTALREVERB, SL_IID_EQUALIZER, SL_IID_PRESETREVERB, SL_IID_VIRTUALIZER,
129*bebae9c0SAndroid Build Coastguard Worker SL_IID_VOLUME, SL_IID_BASSBOOST, SL_IID_VISUALIZATION};
130*bebae9c0SAndroid Build Coastguard Worker SLboolean req[10] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_FALSE /*SL_BOOLEAN_TRUE*/, SL_BOOLEAN_TRUE,
131*bebae9c0SAndroid Build Coastguard Worker SL_BOOLEAN_TRUE/*FALSE*/, SL_BOOLEAN_FALSE, SL_BOOLEAN_FALSE, SL_BOOLEAN_FALSE,
132*bebae9c0SAndroid Build Coastguard Worker SL_BOOLEAN_FALSE, SL_BOOLEAN_FALSE, SL_BOOLEAN_FALSE};
133*bebae9c0SAndroid Build Coastguard Worker result = (*engineEngine)->CreateOutputMix(engineEngine, &outputMixObject, 10, ids, req);
134*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
135*bebae9c0SAndroid Build Coastguard Worker printf("Output mix object %p\n", outputMixObject);
136*bebae9c0SAndroid Build Coastguard Worker // realize the output mix
137*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixObject)->Realize(outputMixObject, SL_BOOLEAN_FALSE);
138*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
139*bebae9c0SAndroid Build Coastguard Worker // get implicit interfaces
140*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_OBJECT,
141*bebae9c0SAndroid Build Coastguard Worker &outputMixObject2);
142*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
143*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_DYNAMICINTERFACEMANAGEMENT,
144*bebae9c0SAndroid Build Coastguard Worker &outputMixDynamicInterfaceManagement);
145*bebae9c0SAndroid Build Coastguard Worker assert((SL_RESULT_SUCCESS == result) || (SL_RESULT_FEATURE_UNSUPPORTED) == result);
146*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_OUTPUTMIX,
147*bebae9c0SAndroid Build Coastguard Worker &outputMixOutputMix);
148*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
149*bebae9c0SAndroid Build Coastguard Worker // get explicit and optional interfaces should succeed since they were requested at creation
150*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_ENVIRONMENTALREVERB,
151*bebae9c0SAndroid Build Coastguard Worker &outputMixEnvironmentalReverb);
152*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
153*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_EQUALIZER,
154*bebae9c0SAndroid Build Coastguard Worker &outputMixEqualizer);
155*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
156*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_PRESETREVERB,
157*bebae9c0SAndroid Build Coastguard Worker &outputMixPresetReverb);
158*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
159*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_VIRTUALIZER,
160*bebae9c0SAndroid Build Coastguard Worker &outputMixVirtualizer);
161*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
162*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_VOLUME,
163*bebae9c0SAndroid Build Coastguard Worker &outputMixVolume);
164*bebae9c0SAndroid Build Coastguard Worker assert((SL_RESULT_SUCCESS == result) || (SL_RESULT_FEATURE_UNSUPPORTED) == result);
165*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS == result) {
166*bebae9c0SAndroid Build Coastguard Worker printf("Output mix supports volume\n");
167*bebae9c0SAndroid Build Coastguard Worker } else {
168*bebae9c0SAndroid Build Coastguard Worker printf("Output mix does not support volume\n");
169*bebae9c0SAndroid Build Coastguard Worker }
170*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_BASSBOOST,
171*bebae9c0SAndroid Build Coastguard Worker &outputMixBassBoost);
172*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
173*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_VISUALIZATION,
174*bebae9c0SAndroid Build Coastguard Worker &outputMixVisualization);
175*bebae9c0SAndroid Build Coastguard Worker assert((SL_RESULT_SUCCESS == result) || (SL_RESULT_FEATURE_UNSUPPORTED) == result);
176*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS == result) {
177*bebae9c0SAndroid Build Coastguard Worker printf("Output mix supports visualization\n");
178*bebae9c0SAndroid Build Coastguard Worker } else {
179*bebae9c0SAndroid Build Coastguard Worker printf("Output mix does not support visualization\n");
180*bebae9c0SAndroid Build Coastguard Worker }
181*bebae9c0SAndroid Build Coastguard Worker // use the OutputMix interface on output mix object, in order to get code coverage
182*bebae9c0SAndroid Build Coastguard Worker SLint32 numDevices = 1;
183*bebae9c0SAndroid Build Coastguard Worker SLuint32 deviceIDs[1];
184*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixOutputMix)->GetDestinationOutputDeviceIDs(outputMixOutputMix, &numDevices,
185*bebae9c0SAndroid Build Coastguard Worker deviceIDs);
186*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
187*bebae9c0SAndroid Build Coastguard Worker assert(1 == numDevices);
188*bebae9c0SAndroid Build Coastguard Worker assert(SL_DEFAULTDEVICEID_AUDIOOUTPUT == deviceIDs[0]);
189*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixOutputMix)->RegisterDeviceChangeCallback(outputMixOutputMix, NULL, NULL);
190*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
191*bebae9c0SAndroid Build Coastguard Worker result = (*outputMixOutputMix)->ReRoute(outputMixOutputMix, 1, deviceIDs);
192*bebae9c0SAndroid Build Coastguard Worker assert(SL_RESULT_SUCCESS == result);
193*bebae9c0SAndroid Build Coastguard Worker // destroy output mix
194*bebae9c0SAndroid Build Coastguard Worker (*outputMixObject)->Destroy(outputMixObject);
195*bebae9c0SAndroid Build Coastguard Worker // destroy engine
196*bebae9c0SAndroid Build Coastguard Worker (*engineObject)->Destroy(engineObject);
197*bebae9c0SAndroid Build Coastguard Worker return EXIT_SUCCESS;
198*bebae9c0SAndroid Build Coastguard Worker }
199