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 <assert.h>
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <string.h>
21 #include <SLES/OpenSLES.h>
22 #include "OpenSLESUT.h"
23 
main(int arg __unused,char ** argv __unused)24 int main(int arg __unused, char **argv __unused)
25 {
26     SLresult result;
27 
28     printf("Create engine\n");
29     SLObjectItf engineObject;
30     // create engine
31     result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL);
32     assert(SL_RESULT_SUCCESS == result);
33     result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);
34     assert(SL_RESULT_SUCCESS == result);
35     SLEngineItf engineEngine;
36     result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine);
37     assert(SL_RESULT_SUCCESS == result);
38     SLuint32 i;
39     // loop through both valid and invalid object IDs
40     SLuint32 objectID;
41     // Test object IDs from one less than the first valid object
42     // ID, up to one more than the last valid object ID. This way
43     // we can test for both valid and invalid object IDs at both
44     // ends. If more objects are added, be sure to update the macros.
45 #define FIRST_VALID SL_OBJECTID_ENGINE
46 #define LAST_VALID  SL_OBJECTID_METADATAEXTRACTOR
47     for (objectID = FIRST_VALID - 1; objectID <= LAST_VALID + 1; ++objectID) {
48         printf("object ID %x", objectID);
49         const char *string = slesutObjectIDToString(objectID);
50         if (NULL != string)
51             printf(" (%s)", string);
52         printf(":\n");
53         result = (*engineEngine)->QueryNumSupportedInterfaces(engineEngine, objectID, NULL);
54         assert(SL_RESULT_PARAMETER_INVALID == result);
55         SLuint32 numSupportedInterfaces = 12345;
56         result = (*engineEngine)->QueryNumSupportedInterfaces(engineEngine, objectID,
57                 &numSupportedInterfaces);
58         SLInterfaceID interfaceID;
59         if (SL_RESULT_FEATURE_UNSUPPORTED == result) {
60             printf("  unsupported\n");
61             result = (*engineEngine)->QuerySupportedInterfaces(engineEngine, objectID, 0,
62                 &interfaceID);
63             assert(SL_RESULT_FEATURE_UNSUPPORTED == result);
64             assert(NULL == interfaceID);
65             continue;
66         }
67         assert(SL_RESULT_SUCCESS == result);
68         printf("numSupportedInterfaces %u\n", numSupportedInterfaces);
69         for (i = 0; i < numSupportedInterfaces + 1; ++i) {
70             result = (*engineEngine)->QuerySupportedInterfaces(engineEngine, objectID, i, NULL);
71             assert(SL_RESULT_PARAMETER_INVALID == result);
72             result = (*engineEngine)->QuerySupportedInterfaces(engineEngine, objectID, i,
73                     &interfaceID);
74             if (i < numSupportedInterfaces) {
75                 assert(SL_RESULT_SUCCESS == result);
76                 printf("    interface %u ", i);
77                 slesutPrintIID(interfaceID);
78             } else {
79                 assert(SL_RESULT_PARAMETER_INVALID == result);
80             }
81         }
82     }
83     // query number of extensions
84     result = (*engineEngine)->QueryNumSupportedExtensions(engineEngine, NULL);
85     assert(SL_RESULT_PARAMETER_INVALID == result);
86     SLuint32 numExtensions = 0x12345;
87     result = (*engineEngine)->QueryNumSupportedExtensions(engineEngine, &numExtensions);
88     assert(SL_RESULT_SUCCESS == result);
89     printf("numExtensions = %u\n", numExtensions);
90     // query names of the extensions
91     for (i = 0; i < numExtensions + 1; ++i) {
92         SLchar extensionName[32];
93         result = (*engineEngine)->QuerySupportedExtension(engineEngine, i, extensionName, NULL);
94         assert(SL_RESULT_PARAMETER_INVALID == result);
95         SLint16 nameLength = -1;
96         result = (*engineEngine)->QuerySupportedExtension(engineEngine, i, NULL, &nameLength);
97         if (i < numExtensions) {
98             assert(SL_RESULT_SUCCESS == result);
99             printf("    extension[%u] length = %u\n", i, nameLength);
100         } else {
101             assert(SL_RESULT_PARAMETER_INVALID == result);
102             assert(0 == nameLength);
103         }
104         memset(extensionName, 'X', sizeof(extensionName));
105         nameLength = -1;
106         result = (*engineEngine)->QuerySupportedExtension(engineEngine, i, extensionName,
107                 &nameLength);
108         if (i < numExtensions) {
109             assert(SL_RESULT_BUFFER_INSUFFICIENT == result);
110         } else {
111             assert(SL_RESULT_PARAMETER_INVALID == result);
112         }
113         assert('X' == extensionName[0]);
114         nameLength = 0;
115         result = (*engineEngine)->QuerySupportedExtension(engineEngine, i, extensionName,
116                 &nameLength);
117         if (i < numExtensions) {
118             assert(SL_RESULT_BUFFER_INSUFFICIENT == result);
119         } else {
120             assert(SL_RESULT_PARAMETER_INVALID == result);
121         }
122         assert('X' == extensionName[0]);
123         nameLength = 1;
124         result = (*engineEngine)->QuerySupportedExtension(engineEngine, i, extensionName,
125                 &nameLength);
126         if (i < numExtensions) {
127             assert(SL_RESULT_BUFFER_INSUFFICIENT == result);
128             assert('\0' == extensionName[0]);
129         } else {
130             assert(SL_RESULT_PARAMETER_INVALID == result);
131         }
132         assert('X' == extensionName[1]);
133         nameLength = sizeof(extensionName);
134         result = (*engineEngine)->QuerySupportedExtension(engineEngine, i, extensionName,
135                 &nameLength);
136         if (i < numExtensions) {
137             assert(SL_RESULT_SUCCESS == result);
138             assert((1 <= nameLength) && (nameLength <= (SLint16) sizeof(extensionName)));
139             printf("    extension[%u] = \"%.*s\"\n", i, nameLength, extensionName);
140         } else {
141             assert(SL_RESULT_PARAMETER_INVALID == result);
142             assert(0 == nameLength);
143         }
144     }
145     // check if extension is supported
146     SLboolean isSupported = SL_BOOLEAN_TRUE;
147     result = (*engineEngine)->IsExtensionSupported(engineEngine, NULL, &isSupported);
148     assert(SL_RESULT_PARAMETER_INVALID == result);
149     assert(SL_BOOLEAN_FALSE == isSupported);
150     SLchar *unsupportedExt = (SLchar *) "fish";
151     result = (*engineEngine)->IsExtensionSupported(engineEngine, unsupportedExt, NULL);
152     assert(SL_RESULT_PARAMETER_INVALID == result);
153     isSupported = SL_BOOLEAN_TRUE;
154     result = (*engineEngine)->IsExtensionSupported(engineEngine, unsupportedExt, &isSupported);
155     assert(SL_RESULT_SUCCESS == result);
156     assert(SL_BOOLEAN_FALSE == isSupported);
157     SLchar *supportedExt;
158 #ifdef ANDROID
159     // whereas the implementation uses PLATFORM_SDK_VERSION, use a hard-coded value here
160     // so that we're actually testing for a particular expected value
161     supportedExt = (SLchar *) "ANDROID_SDK_LEVEL_25";
162 #else
163     supportedExt = (SLchar *) "WILHELM_DESKTOP";
164 #endif
165     isSupported = SL_BOOLEAN_FALSE;
166     result = (*engineEngine)->IsExtensionSupported(engineEngine, supportedExt, &isSupported);
167     assert(SL_RESULT_SUCCESS == result);
168     assert(SL_BOOLEAN_TRUE == isSupported);
169     // create an extension object with no place to put the new object
170     result = (*engineEngine)->CreateExtensionObject(engineEngine, NULL, NULL, 0x123, 0, NULL, NULL);
171     assert(SL_RESULT_PARAMETER_INVALID == result);
172     // create an extension object, which is unsupported
173     SLObjectItf extensionObject;
174     result = (*engineEngine)->CreateExtensionObject(engineEngine, &extensionObject, NULL, 0x123, 0,
175             NULL, NULL);
176     assert(SL_RESULT_FEATURE_UNSUPPORTED == result);
177     assert(NULL == extensionObject);
178     // destroy engine
179     (*engineObject)->Destroy(engineObject);
180     return EXIT_SUCCESS;
181 }
182