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 #include <stdlib.h>
18 #include <stdio.h>
19 #include <string.h>
20 #include <unistd.h>
21 #include <sys/time.h>
22 #include <fcntl.h>
23
24 #include <SLES/OpenSLES.h>
25 #include <SLES/OpenSLES_Android.h>
26
27
28 #define MAX_NUMBER_INTERFACES 1
29
30 #define GUID_DISPLAY_LENGTH 35
31 #define FX_NAME_LENGTH 64
32
33 static int testMode;
34 //-----------------------------------------------------------------
35 /* Exits the application if an error is encountered */
36 #define ExitOnError(x) ExitOnErrorFunc(x,__LINE__)
37
ExitOnErrorFunc(SLresult result,int line)38 void ExitOnErrorFunc( SLresult result , int line)
39 {
40 if (SL_RESULT_SUCCESS != result) {
41 fprintf(stderr, "%u error code encountered at line %d, exiting\n", result, line);
42 exit(EXIT_FAILURE);
43 }
44 }
45
46 //-----------------------------------------------------------------
guidToString(const SLInterfaceID guid,char * str)47 void guidToString(const SLInterfaceID guid, char *str) {
48 if ((NULL == guid) || (NULL == str)) {
49 return;
50 }
51 snprintf(str, GUID_DISPLAY_LENGTH, "%08x-%04x-%04x-%04x-%02x%02x%02x%02x%02x%02x",
52 guid->time_low,
53 guid->time_mid,
54 guid->time_hi_and_version,
55 guid->clock_seq,
56 guid->node[0],
57 guid->node[1],
58 guid->node[2],
59 guid->node[3],
60 guid->node[4],
61 guid->node[5]);
62 }
63
64 //-----------------------------------------------------------------
65
66 /* Query available effects on Android */
TestGenericFxCapabilities()67 void TestGenericFxCapabilities( )
68 {
69
70 SLresult result;
71 SLObjectItf sl;
72
73 /* ------------------------------------------------------ */
74 /* Engine configuration and creation */
75
76 SLEngineOption EngineOption[] = {
77 {(SLuint32) SL_ENGINEOPTION_THREADSAFE, (SLuint32) SL_BOOLEAN_TRUE}
78 };
79
80 SLboolean required[MAX_NUMBER_INTERFACES];
81 SLInterfaceID iidArray[MAX_NUMBER_INTERFACES];
82
83 /* Initialize arrays required[] and iidArray[] */
84 for (int i=0 ; i < MAX_NUMBER_INTERFACES ; i++) {
85 required[i] = SL_BOOLEAN_FALSE;
86 iidArray[i] = SL_IID_NULL;
87 }
88
89 iidArray[0] = SL_IID_ANDROIDEFFECTCAPABILITIES;
90 required[0] = SL_BOOLEAN_TRUE;
91
92
93 result = slCreateEngine( &sl, 1, EngineOption, 1, iidArray, required);
94 ExitOnError(result);
95
96 /* Realizing the SL Engine in synchronous mode. */
97 result = (*sl)->Realize(sl, SL_BOOLEAN_FALSE);
98 ExitOnError(result);
99
100
101 SLEngineItf EngineItf;
102 SLAndroidEffectCapabilitiesItf EffectLibItf;
103
104 /* Get the SL Engine interface which is implicit */
105 result = (*sl)->GetInterface(sl, SL_IID_ENGINE, (void*)&EngineItf);
106 ExitOnError(result);
107
108 /* Get the Android Effect Capabilities interface */
109 result = (*sl)->GetInterface(sl, SL_IID_ANDROIDEFFECTCAPABILITIES, (void*)&EffectLibItf);
110 ExitOnError(result);
111
112 /* ------------------------------------------------------ */
113 /* Query the effect library */
114
115 SLuint32 nbEffects = 0;
116 result = (*EffectLibItf)->QueryNumEffects(EffectLibItf, &nbEffects);
117 ExitOnError(result);
118 fprintf(stdout, "Effect library contains %d effects:\n", nbEffects);
119
120 SLchar effectName[FX_NAME_LENGTH+1];
121 SLuint16 effectNameLength = FX_NAME_LENGTH;
122 char typeString[GUID_DISPLAY_LENGTH];
123 char implString[GUID_DISPLAY_LENGTH];
124
125 SLInterfaceID effectType, effectImplementation;
126 for (SLuint32 i = 0 ; i < nbEffects ; i++ ) {
127 fprintf(stdout,"- effect %d: ", i);
128 memset(effectName, 'Z', FX_NAME_LENGTH+1);
129 effectNameLength = FX_NAME_LENGTH;
130 result = (*EffectLibItf)->QueryEffect(EffectLibItf, i,
131 &effectType, &effectImplementation, effectName, &effectNameLength);
132 if ('Z' != effectName[FX_NAME_LENGTH]) {
133 fprintf(stderr, "QueryEffect wrote beyond end of buffer\n");
134 continue;
135 }
136 ExitOnError(result);
137 printf("length=%u ", effectNameLength);
138 if (FX_NAME_LENGTH < effectNameLength) {
139 printf(" (>max) ");
140 effectNameLength = FX_NAME_LENGTH;
141 }
142 guidToString(effectType, typeString);
143 guidToString(effectImplementation, implString);
144 effectName[FX_NAME_LENGTH - 1] = '\0';
145 fprintf(stdout, " type=%s, impl=%s name=%.*s \n", typeString, implString, effectNameLength,
146 effectName);
147 }
148
149 /* Shutdown OpenSL ES */
150 (*sl)->Destroy(sl);
151 }
152
153 //-----------------------------------------------------------------
main(int argc __unused,char * const argv[])154 int main(int argc __unused, char* const argv[])
155 {
156 SLresult result;
157 SLObjectItf sl;
158
159 fprintf(stdout, "OpenSL ES test %s: exercises SLAndroidEffectCapabilitiesItf.\n", argv[0]);
160
161 TestGenericFxCapabilities();
162
163 return EXIT_SUCCESS;
164 }
165