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 #ifdef ANDROID
21 #include <SLES/OpenSLES_Android.h>
22 #endif
23 #include "OpenSLESUT.h"
24 #include <stdio.h>
25 #include <string.h>
26 
27 
28 /** \brief Maps an interface ID to its display name */
29 
30 typedef struct
31 {
32     const SLInterfaceID *iid;   ///< The interface ID
33     const char *name;           ///< The display name
34 } Pair;
35 
36 // ## is token concatenation e.g. a##b becomes ab
37 // # is stringize operator to convert a symbol to a string constant e.g. #a becomes "a"
38 
39 #define _(x) { &SL_IID_##x, #x }
40 
41 /** \brief Array of mappings from interface IDs to display names */
42 
43 static Pair pairs[] = {
44     _(3DCOMMIT),
45     _(3DDOPPLER),
46     _(3DGROUPING),
47     _(3DLOCATION),
48     _(3DMACROSCOPIC),
49     _(3DSOURCE),
50     _(AUDIODECODERCAPABILITIES),
51     _(AUDIOENCODER),
52     _(AUDIOENCODERCAPABILITIES),
53     _(AUDIOIODEVICECAPABILITIES),
54     _(BASSBOOST),
55     _(BUFFERQUEUE),
56     _(DEVICEVOLUME),
57     _(DYNAMICINTERFACEMANAGEMENT),
58     _(DYNAMICSOURCE),
59     _(EFFECTSEND),
60     _(ENGINE),
61     _(ENGINECAPABILITIES),
62     _(ENVIRONMENTALREVERB),
63     _(EQUALIZER),
64     _(LED),
65     _(METADATAEXTRACTION),
66     _(METADATATRAVERSAL),
67     _(MIDIMESSAGE),
68     _(MIDIMUTESOLO),
69     _(MIDITEMPO),
70     _(MIDITIME),
71     _(MUTESOLO),
72     _(NULL),
73     _(OBJECT),
74     _(OUTPUTMIX),
75     _(PITCH),
76     _(PLAY),
77     _(PLAYBACKRATE),
78     _(PREFETCHSTATUS),
79     _(PRESETREVERB),
80     _(RATEPITCH),
81     _(RECORD),
82     _(SEEK),
83     _(THREADSYNC),
84     _(VIBRA),
85     _(VIRTUALIZER),
86     _(VISUALIZATION),
87     _(VOLUME),
88 #if 0 // ifdef USE_OUTPUTMIXEXT
89     _(OUTPUTMIXEXT),
90 #endif
91 #ifdef ANDROID
92     _(ANDROIDEFFECT),
93     _(ANDROIDEFFECTCAPABILITIES),
94     _(ANDROIDEFFECTSEND),
95     _(ANDROIDCONFIGURATION),
96     _(ANDROIDSIMPLEBUFFERQUEUE),
97     _(ANDROIDACOUSTICECHOCANCELLATION),
98     _(ANDROIDAUTOMATICGAINCONTROL),
99     _(ANDROIDNOISESUPPRESSION)
100 #endif
101 };
102 
103 
104 /** \brief Print an interface ID in human-readable format */
105 
slesutPrintIID(SLInterfaceID iid)106 void slesutPrintIID(SLInterfaceID iid)
107 {
108     Pair *p;
109     const Pair *end = &pairs[sizeof(pairs)/sizeof(pairs[0])];
110     for (p = pairs; p != end; ++p) {
111         if (!memcmp(*p->iid, iid, sizeof(struct SLInterfaceID_))) {
112             printf("SL_IID_%s = ", p->name);
113             break;
114         }
115     }
116     printf(
117         "{ 0x%08X, 0x%04X, 0x%04X, 0x%04X, { 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X } }\n",
118         (unsigned) iid->time_low, iid->time_mid, iid->time_hi_and_version, iid->clock_seq,
119         iid->node[0], iid->node[1], iid->node[2], iid->node[3], iid->node[4], iid->node[5]);
120 }
121 
122 
123 /** \brief Print an array of interface IDs in human-readable format,
124  *  including whether they are required or optional
125  */
126 
slesutPrintIIDs(SLInterfaceID * pInterfaceIds,SLboolean * pInterfaceRequired,unsigned numInterfaces)127 void slesutPrintIIDs(SLInterfaceID *pInterfaceIds, SLboolean *pInterfaceRequired,
128     unsigned numInterfaces)
129 {
130     unsigned i;
131     for (i = 0; i < numInterfaces; ++i) {
132         printf("interfaces[%u]=", i);
133         slesutPrintIID(pInterfaceIds[i]);
134         printf(" %s\n", (unsigned) pInterfaceRequired[i] ? "required" : "optional");
135     }
136 }
137 
138 
139 /** \brief Convert an object ID to a string or NULL. */
140 
slesutObjectIDToString(SLuint32 objectID)141 const char *slesutObjectIDToString(SLuint32 objectID)
142 {
143     static const char * const objectIDstrings[10] = {
144         "SL_OBJECTID_ENGINE",
145         "SL_OBJECTID_LEDDEVICE",
146         "SL_OBJECTID_VIBRADEVICE",
147         "SL_OBJECTID_AUDIOPLAYER",
148         "SL_OBJECTID_AUDIORECORDER",
149         "SL_OBJECTID_MIDIPLAYER",
150         "SL_OBJECTID_LISTENER",
151         "SL_OBJECTID_3DGROUP",
152         "SL_OBJECTID_OUTPUTMIX",
153         "SL_OBJECTID_METADATAEXTRACTOR"
154     };
155     return (0x1001 <= objectID) && (objectID <= 0x100A) ? objectIDstrings[objectID - 0x1001] : NULL;
156 }
157