11d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten/* 21d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten * Copyright (C) 2010 The Android Open Source Project 31d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten * 41d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 51d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten * you may not use this file except in compliance with the License. 61d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten * You may obtain a copy of the License at 71d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten * 81d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 91d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten * 101d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten * Unless required by applicable law or agreed to in writing, software 111d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 121d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten * See the License for the specific language governing permissions and 141d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten * limitations under the License. 151d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten */ 161d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten 17c6853892c94800e72c0bd676d5d2136d48cea76eGlenn Kasten#include <SLES/OpenSLES.h> 18be2218961ac506ba9c2be0dddb2f74debd283bb8Glenn Kasten#include "OpenSLESUT.h" 191d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten#include <assert.h> 201d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten#include <stdio.h> 211d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten#include <stdlib.h> 221d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten#include <string.h> 231d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten 241d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kastenint main(int argc, char **argv) 251d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten{ 261d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten printf("Get number of available engine interfaces\n"); 271d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten SLresult result; 281d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten SLuint32 numSupportedInterfaces = 12345; 291d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten result = slQueryNumSupportedEngineInterfaces(&numSupportedInterfaces); 301d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten assert(SL_RESULT_SUCCESS == result); 317126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten result = slQueryNumSupportedEngineInterfaces(NULL); 327126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten assert(SL_RESULT_PARAMETER_INVALID == result); 337126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten 3458432eb9cea995c69b4f905e68b38c1b8216edebGlenn Kasten printf("Engine number of supported interfaces %u\n", numSupportedInterfaces); 357126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten SLInterfaceID *engine_ids = calloc(numSupportedInterfaces+1, sizeof(SLInterfaceID)); 361d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten assert(engine_ids != NULL); 377126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten SLboolean *engine_req = calloc(numSupportedInterfaces+1, sizeof(SLboolean)); 381d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten assert(engine_req != NULL); 397126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten 401d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten printf("Display the ID of each available interface\n"); 411d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten SLuint32 index; 421d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten for (index = 0; index < numSupportedInterfaces + 1; ++index) { 431d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten SLInterfaceID interfaceID; 441d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten memset(&interfaceID, 0x55, sizeof(interfaceID)); 451d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten result = slQuerySupportedEngineInterfaces(index, &interfaceID); 461d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten if (index < numSupportedInterfaces) { 471d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten assert(SL_RESULT_SUCCESS == result); 4858432eb9cea995c69b4f905e68b38c1b8216edebGlenn Kasten printf("interface[%u] ", index); 491d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten slesutPrintIID(interfaceID); 501d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten engine_ids[index] = interfaceID; 511d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten engine_req[index] = SL_BOOLEAN_TRUE; 521d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten } else { 531d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten assert(SL_RESULT_PARAMETER_INVALID == result); 541d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten } 557126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten result = slQuerySupportedEngineInterfaces(index, NULL); 567126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten assert(SL_RESULT_PARAMETER_INVALID == result); 571d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten } 587126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten 591d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten printf("Create an engine and request all available interfaces\n"); 601d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten SLObjectItf engineObject; 617126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten if (0 < numSupportedInterfaces) { 627126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten printf("Create engine with numSupportedInterfaces > 0 but NULL pointers\n"); 637126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten result = slCreateEngine(&engineObject, 0, NULL, numSupportedInterfaces, engine_ids, NULL); 647126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten assert(SL_RESULT_PARAMETER_INVALID == result); 657126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten assert(NULL == engineObject); 667126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten result = slCreateEngine(&engineObject, 0, NULL, numSupportedInterfaces, NULL, engine_req); 677126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten assert(SL_RESULT_PARAMETER_INVALID == result); 687126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten assert(NULL == engineObject); 697126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten } 707126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten 717126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten printf("Create engine with no place to return the new engine object\n"); 727126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten result = slCreateEngine(NULL, 0, NULL, numSupportedInterfaces, engine_ids, engine_req); 737126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten assert(SL_RESULT_PARAMETER_INVALID == result); 747126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten 757126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten printf("Create engine with NULL interface pointer\n"); 767126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten SLInterfaceID null_id[1] = {NULL}; 777126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten SLboolean null_req[1] = {SL_BOOLEAN_FALSE}; 787126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten result = slCreateEngine(&engineObject, 0, NULL, 1, null_id, null_req); 797126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten assert(SL_RESULT_PARAMETER_INVALID == result); 807126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten assert(NULL == engineObject); 817126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten 827126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten printf("Create an engine with numOptions > 0 but NULL pointer\n"); 837126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten result = slCreateEngine(&engineObject, 1, NULL, 0, NULL, NULL); 847126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten assert(SL_RESULT_PARAMETER_INVALID == result); 857126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten assert(NULL == engineObject); 867126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten SLEngineOption options[2]; 877126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten options[0].feature = 0x12345; 887126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten options[0].data = 0; 897126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten 907126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten printf("Create engine with non-sensical option\n"); 917126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten result = slCreateEngine(&engineObject, 1, options, 0, NULL, NULL); 927126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten assert(SL_RESULT_PARAMETER_INVALID == result); 937126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten assert(NULL == engineObject); 947126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten 957126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten printf("Create an engine and require non-sensical volume interface\n"); 967126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten engine_ids[numSupportedInterfaces] = SL_IID_VOLUME; 977126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten engine_req[numSupportedInterfaces] = SL_BOOLEAN_TRUE; 987126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten result = slCreateEngine(&engineObject, 0, NULL, numSupportedInterfaces+1, engine_ids, 997126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten engine_req); 1007126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten assert(SL_RESULT_FEATURE_UNSUPPORTED == result); 1017126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten assert(NULL == engineObject); 1027126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten 1037126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten printf("Create an engine and politely request a non-sensical interface with options\n"); 1047126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten engine_req[numSupportedInterfaces] = SL_BOOLEAN_FALSE; 1057126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten options[0].feature = SL_ENGINEOPTION_THREADSAFE; 1067126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten options[0].data = (SLuint32) SL_BOOLEAN_TRUE; 1077126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten options[1].feature = SL_ENGINEOPTION_LOSSOFCONTROL; 1087126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten options[1].data = (SLuint32) SL_BOOLEAN_FALSE; 1097126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten result = slCreateEngine(&engineObject, 2, options, numSupportedInterfaces+1, engine_ids, 1107126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten engine_req); 1111d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten assert(SL_RESULT_SUCCESS == result); 1121d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten printf("Engine object %p\n", engineObject); 1137126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten 1141d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten printf("Get each available interface before realization\n"); 1151d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten for (index = 0; index < numSupportedInterfaces; ++index) { 1161d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten void *interface = NULL; 1171d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten // Use the interface ID as returned by slQuerySupportedEngineInterfaces 1181d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten result = (*engineObject)->GetInterface(engineObject, engine_ids[index], &interface); 119711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten assert(SL_RESULT_SUCCESS == result || SL_RESULT_PRECONDITIONS_VIOLATED == result); 120711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten if (SL_RESULT_SUCCESS == result) { 121711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten printf("interface available pre-realize: "); 122711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten slesutPrintIID(engine_ids[index]); 123711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten } 1241d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten } 1257126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten 1261d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten printf("Destroy engine before realization\n"); 1271d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten (*engineObject)->Destroy(engineObject); 1287126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten 1291d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten printf("Create engine again\n"); 1301d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten result = slCreateEngine(&engineObject, 0, NULL, numSupportedInterfaces, engine_ids, engine_req); 1311d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten assert(SL_RESULT_SUCCESS == result); 1321d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten printf("Engine object %p\n", engineObject); 1337126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten 1341d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten printf("Realize the engine\n"); 1351d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE); 1361d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten assert(SL_RESULT_SUCCESS == result); 1377126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten 1381d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten printf("Get each available interface after realization\n"); 1391d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten for (index = 0; index < numSupportedInterfaces; ++index) { 1401d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten void *interface = NULL; 1411d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten result = (*engineObject)->GetInterface(engineObject, engine_ids[index], &interface); 1421d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten assert(SL_RESULT_SUCCESS == result); 14358432eb9cea995c69b4f905e68b38c1b8216edebGlenn Kasten printf("interface[%u] %p\n", index, interface); 1441d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten // Use a copy of the interface ID to make sure lookup is not purely relying on address 1451d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten void *interface_again = NULL; 1461d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten struct SLInterfaceID_ copy = *engine_ids[index]; 1471d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten result = (*engineObject)->GetInterface(engineObject, ©, &interface_again); 1481d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten assert(SL_RESULT_SUCCESS == result); 1491d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten // Calling GetInterface multiple times should return the same interface 1501d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten assert(interface_again == interface); 1511d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten } 1527126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten 153711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten SLObjectItf engineObject2; 154b8738cd33a43cf03f67534dd7ea567d1354cfcceGlenn Kasten#if 0 155b8738cd33a43cf03f67534dd7ea567d1354cfcceGlenn Kasten printf("Create too many engines\n"); 156711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten result = slCreateEngine(&engineObject2, 0, NULL, 0, NULL, NULL); 157711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten assert(SL_RESULT_RESOURCE_ERROR == result); 158711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten assert(NULL == engineObject2); 159b8738cd33a43cf03f67534dd7ea567d1354cfcceGlenn Kasten#endif 1607126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten 1611d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten printf("Destroy engine\n"); 1621d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten (*engineObject)->Destroy(engineObject); 1637126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten 164711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten printf("Now should be able to create another engine\n"); 165711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten result = slCreateEngine(&engineObject2, 0, NULL, 0, NULL, NULL); 166711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten assert(SL_RESULT_SUCCESS == result); 1677126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten 168711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten printf("Exit without destroying engine -- examine log for expected error message\n"); 169e31a69fcbe27894a597176d05a08e04c06092021Glenn Kasten free(engine_ids); 170e31a69fcbe27894a597176d05a08e04c06092021Glenn Kasten free(engine_req); 1711d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten return EXIT_SUCCESS; 1721d8ab068ca8a72771514b443b42003ca06623d5eGlenn Kasten} 173