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