1c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten/*
2c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten * Copyright (C) 2010 The Android Open Source Project
3c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten *
4c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
5c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten * you may not use this file except in compliance with the License.
6c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten * You may obtain a copy of the License at
7c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten *
8c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
9c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten *
10c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten * Unless required by applicable law or agreed to in writing, software
11c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
12c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten * See the License for the specific language governing permissions and
14c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten * limitations under the License.
15c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten */
16c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
17c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#include <assert.h>
18c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#include <stdio.h>
19c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#include <stdlib.h>
207126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten#include <string.h>
21c6853892c94800e72c0bd676d5d2136d48cea76eGlenn Kasten#include <SLES/OpenSLES.h>
22be2218961ac506ba9c2be0dddb2f74debd283bb8Glenn Kasten#include "OpenSLESUT.h"
23c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
24c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kastenint main(int arg, char **argv)
25c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten{
26c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    SLresult result;
27c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
28c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    printf("Create engine\n");
29c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    SLObjectItf engineObject;
30c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    // create engine
31c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL);
32c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    assert(SL_RESULT_SUCCESS == result);
33c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);
34c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    assert(SL_RESULT_SUCCESS == result);
35c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    SLEngineItf engineEngine;
36c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine);
37c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    assert(SL_RESULT_SUCCESS == result);
387126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    SLuint32 i;
39c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    // loop through both valid and invalid object IDs
40c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    SLuint32 objectID;
417126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    // Test object IDs from one less than the first valid object
427126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    // ID, up to one more than the last valid object ID. This way
437126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    // we can test for both valid and invalid object IDs at both
447126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    // ends. If more objects are added, be sure to update the macros.
457126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten#define FIRST_VALID SL_OBJECTID_ENGINE
467126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten#define LAST_VALID  SL_OBJECTID_METADATAEXTRACTOR
477126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    for (objectID = FIRST_VALID - 1; objectID <= LAST_VALID + 1; ++objectID) {
4858432eb9cea995c69b4f905e68b38c1b8216edebGlenn Kasten        printf("object ID %x", objectID);
49c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        const char *string = slesutObjectIDToString(objectID);
50c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        if (NULL != string)
51c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten            printf(" (%s)", string);
52c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        printf(":\n");
537126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        result = (*engineEngine)->QueryNumSupportedInterfaces(engineEngine, objectID, NULL);
547126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        assert(SL_RESULT_PARAMETER_INVALID == result);
55c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        SLuint32 numSupportedInterfaces = 12345;
56c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        result = (*engineEngine)->QueryNumSupportedInterfaces(engineEngine, objectID,
57c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten                &numSupportedInterfaces);
587126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        SLInterfaceID interfaceID;
59c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        if (SL_RESULT_FEATURE_UNSUPPORTED == result) {
60c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten            printf("  unsupported\n");
617126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten            result = (*engineEngine)->QuerySupportedInterfaces(engineEngine, objectID, 0,
627126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten                &interfaceID);
637126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten            assert(SL_RESULT_FEATURE_UNSUPPORTED == result);
647126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten            assert(NULL == interfaceID);
65c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten            continue;
66c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        }
67c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        assert(SL_RESULT_SUCCESS == result);
6858432eb9cea995c69b4f905e68b38c1b8216edebGlenn Kasten        printf("numSupportedInterfaces %u\n", numSupportedInterfaces);
69c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        for (i = 0; i < numSupportedInterfaces + 1; ++i) {
707126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten            result = (*engineEngine)->QuerySupportedInterfaces(engineEngine, objectID, i, NULL);
717126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten            assert(SL_RESULT_PARAMETER_INVALID == result);
72c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten            result = (*engineEngine)->QuerySupportedInterfaces(engineEngine, objectID, i,
73c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten                    &interfaceID);
74c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten            if (i < numSupportedInterfaces) {
75c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten                assert(SL_RESULT_SUCCESS == result);
7658432eb9cea995c69b4f905e68b38c1b8216edebGlenn Kasten                printf("    interface %u ", i);
77c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten                slesutPrintIID(interfaceID);
78c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten            } else {
79c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten                assert(SL_RESULT_PARAMETER_INVALID == result);
80c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten            }
81c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        }
82c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    }
837126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    // query number of extensions
847126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    result = (*engineEngine)->QueryNumSupportedExtensions(engineEngine, NULL);
857126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    assert(SL_RESULT_PARAMETER_INVALID == result);
867126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    SLuint32 numExtensions = 0x12345;
877126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    result = (*engineEngine)->QueryNumSupportedExtensions(engineEngine, &numExtensions);
887126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    assert(SL_RESULT_SUCCESS == result);
8958432eb9cea995c69b4f905e68b38c1b8216edebGlenn Kasten    printf("numExtensions = %u\n", numExtensions);
907126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    // query names of the extensions
917126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    for (i = 0; i < numExtensions + 1; ++i) {
927126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        SLchar extensionName[32];
937126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        result = (*engineEngine)->QuerySupportedExtension(engineEngine, i, extensionName, NULL);
947126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        assert(SL_RESULT_PARAMETER_INVALID == result);
957126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        SLint16 nameLength = -1;
967126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        result = (*engineEngine)->QuerySupportedExtension(engineEngine, i, NULL, &nameLength);
977126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        if (i < numExtensions) {
987126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten            assert(SL_RESULT_SUCCESS == result);
9958432eb9cea995c69b4f905e68b38c1b8216edebGlenn Kasten            printf("    extension[%u] length = %u\n", i, nameLength);
1007126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        } else {
1017126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten            assert(SL_RESULT_PARAMETER_INVALID == result);
1027126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten            assert(0 == nameLength);
1037126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        }
1047126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        memset(extensionName, 'X', sizeof(extensionName));
1057126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        nameLength = -1;
1067126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        result = (*engineEngine)->QuerySupportedExtension(engineEngine, i, extensionName,
1077126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten                &nameLength);
1087126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        if (i < numExtensions) {
1097126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten            assert(SL_RESULT_BUFFER_INSUFFICIENT == result);
1107126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        } else {
1117126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten            assert(SL_RESULT_PARAMETER_INVALID == result);
1127126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        }
1137126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        assert('X' == extensionName[0]);
1147126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        nameLength = 0;
1157126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        result = (*engineEngine)->QuerySupportedExtension(engineEngine, i, extensionName,
1167126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten                &nameLength);
1177126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        if (i < numExtensions) {
1187126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten            assert(SL_RESULT_BUFFER_INSUFFICIENT == result);
1197126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        } else {
1207126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten            assert(SL_RESULT_PARAMETER_INVALID == result);
1217126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        }
1227126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        assert('X' == extensionName[0]);
1237126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        nameLength = 1;
1247126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        result = (*engineEngine)->QuerySupportedExtension(engineEngine, i, extensionName,
1257126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten                &nameLength);
1267126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        if (i < numExtensions) {
1277126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten            assert(SL_RESULT_BUFFER_INSUFFICIENT == result);
1287126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten            assert('\0' == extensionName[0]);
1297126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        } else {
1307126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten            assert(SL_RESULT_PARAMETER_INVALID == result);
1317126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        }
1327126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        assert('X' == extensionName[1]);
1337126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        nameLength = sizeof(extensionName);
1347126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        result = (*engineEngine)->QuerySupportedExtension(engineEngine, i, extensionName,
1357126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten                &nameLength);
1367126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        if (i < numExtensions) {
1377126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten            assert(SL_RESULT_SUCCESS == result);
1387126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten            assert((1 <= nameLength) && (nameLength <= (SLint16) sizeof(extensionName)));
13958432eb9cea995c69b4f905e68b38c1b8216edebGlenn Kasten            printf("    extension[%u] = \"%.*s\"\n", i, nameLength, extensionName);
1407126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        } else {
1417126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten            assert(SL_RESULT_PARAMETER_INVALID == result);
1427126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten            assert(0 == nameLength);
1437126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten        }
1447126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    }
1457126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    // check if extension is supported
1467126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    SLboolean isSupported = SL_BOOLEAN_TRUE;
1477126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    result = (*engineEngine)->IsExtensionSupported(engineEngine, NULL, &isSupported);
1487126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    assert(SL_RESULT_PARAMETER_INVALID == result);
1497126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    assert(SL_BOOLEAN_FALSE == isSupported);
1507126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    SLchar *unsupportedExt = (SLchar *) "fish";
1517126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    result = (*engineEngine)->IsExtensionSupported(engineEngine, unsupportedExt, NULL);
1527126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    assert(SL_RESULT_PARAMETER_INVALID == result);
1537126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    isSupported = SL_BOOLEAN_TRUE;
1547126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    result = (*engineEngine)->IsExtensionSupported(engineEngine, unsupportedExt, &isSupported);
1557126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    assert(SL_RESULT_SUCCESS == result);
1567126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    assert(SL_BOOLEAN_FALSE == isSupported);
1577126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    SLchar *supportedExt;
1587126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten#ifdef ANDROID
1594076e5009bfe70bc06a78f5aafec77af6c03201dGlenn Kasten    // whereas the implementation uses PLATFORM_SDK_VERSION, use a hard-coded value here
1604076e5009bfe70bc06a78f5aafec77af6c03201dGlenn Kasten    // so that we're actually testing for a particular expected value
1614076e5009bfe70bc06a78f5aafec77af6c03201dGlenn Kasten    supportedExt = (SLchar *) "ANDROID_SDK_LEVEL_13";
1627126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten#else
1637126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    supportedExt = (SLchar *) "WILHELM_DESKTOP";
1647126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten#endif
1657126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    isSupported = SL_BOOLEAN_FALSE;
1667126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    result = (*engineEngine)->IsExtensionSupported(engineEngine, supportedExt, &isSupported);
1677126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    assert(SL_RESULT_SUCCESS == result);
1687126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    assert(SL_BOOLEAN_TRUE == isSupported);
1697126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    // create an extension object with no place to put the new object
1707126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    result = (*engineEngine)->CreateExtensionObject(engineEngine, NULL, NULL, 0x123, 0, NULL, NULL);
1717126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    assert(SL_RESULT_PARAMETER_INVALID == result);
1727126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    // create an extension object, which is unsupported
1737126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    SLObjectItf extensionObject;
1747126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    result = (*engineEngine)->CreateExtensionObject(engineEngine, &extensionObject, NULL, 0x123, 0,
1757126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten            NULL, NULL);
1767126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    assert(SL_RESULT_FEATURE_UNSUPPORTED == result);
1777126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    assert(NULL == extensionObject);
1787126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    // destroy engine
1797126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten    (*engineObject)->Destroy(engineObject);
180c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    return EXIT_SUCCESS;
181c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten}
182