object.c revision 7126c25d7c037e5086216cf540ecf40779c3585a
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> 21c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#include "SLES/OpenSLES.h" 22c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#include "SLES/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) { 48c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten printf("object ID %lx", 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); 68c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten printf("numSupportedInterfaces %lu\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); 76c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten printf(" interface %lu ", 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); 897126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten printf("numExtensions = %lu\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); 997126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten printf(" extension[%lu] 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))); 1397126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten printf(" extension[%lu] = \"%.*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 1597126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten supportedExt = (SLchar *) "ANDROID_NDK_LEVEL_9"; 1607126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten#else 1617126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten supportedExt = (SLchar *) "WILHELM_DESKTOP"; 1627126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten#endif 1637126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten isSupported = SL_BOOLEAN_FALSE; 1647126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten result = (*engineEngine)->IsExtensionSupported(engineEngine, supportedExt, &isSupported); 1657126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten assert(SL_RESULT_SUCCESS == result); 1667126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten assert(SL_BOOLEAN_TRUE == isSupported); 1677126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten // create an extension object with no place to put the new object 1687126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten result = (*engineEngine)->CreateExtensionObject(engineEngine, NULL, NULL, 0x123, 0, NULL, NULL); 1697126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten assert(SL_RESULT_PARAMETER_INVALID == result); 1707126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten // create an extension object, which is unsupported 1717126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten SLObjectItf extensionObject; 1727126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten result = (*engineEngine)->CreateExtensionObject(engineEngine, &extensionObject, NULL, 0x123, 0, 1737126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten NULL, NULL); 1747126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten assert(SL_RESULT_FEATURE_UNSUPPORTED == result); 1757126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten assert(NULL == extensionObject); 1767126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten // destroy engine 1777126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten (*engineObject)->Destroy(engineObject); 178c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten return EXIT_SUCCESS; 179c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten} 180