17a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten/*
27a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten * Copyright (C) 2010 The Android Open Source Project
37a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten *
47a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
57a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten * you may not use this file except in compliance with the License.
67a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten * You may obtain a copy of the License at
77a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten *
87a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
97a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten *
107a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten * Unless required by applicable law or agreed to in writing, software
117a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
127a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten * See the License for the specific language governing permissions and
147a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten * limitations under the License.
157a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten */
167a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
175dacc932cd1084e0cd746afe0a4d7e035560113cGlenn Kasten/** \file OpenSLESUT.c OpenSL ES Utility Toolkit */
187a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
19c6853892c94800e72c0bd676d5d2136d48cea76eGlenn Kasten#include <SLES/OpenSLES.h>
2001e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten#ifdef ANDROID
21c6853892c94800e72c0bd676d5d2136d48cea76eGlenn Kasten#include <SLES/OpenSLES_Android.h>
2201e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten#endif
235dacc932cd1084e0cd746afe0a4d7e035560113cGlenn Kasten#include "OpenSLESUT.h"
247a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#include <stdio.h>
257a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#include <string.h>
267a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
277a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
28369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten/** \brief Maps an interface ID to its display name */
29369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten
307a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kastentypedef struct
317a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten{
32369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten    const SLInterfaceID *iid;   ///< The interface ID
33369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten    const char *name;           ///< The display name
347a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten} Pair;
357a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
367a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten// ## is token concatenation e.g. a##b becomes ab
377a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten// # is stringize operator to convert a symbol to a string constant e.g. #a becomes "a"
387a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
397a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#define _(x) { &SL_IID_##x, #x }
407a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
41369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten/** \brief Array of mappings from interface IDs to display names */
42369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten
43369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kastenstatic Pair pairs[] = {
447a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(3DCOMMIT),
457a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(3DDOPPLER),
467a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(3DGROUPING),
477a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(3DLOCATION),
487a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(3DMACROSCOPIC),
497a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(3DSOURCE),
507a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(AUDIODECODERCAPABILITIES),
517a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(AUDIOENCODER),
527a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(AUDIOENCODERCAPABILITIES),
537a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(AUDIOIODEVICECAPABILITIES),
547a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(BASSBOOST),
557a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(BUFFERQUEUE),
567a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(DEVICEVOLUME),
577a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(DYNAMICINTERFACEMANAGEMENT),
587a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(DYNAMICSOURCE),
597a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(EFFECTSEND),
607a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(ENGINE),
617a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(ENGINECAPABILITIES),
627a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(ENVIRONMENTALREVERB),
637a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(EQUALIZER),
647a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(LED),
657a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(METADATAEXTRACTION),
667a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(METADATATRAVERSAL),
677a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(MIDIMESSAGE),
687a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(MIDIMUTESOLO),
697a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(MIDITEMPO),
707a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(MIDITIME),
717a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(MUTESOLO),
727a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(NULL),
737a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(OBJECT),
747a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(OUTPUTMIX),
757a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(PITCH),
767a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(PLAY),
777a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(PLAYBACKRATE),
787a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(PREFETCHSTATUS),
797a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(PRESETREVERB),
807a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(RATEPITCH),
817a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(RECORD),
827a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(SEEK),
837a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(THREADSYNC),
847a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(VIBRA),
857a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(VIRTUALIZER),
867a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(VISUALIZATION),
8701e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten    _(VOLUME),
8801e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten#if 0 // ifdef USE_OUTPUTMIXEXT
8901e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten    _(OUTPUTMIXEXT),
9001e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten#endif
9101e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten#ifdef ANDROID
9201e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten    _(ANDROIDEFFECT),
9301e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten    _(ANDROIDEFFECTCAPABILITIES),
9401e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten    _(ANDROIDEFFECTSEND),
9501e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten    _(ANDROIDCONFIGURATION),
96f8b3141926967ba37d315cc8d3956d7214958e6bPaul McLean    _(ANDROIDSIMPLEBUFFERQUEUE),
97f8b3141926967ba37d315cc8d3956d7214958e6bPaul McLean    _(ANDROIDACOUSTICECHOCANCELLATION),
98f8b3141926967ba37d315cc8d3956d7214958e6bPaul McLean    _(ANDROIDAUTOMATICGAINCONTROL),
99f8b3141926967ba37d315cc8d3956d7214958e6bPaul McLean    _(ANDROIDNOISESUPPRESSION)
10001e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten#endif
1017a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten};
1027a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
1037126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten
104369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten/** \brief Print an interface ID in human-readable format */
105369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten
1065dacc932cd1084e0cd746afe0a4d7e035560113cGlenn Kastenvoid slesutPrintIID(SLInterfaceID iid)
1077a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten{
1087a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    Pair *p;
1097a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    const Pair *end = &pairs[sizeof(pairs)/sizeof(pairs[0])];
1107a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    for (p = pairs; p != end; ++p) {
1117a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten        if (!memcmp(*p->iid, iid, sizeof(struct SLInterfaceID_))) {
1127a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten            printf("SL_IID_%s = ", p->name);
1137a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten            break;
1147a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten        }
1157a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    }
1167a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    printf(
1177a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten        "{ 0x%08X, 0x%04X, 0x%04X, 0x%04X, { 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X } }\n",
1187a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten        (unsigned) iid->time_low, iid->time_mid, iid->time_hi_and_version, iid->clock_seq,
1197a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten        iid->node[0], iid->node[1], iid->node[2], iid->node[3], iid->node[4], iid->node[5]);
1207a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten}
1214b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten
1227126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten
123369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten/** \brief Print an array of interface IDs in human-readable format,
124369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten *  including whether they are required or optional
125369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten */
126369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten
1275dacc932cd1084e0cd746afe0a4d7e035560113cGlenn Kastenvoid slesutPrintIIDs(SLInterfaceID *pInterfaceIds, SLboolean *pInterfaceRequired,
1284b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    unsigned numInterfaces)
1294b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten{
1304b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    unsigned i;
1314b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    for (i = 0; i < numInterfaces; ++i) {
1324b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten        printf("interfaces[%u]=", i);
1335dacc932cd1084e0cd746afe0a4d7e035560113cGlenn Kasten        slesutPrintIID(pInterfaceIds[i]);
1344b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten        printf(" %s\n", (unsigned) pInterfaceRequired[i] ? "required" : "optional");
1354b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    }
1364b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten}
137768edbc2a8e7f197548cf1141689dd237d19c455Glenn Kasten
138768edbc2a8e7f197548cf1141689dd237d19c455Glenn Kasten
139c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten/** \brief Convert an object ID to a string or NULL. */
140c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
141c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kastenconst char *slesutObjectIDToString(SLuint32 objectID)
142c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten{
143c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    static const char * const objectIDstrings[10] = {
144c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_ENGINE",
145c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_LEDDEVICE",
146c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_VIBRADEVICE",
147c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_AUDIOPLAYER",
148c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_AUDIORECORDER",
149c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_MIDIPLAYER",
150c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_LISTENER",
151c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_3DGROUP",
152c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_OUTPUTMIX",
153c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_METADATAEXTRACTOR"
154c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    };
155c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    return (0x1001 <= objectID) && (objectID <= 0x100A) ? objectIDstrings[objectID - 0x1001] : NULL;
156c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten}
157