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
24int main(int arg, char **argv)
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_13";
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