engine.c revision d968dacf7a35d52b6907283f3d95295a238340cc
1bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten/* 2bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten * Copyright (C) 2010 The Android Open Source Project 3bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten * 4bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 5bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten * you may not use this file except in compliance with the License. 6bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten * You may obtain a copy of the License at 7bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten * 8bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 9bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten * 10bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten * Unless required by applicable law or agreed to in writing, software 11bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 12bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten * See the License for the specific language governing permissions and 14bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten * limitations under the License. 15bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten */ 16bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten 17bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten#include "SLES/OpenSLES.h" 18b11def0293629d4d44ddbcd8a27c63504fd80ce1Glenn Kasten#include "OpenSLESUT.h" 19bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten#include <assert.h> 20bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten#include <stdio.h> 21bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten#include <stdlib.h> 22bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten#include <string.h> 23bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten 24bf4147433b223bf98a7177d778d422a89c90e965Glenn Kastenint main(int argc, char **argv) 25bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten{ 26bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten printf("Get number of available engine interfaces\n"); 27bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten SLresult result; 28bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten SLuint32 numSupportedInterfaces = 12345; 29bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten result = slQueryNumSupportedEngineInterfaces(&numSupportedInterfaces); 30bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten assert(SL_RESULT_SUCCESS == result); 3167829bfddb97775be06af15dd8181611b4af581eGlenn Kasten result = slQueryNumSupportedEngineInterfaces(NULL); 3267829bfddb97775be06af15dd8181611b4af581eGlenn Kasten assert(SL_RESULT_PARAMETER_INVALID == result); 3367829bfddb97775be06af15dd8181611b4af581eGlenn Kasten 34d968dacf7a35d52b6907283f3d95295a238340ccGlenn Kasten printf("Engine number of supported interfaces %u\n", numSupportedInterfaces); 3567829bfddb97775be06af15dd8181611b4af581eGlenn Kasten SLInterfaceID *engine_ids = calloc(numSupportedInterfaces+1, sizeof(SLInterfaceID)); 36bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten assert(engine_ids != NULL); 3767829bfddb97775be06af15dd8181611b4af581eGlenn Kasten SLboolean *engine_req = calloc(numSupportedInterfaces+1, sizeof(SLboolean)); 38bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten assert(engine_req != NULL); 3967829bfddb97775be06af15dd8181611b4af581eGlenn Kasten 40bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten printf("Display the ID of each available interface\n"); 41bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten SLuint32 index; 42bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten for (index = 0; index < numSupportedInterfaces + 1; ++index) { 43bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten SLInterfaceID interfaceID; 44bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten memset(&interfaceID, 0x55, sizeof(interfaceID)); 45bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten result = slQuerySupportedEngineInterfaces(index, &interfaceID); 46bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten if (index < numSupportedInterfaces) { 47bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten assert(SL_RESULT_SUCCESS == result); 48d968dacf7a35d52b6907283f3d95295a238340ccGlenn Kasten printf("interface[%u] ", index); 49bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten slesutPrintIID(interfaceID); 50bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten engine_ids[index] = interfaceID; 51bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten engine_req[index] = SL_BOOLEAN_TRUE; 52bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten } else { 53bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten assert(SL_RESULT_PARAMETER_INVALID == result); 54bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten } 5567829bfddb97775be06af15dd8181611b4af581eGlenn Kasten result = slQuerySupportedEngineInterfaces(index, NULL); 5667829bfddb97775be06af15dd8181611b4af581eGlenn Kasten assert(SL_RESULT_PARAMETER_INVALID == result); 57bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten } 5867829bfddb97775be06af15dd8181611b4af581eGlenn Kasten 59bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten printf("Create an engine and request all available interfaces\n"); 60bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten SLObjectItf engineObject; 6167829bfddb97775be06af15dd8181611b4af581eGlenn Kasten if (0 < numSupportedInterfaces) { 6267829bfddb97775be06af15dd8181611b4af581eGlenn Kasten printf("Create engine with numSupportedInterfaces > 0 but NULL pointers\n"); 6367829bfddb97775be06af15dd8181611b4af581eGlenn Kasten result = slCreateEngine(&engineObject, 0, NULL, numSupportedInterfaces, engine_ids, NULL); 6467829bfddb97775be06af15dd8181611b4af581eGlenn Kasten assert(SL_RESULT_PARAMETER_INVALID == result); 6567829bfddb97775be06af15dd8181611b4af581eGlenn Kasten assert(NULL == engineObject); 6667829bfddb97775be06af15dd8181611b4af581eGlenn Kasten result = slCreateEngine(&engineObject, 0, NULL, numSupportedInterfaces, NULL, engine_req); 6767829bfddb97775be06af15dd8181611b4af581eGlenn Kasten assert(SL_RESULT_PARAMETER_INVALID == result); 6867829bfddb97775be06af15dd8181611b4af581eGlenn Kasten assert(NULL == engineObject); 6967829bfddb97775be06af15dd8181611b4af581eGlenn Kasten } 7067829bfddb97775be06af15dd8181611b4af581eGlenn Kasten 7167829bfddb97775be06af15dd8181611b4af581eGlenn Kasten printf("Create engine with no place to return the new engine object\n"); 7267829bfddb97775be06af15dd8181611b4af581eGlenn Kasten result = slCreateEngine(NULL, 0, NULL, numSupportedInterfaces, engine_ids, engine_req); 7367829bfddb97775be06af15dd8181611b4af581eGlenn Kasten assert(SL_RESULT_PARAMETER_INVALID == result); 7467829bfddb97775be06af15dd8181611b4af581eGlenn Kasten 7567829bfddb97775be06af15dd8181611b4af581eGlenn Kasten printf("Create engine with NULL interface pointer\n"); 7667829bfddb97775be06af15dd8181611b4af581eGlenn Kasten SLInterfaceID null_id[1] = {NULL}; 7767829bfddb97775be06af15dd8181611b4af581eGlenn Kasten SLboolean null_req[1] = {SL_BOOLEAN_FALSE}; 7867829bfddb97775be06af15dd8181611b4af581eGlenn Kasten result = slCreateEngine(&engineObject, 0, NULL, 1, null_id, null_req); 7967829bfddb97775be06af15dd8181611b4af581eGlenn Kasten assert(SL_RESULT_PARAMETER_INVALID == result); 8067829bfddb97775be06af15dd8181611b4af581eGlenn Kasten assert(NULL == engineObject); 8167829bfddb97775be06af15dd8181611b4af581eGlenn Kasten 8267829bfddb97775be06af15dd8181611b4af581eGlenn Kasten printf("Create an engine with numOptions > 0 but NULL pointer\n"); 8367829bfddb97775be06af15dd8181611b4af581eGlenn Kasten result = slCreateEngine(&engineObject, 1, NULL, 0, NULL, NULL); 8467829bfddb97775be06af15dd8181611b4af581eGlenn Kasten assert(SL_RESULT_PARAMETER_INVALID == result); 8567829bfddb97775be06af15dd8181611b4af581eGlenn Kasten assert(NULL == engineObject); 8667829bfddb97775be06af15dd8181611b4af581eGlenn Kasten SLEngineOption options[2]; 8767829bfddb97775be06af15dd8181611b4af581eGlenn Kasten options[0].feature = 0x12345; 8867829bfddb97775be06af15dd8181611b4af581eGlenn Kasten options[0].data = 0; 8967829bfddb97775be06af15dd8181611b4af581eGlenn Kasten 9067829bfddb97775be06af15dd8181611b4af581eGlenn Kasten printf("Create engine with non-sensical option\n"); 9167829bfddb97775be06af15dd8181611b4af581eGlenn Kasten result = slCreateEngine(&engineObject, 1, options, 0, NULL, NULL); 9267829bfddb97775be06af15dd8181611b4af581eGlenn Kasten assert(SL_RESULT_PARAMETER_INVALID == result); 9367829bfddb97775be06af15dd8181611b4af581eGlenn Kasten assert(NULL == engineObject); 9467829bfddb97775be06af15dd8181611b4af581eGlenn Kasten 9567829bfddb97775be06af15dd8181611b4af581eGlenn Kasten printf("Create an engine and require non-sensical volume interface\n"); 9667829bfddb97775be06af15dd8181611b4af581eGlenn Kasten engine_ids[numSupportedInterfaces] = SL_IID_VOLUME; 9767829bfddb97775be06af15dd8181611b4af581eGlenn Kasten engine_req[numSupportedInterfaces] = SL_BOOLEAN_TRUE; 9867829bfddb97775be06af15dd8181611b4af581eGlenn Kasten result = slCreateEngine(&engineObject, 0, NULL, numSupportedInterfaces+1, engine_ids, 9967829bfddb97775be06af15dd8181611b4af581eGlenn Kasten engine_req); 10067829bfddb97775be06af15dd8181611b4af581eGlenn Kasten assert(SL_RESULT_FEATURE_UNSUPPORTED == result); 10167829bfddb97775be06af15dd8181611b4af581eGlenn Kasten assert(NULL == engineObject); 10267829bfddb97775be06af15dd8181611b4af581eGlenn Kasten 10367829bfddb97775be06af15dd8181611b4af581eGlenn Kasten printf("Create an engine and politely request a non-sensical interface with options\n"); 10467829bfddb97775be06af15dd8181611b4af581eGlenn Kasten engine_req[numSupportedInterfaces] = SL_BOOLEAN_FALSE; 10567829bfddb97775be06af15dd8181611b4af581eGlenn Kasten options[0].feature = SL_ENGINEOPTION_THREADSAFE; 10667829bfddb97775be06af15dd8181611b4af581eGlenn Kasten options[0].data = (SLuint32) SL_BOOLEAN_TRUE; 10767829bfddb97775be06af15dd8181611b4af581eGlenn Kasten options[1].feature = SL_ENGINEOPTION_LOSSOFCONTROL; 10867829bfddb97775be06af15dd8181611b4af581eGlenn Kasten options[1].data = (SLuint32) SL_BOOLEAN_FALSE; 10967829bfddb97775be06af15dd8181611b4af581eGlenn Kasten result = slCreateEngine(&engineObject, 2, options, numSupportedInterfaces+1, engine_ids, 11067829bfddb97775be06af15dd8181611b4af581eGlenn Kasten engine_req); 111bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten assert(SL_RESULT_SUCCESS == result); 112bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten printf("Engine object %p\n", engineObject); 11367829bfddb97775be06af15dd8181611b4af581eGlenn Kasten 114bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten printf("Get each available interface before realization\n"); 115bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten for (index = 0; index < numSupportedInterfaces; ++index) { 116bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten void *interface = NULL; 117bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten // Use the interface ID as returned by slQuerySupportedEngineInterfaces 118bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten result = (*engineObject)->GetInterface(engineObject, engine_ids[index], &interface); 119d78ef68025c4de08bffaa318d0057d8affac81a1Glenn Kasten assert(SL_RESULT_SUCCESS == result || SL_RESULT_PRECONDITIONS_VIOLATED == result); 120d78ef68025c4de08bffaa318d0057d8affac81a1Glenn Kasten if (SL_RESULT_SUCCESS == result) { 121d78ef68025c4de08bffaa318d0057d8affac81a1Glenn Kasten printf("interface available pre-realize: "); 122d78ef68025c4de08bffaa318d0057d8affac81a1Glenn Kasten slesutPrintIID(engine_ids[index]); 123d78ef68025c4de08bffaa318d0057d8affac81a1Glenn Kasten } 124bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten } 12567829bfddb97775be06af15dd8181611b4af581eGlenn Kasten 126bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten printf("Destroy engine before realization\n"); 127bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten (*engineObject)->Destroy(engineObject); 12867829bfddb97775be06af15dd8181611b4af581eGlenn Kasten 129bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten printf("Create engine again\n"); 130bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten result = slCreateEngine(&engineObject, 0, NULL, numSupportedInterfaces, engine_ids, engine_req); 131bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten assert(SL_RESULT_SUCCESS == result); 132bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten printf("Engine object %p\n", engineObject); 13367829bfddb97775be06af15dd8181611b4af581eGlenn Kasten 134bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten printf("Realize the engine\n"); 135bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE); 136bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten assert(SL_RESULT_SUCCESS == result); 13767829bfddb97775be06af15dd8181611b4af581eGlenn Kasten 138bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten printf("Get each available interface after realization\n"); 139bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten for (index = 0; index < numSupportedInterfaces; ++index) { 140bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten void *interface = NULL; 141bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten result = (*engineObject)->GetInterface(engineObject, engine_ids[index], &interface); 142bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten assert(SL_RESULT_SUCCESS == result); 143d968dacf7a35d52b6907283f3d95295a238340ccGlenn Kasten printf("interface[%u] %p\n", index, interface); 144bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten // Use a copy of the interface ID to make sure lookup is not purely relying on address 145bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten void *interface_again = NULL; 146bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten struct SLInterfaceID_ copy = *engine_ids[index]; 147bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten result = (*engineObject)->GetInterface(engineObject, ©, &interface_again); 148bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten assert(SL_RESULT_SUCCESS == result); 149bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten // Calling GetInterface multiple times should return the same interface 150bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten assert(interface_again == interface); 151bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten } 15267829bfddb97775be06af15dd8181611b4af581eGlenn Kasten 153d78ef68025c4de08bffaa318d0057d8affac81a1Glenn Kasten SLObjectItf engineObject2; 154b11def0293629d4d44ddbcd8a27c63504fd80ce1Glenn Kasten#if 0 155b11def0293629d4d44ddbcd8a27c63504fd80ce1Glenn Kasten printf("Create too many engines\n"); 156d78ef68025c4de08bffaa318d0057d8affac81a1Glenn Kasten result = slCreateEngine(&engineObject2, 0, NULL, 0, NULL, NULL); 157d78ef68025c4de08bffaa318d0057d8affac81a1Glenn Kasten assert(SL_RESULT_RESOURCE_ERROR == result); 158d78ef68025c4de08bffaa318d0057d8affac81a1Glenn Kasten assert(NULL == engineObject2); 159b11def0293629d4d44ddbcd8a27c63504fd80ce1Glenn Kasten#endif 16067829bfddb97775be06af15dd8181611b4af581eGlenn Kasten 161bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten printf("Destroy engine\n"); 162bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten (*engineObject)->Destroy(engineObject); 16367829bfddb97775be06af15dd8181611b4af581eGlenn Kasten 164d78ef68025c4de08bffaa318d0057d8affac81a1Glenn Kasten printf("Now should be able to create another engine\n"); 165d78ef68025c4de08bffaa318d0057d8affac81a1Glenn Kasten result = slCreateEngine(&engineObject2, 0, NULL, 0, NULL, NULL); 166d78ef68025c4de08bffaa318d0057d8affac81a1Glenn Kasten assert(SL_RESULT_SUCCESS == result); 16767829bfddb97775be06af15dd8181611b4af581eGlenn Kasten 168d78ef68025c4de08bffaa318d0057d8affac81a1Glenn Kasten printf("Exit without destroying engine -- examine log for expected error message\n"); 1693f324661dd8bf33dd3fb2afeb84fbb05262a0d08Glenn Kasten free(engine_ids); 1703f324661dd8bf33dd3fb2afeb84fbb05262a0d08Glenn Kasten free(engine_req); 171bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten return EXIT_SUCCESS; 172bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten} 173