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),
9601e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten    _(ANDROIDSIMPLEBUFFERQUEUE)
9701e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten#endif
987a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten};
997a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
1007126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten
101369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten/** \brief Print an interface ID in human-readable format */
102369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten
1035dacc932cd1084e0cd746afe0a4d7e035560113cGlenn Kastenvoid slesutPrintIID(SLInterfaceID iid)
1047a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten{
1057a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    Pair *p;
1067a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    const Pair *end = &pairs[sizeof(pairs)/sizeof(pairs[0])];
1077a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    for (p = pairs; p != end; ++p) {
1087a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten        if (!memcmp(*p->iid, iid, sizeof(struct SLInterfaceID_))) {
1097a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten            printf("SL_IID_%s = ", p->name);
1107a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten            break;
1117a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten        }
1127a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    }
1137a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    printf(
1147a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten        "{ 0x%08X, 0x%04X, 0x%04X, 0x%04X, { 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X } }\n",
1157a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten        (unsigned) iid->time_low, iid->time_mid, iid->time_hi_and_version, iid->clock_seq,
1167a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten        iid->node[0], iid->node[1], iid->node[2], iid->node[3], iid->node[4], iid->node[5]);
1177a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten}
1184b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten
1197126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten
120369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten/** \brief Print an array of interface IDs in human-readable format,
121369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten *  including whether they are required or optional
122369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten */
123369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten
1245dacc932cd1084e0cd746afe0a4d7e035560113cGlenn Kastenvoid slesutPrintIIDs(SLInterfaceID *pInterfaceIds, SLboolean *pInterfaceRequired,
1254b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    unsigned numInterfaces)
1264b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten{
1274b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    unsigned i;
1284b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    for (i = 0; i < numInterfaces; ++i) {
1294b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten        printf("interfaces[%u]=", i);
1305dacc932cd1084e0cd746afe0a4d7e035560113cGlenn Kasten        slesutPrintIID(pInterfaceIds[i]);
1314b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten        printf(" %s\n", (unsigned) pInterfaceRequired[i] ? "required" : "optional");
1324b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    }
1334b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten}
134768edbc2a8e7f197548cf1141689dd237d19c455Glenn Kasten
135768edbc2a8e7f197548cf1141689dd237d19c455Glenn Kasten
136c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten/** \brief Convert an object ID to a string or NULL. */
137c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
138c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kastenconst char *slesutObjectIDToString(SLuint32 objectID)
139c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten{
140c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    static const char * const objectIDstrings[10] = {
141c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_ENGINE",
142c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_LEDDEVICE",
143c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_VIBRADEVICE",
144c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_AUDIOPLAYER",
145c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_AUDIORECORDER",
146c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_MIDIPLAYER",
147c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_LISTENER",
148c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_3DGROUP",
149c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_OUTPUTMIX",
150c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_METADATAEXTRACTOR"
151c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    };
152c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    return (0x1001 <= objectID) && (objectID <= 0x100A) ? objectIDstrings[objectID - 0x1001] : NULL;
153c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten}
154