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