engine.c revision bf4147433b223bf98a7177d778d422a89c90e965
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"
18bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten#include "SLES/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);
31bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    printf("Engine number of supported interfaces %lu\n", numSupportedInterfaces);
32bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    SLInterfaceID *engine_ids = calloc(numSupportedInterfaces, sizeof(SLInterfaceID));
33bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    assert(engine_ids != NULL);
34bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    SLboolean *engine_req = calloc(numSupportedInterfaces, sizeof(SLboolean));
35bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    assert(engine_req != NULL);
36bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    printf("Display the ID of each available interface\n");
37bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    SLuint32 index;
38bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    for (index = 0; index < numSupportedInterfaces + 1; ++index) {
39bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten        SLInterfaceID interfaceID;
40bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten        memset(&interfaceID, 0x55, sizeof(interfaceID));
41bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten        result = slQuerySupportedEngineInterfaces(index, &interfaceID);
42bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten        if (index < numSupportedInterfaces) {
43bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten            assert(SL_RESULT_SUCCESS == result);
44bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten            printf("interface[%lu] ", index);
45bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten            slesutPrintIID(interfaceID);
46bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten            engine_ids[index] = interfaceID;
47bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten            engine_req[index] = SL_BOOLEAN_TRUE;
48bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten        } else {
49bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten            assert(SL_RESULT_PARAMETER_INVALID == result);
50bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten        }
51bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    }
52bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    printf("Create an engine and request all available interfaces\n");
53bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    SLObjectItf engineObject;
54bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    result = slCreateEngine(&engineObject, 0, NULL, numSupportedInterfaces, engine_ids, engine_req);
55bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    assert(SL_RESULT_SUCCESS == result);
56bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    printf("Engine object %p\n", engineObject);
57bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    printf("Get each available interface before realization\n");
58bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    for (index = 0; index < numSupportedInterfaces; ++index) {
59bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten        void *interface = NULL;
60bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten        // Use the interface ID as returned by slQuerySupportedEngineInterfaces
61bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten        result = (*engineObject)->GetInterface(engineObject, engine_ids[index], &interface);
62bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten        assert(SL_RESULT_PRECONDITIONS_VIOLATED == result);
63bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    }
64bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    printf("Destroy engine before realization\n");
65bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    (*engineObject)->Destroy(engineObject);
66bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    printf("Create engine again\n");
67bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    result = slCreateEngine(&engineObject, 0, NULL, numSupportedInterfaces, engine_ids, engine_req);
68bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    assert(SL_RESULT_SUCCESS == result);
69bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    printf("Engine object %p\n", engineObject);
70bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    printf("Realize the engine\n");
71bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);
72bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    assert(SL_RESULT_SUCCESS == result);
73bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    printf("Get each available interface after realization\n");
74bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    for (index = 0; index < numSupportedInterfaces; ++index) {
75bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten        void *interface = NULL;
76bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten        result = (*engineObject)->GetInterface(engineObject, engine_ids[index], &interface);
77bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten        assert(SL_RESULT_SUCCESS == result);
78bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten        printf("interface[%lu] %p\n", index, interface);
79bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten        // Use a copy of the interface ID to make sure lookup is not purely relying on address
80bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten        void *interface_again = NULL;
81bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten        struct SLInterfaceID_ copy = *engine_ids[index];
82bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten        result = (*engineObject)->GetInterface(engineObject, &copy, &interface_again);
83bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten        assert(SL_RESULT_SUCCESS == result);
84bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten        // Calling GetInterface multiple times should return the same interface
85bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten        assert(interface_again == interface);
86bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    }
87bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    printf("Destroy engine\n");
88bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    (*engineObject)->Destroy(engineObject);
89bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten    return EXIT_SUCCESS;
90bf4147433b223bf98a7177d778d422a89c90e965Glenn Kasten}
91