1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17/** \file OpenSLESUT.c OpenSL ES Utility Toolkit */
18
19#include <SLES/OpenSLES.h>
20#include <OMXAL/OpenMAXAL.h>
21#ifdef ANDROID
22#include <SLES/OpenSLES_Android.h>
23#include <OMXAL/OpenMAXAL_Android.h>
24#endif
25#include "OpenSLESUT.h"
26#include <stdio.h>
27#include <string.h>
28
29
30/** \brief Maps an interface ID to its display name */
31
32typedef struct
33{
34    const SLInterfaceID *iid;   ///< The interface ID
35    const char *name;           ///< The display name
36} Pair;
37
38// ## is token concatenation e.g. a##b becomes ab
39// # is stringize operator to convert a symbol to a string constant e.g. #a becomes "a"
40
41#define _(x) { &SL_IID_##x, "SL_IID_" #x }
42#define _X(x) { (const SLInterfaceID *) &XA_IID_##x, "XA_IID_" #x }
43
44/** \brief Array of mappings from interface IDs to display names */
45
46static Pair pairs[] = {
47    _(3DCOMMIT),
48    _(3DDOPPLER),
49    _(3DGROUPING),
50    _(3DLOCATION),
51    _(3DMACROSCOPIC),
52    _(3DSOURCE),
53    _(AUDIODECODERCAPABILITIES),
54    _(AUDIOENCODER),
55    _(AUDIOENCODERCAPABILITIES),
56    _(AUDIOIODEVICECAPABILITIES),
57    _(BASSBOOST),
58    _(BUFFERQUEUE),
59    _(DEVICEVOLUME),
60    _(DYNAMICINTERFACEMANAGEMENT),
61    _(DYNAMICSOURCE),
62    _(EFFECTSEND),
63    _(ENGINE),
64    _(ENGINECAPABILITIES),
65    _(ENVIRONMENTALREVERB),
66    _(EQUALIZER),
67    _(LED),
68    _(METADATAEXTRACTION),
69    _(METADATATRAVERSAL),
70    _(MIDIMESSAGE),
71    _(MIDIMUTESOLO),
72    _(MIDITEMPO),
73    _(MIDITIME),
74    _(MUTESOLO),
75    _(NULL),
76    _(OBJECT),
77    _(OUTPUTMIX),
78    _(PITCH),
79    _(PLAY),
80    _(PLAYBACKRATE),
81    _(PREFETCHSTATUS),
82    _(PRESETREVERB),
83    _(RATEPITCH),
84    _(RECORD),
85    _(SEEK),
86    _(THREADSYNC),
87    _(VIBRA),
88    _(VIRTUALIZER),
89    _(VISUALIZATION),
90    _(VOLUME),
91#if 0 // ifdef USE_OUTPUTMIXEXT
92    _(OUTPUTMIXEXT),
93#endif
94    _X(ENGINE),
95    _X(VIDEODECODERCAPABILITIES),
96#ifdef ANDROID
97    _(ANDROIDEFFECT),
98    _(ANDROIDEFFECTCAPABILITIES),
99    _(ANDROIDEFFECTSEND),
100    _(ANDROIDCONFIGURATION),
101    _(ANDROIDSIMPLEBUFFERQUEUE),
102    _(ANDROIDBUFFERQUEUESOURCE),
103    _(ANDROIDACOUSTICECHOCANCELLATION),
104    _(ANDROIDAUTOMATICGAINCONTROL),
105    _(ANDROIDNOISESUPPRESSION)
106#endif
107};
108
109
110/** \brief Print an interface ID in human-readable format */
111
112void slesutPrintIID(SLInterfaceID iid)
113{
114    Pair *p;
115    const Pair *end = &pairs[sizeof(pairs)/sizeof(pairs[0])];
116    for (p = pairs; p != end; ++p) {
117        if (!memcmp(*p->iid, iid, sizeof(struct SLInterfaceID_))) {
118            printf("SL_IID_%s = ", p->name);
119            break;
120        }
121    }
122    printf(
123        "{ 0x%08X, 0x%04X, 0x%04X, 0x%04X, { 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X } }\n",
124        (unsigned) iid->time_low, iid->time_mid, iid->time_hi_and_version, iid->clock_seq,
125        iid->node[0], iid->node[1], iid->node[2], iid->node[3], iid->node[4], iid->node[5]);
126}
127
128
129/** \brief Print an array of interface IDs in human-readable format,
130 *  including whether they are required or optional
131 */
132
133void slesutPrintIIDs(SLInterfaceID *pInterfaceIds, SLboolean *pInterfaceRequired,
134    unsigned numInterfaces)
135{
136    unsigned i;
137    for (i = 0; i < numInterfaces; ++i) {
138        printf("interfaces[%u]=", i);
139        slesutPrintIID(pInterfaceIds[i]);
140        printf(" %s\n", (unsigned) pInterfaceRequired[i] ? "required" : "optional");
141    }
142}
143
144
145/** \brief Convert an object ID to a string or NULL. */
146
147const char *slesutObjectIDToString(SLuint32 objectID)
148{
149    static const char * const objectIDstrings[10] = {
150        "SL_OBJECTID_ENGINE",
151        "SL_OBJECTID_LEDDEVICE",
152        "SL_OBJECTID_VIBRADEVICE",
153        "SL_OBJECTID_AUDIOPLAYER",
154        "SL_OBJECTID_AUDIORECORDER",
155        "SL_OBJECTID_MIDIPLAYER",
156        "SL_OBJECTID_LISTENER",
157        "SL_OBJECTID_3DGROUP",
158        "SL_OBJECTID_OUTPUTMIX",
159        "SL_OBJECTID_METADATAEXTRACTOR"
160    };
161    return (0x1001 <= objectID) && (objectID <= 0x100A) ? objectIDstrings[objectID - 0x1001] : NULL;
162}
163