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>
2034ea74827da9a7401d779f7dab9bc63b8253baa4Glenn Kasten#include <OMXAL/OpenMAXAL.h>
2101e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten#ifdef ANDROID
22c6853892c94800e72c0bd676d5d2136d48cea76eGlenn Kasten#include <SLES/OpenSLES_Android.h>
2334ea74827da9a7401d779f7dab9bc63b8253baa4Glenn Kasten#include <OMXAL/OpenMAXAL_Android.h>
2401e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten#endif
255dacc932cd1084e0cd746afe0a4d7e035560113cGlenn Kasten#include "OpenSLESUT.h"
267a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#include <stdio.h>
277a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#include <string.h>
287a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
297a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
30369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten/** \brief Maps an interface ID to its display name */
31369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten
327a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kastentypedef struct
337a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten{
34369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten    const SLInterfaceID *iid;   ///< The interface ID
35369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten    const char *name;           ///< The display name
367a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten} Pair;
377a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
387a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten// ## is token concatenation e.g. a##b becomes ab
397a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten// # is stringize operator to convert a symbol to a string constant e.g. #a becomes "a"
407a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
4134ea74827da9a7401d779f7dab9bc63b8253baa4Glenn Kasten#define _(x) { &SL_IID_##x, "SL_IID_" #x }
4234ea74827da9a7401d779f7dab9bc63b8253baa4Glenn Kasten#define _X(x) { (const SLInterfaceID *) &XA_IID_##x, "XA_IID_" #x }
437a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
44369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten/** \brief Array of mappings from interface IDs to display names */
45369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten
46369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kastenstatic Pair pairs[] = {
477a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(3DCOMMIT),
487a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(3DDOPPLER),
497a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(3DGROUPING),
507a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(3DLOCATION),
517a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(3DMACROSCOPIC),
527a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(3DSOURCE),
537a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(AUDIODECODERCAPABILITIES),
547a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(AUDIOENCODER),
557a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(AUDIOENCODERCAPABILITIES),
567a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(AUDIOIODEVICECAPABILITIES),
577a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(BASSBOOST),
587a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(BUFFERQUEUE),
597a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(DEVICEVOLUME),
607a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(DYNAMICINTERFACEMANAGEMENT),
617a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(DYNAMICSOURCE),
627a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(EFFECTSEND),
637a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(ENGINE),
647a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(ENGINECAPABILITIES),
657a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(ENVIRONMENTALREVERB),
667a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(EQUALIZER),
677a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(LED),
687a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(METADATAEXTRACTION),
697a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(METADATATRAVERSAL),
707a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(MIDIMESSAGE),
717a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(MIDIMUTESOLO),
727a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(MIDITEMPO),
737a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(MIDITIME),
747a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(MUTESOLO),
757a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(NULL),
767a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(OBJECT),
777a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(OUTPUTMIX),
787a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(PITCH),
797a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(PLAY),
807a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(PLAYBACKRATE),
817a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(PREFETCHSTATUS),
827a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(PRESETREVERB),
837a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(RATEPITCH),
847a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(RECORD),
857a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(SEEK),
867a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(THREADSYNC),
877a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(VIBRA),
887a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(VIRTUALIZER),
897a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    _(VISUALIZATION),
9001e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten    _(VOLUME),
9101e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten#if 0 // ifdef USE_OUTPUTMIXEXT
9201e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten    _(OUTPUTMIXEXT),
9301e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten#endif
9434ea74827da9a7401d779f7dab9bc63b8253baa4Glenn Kasten    _X(ENGINE),
9534ea74827da9a7401d779f7dab9bc63b8253baa4Glenn Kasten    _X(VIDEODECODERCAPABILITIES),
9601e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten#ifdef ANDROID
9701e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten    _(ANDROIDEFFECT),
9801e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten    _(ANDROIDEFFECTCAPABILITIES),
9901e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten    _(ANDROIDEFFECTSEND),
10001e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten    _(ANDROIDCONFIGURATION),
101f8b3141926967ba37d315cc8d3956d7214958e6bPaul McLean    _(ANDROIDSIMPLEBUFFERQUEUE),
10234ea74827da9a7401d779f7dab9bc63b8253baa4Glenn Kasten    _(ANDROIDBUFFERQUEUESOURCE),
103f8b3141926967ba37d315cc8d3956d7214958e6bPaul McLean    _(ANDROIDACOUSTICECHOCANCELLATION),
104f8b3141926967ba37d315cc8d3956d7214958e6bPaul McLean    _(ANDROIDAUTOMATICGAINCONTROL),
105f8b3141926967ba37d315cc8d3956d7214958e6bPaul McLean    _(ANDROIDNOISESUPPRESSION)
10601e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten#endif
1077a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten};
1087a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
1097126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten
110369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten/** \brief Print an interface ID in human-readable format */
111369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten
1125dacc932cd1084e0cd746afe0a4d7e035560113cGlenn Kastenvoid slesutPrintIID(SLInterfaceID iid)
1137a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten{
1147a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    Pair *p;
1157a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    const Pair *end = &pairs[sizeof(pairs)/sizeof(pairs[0])];
1167a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    for (p = pairs; p != end; ++p) {
1177a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten        if (!memcmp(*p->iid, iid, sizeof(struct SLInterfaceID_))) {
1187a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten            printf("SL_IID_%s = ", p->name);
1197a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten            break;
1207a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten        }
1217a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    }
1227a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    printf(
1237a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten        "{ 0x%08X, 0x%04X, 0x%04X, 0x%04X, { 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X } }\n",
1247a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten        (unsigned) iid->time_low, iid->time_mid, iid->time_hi_and_version, iid->clock_seq,
1257a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten        iid->node[0], iid->node[1], iid->node[2], iid->node[3], iid->node[4], iid->node[5]);
1267a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten}
1274b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten
1287126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten
129369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten/** \brief Print an array of interface IDs in human-readable format,
130369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten *  including whether they are required or optional
131369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten */
132369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten
1335dacc932cd1084e0cd746afe0a4d7e035560113cGlenn Kastenvoid slesutPrintIIDs(SLInterfaceID *pInterfaceIds, SLboolean *pInterfaceRequired,
1344b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    unsigned numInterfaces)
1354b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten{
1364b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    unsigned i;
1374b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    for (i = 0; i < numInterfaces; ++i) {
1384b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten        printf("interfaces[%u]=", i);
1395dacc932cd1084e0cd746afe0a4d7e035560113cGlenn Kasten        slesutPrintIID(pInterfaceIds[i]);
1404b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten        printf(" %s\n", (unsigned) pInterfaceRequired[i] ? "required" : "optional");
1414b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    }
1424b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten}
143768edbc2a8e7f197548cf1141689dd237d19c455Glenn Kasten
144768edbc2a8e7f197548cf1141689dd237d19c455Glenn Kasten
145c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten/** \brief Convert an object ID to a string or NULL. */
146c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
147c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kastenconst char *slesutObjectIDToString(SLuint32 objectID)
148c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten{
149c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    static const char * const objectIDstrings[10] = {
150c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_ENGINE",
151c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_LEDDEVICE",
152c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_VIBRADEVICE",
153c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_AUDIOPLAYER",
154c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_AUDIORECORDER",
155c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_MIDIPLAYER",
156c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_LISTENER",
157c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_3DGROUP",
158c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_OUTPUTMIX",
159c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten        "SL_OBJECTID_METADATAEXTRACTOR"
160c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    };
161c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    return (0x1001 <= objectID) && (objectID <= 0x100A) ? objectIDstrings[objectID - 0x1001] : NULL;
162c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten}
163