/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/** \file OpenSLESUT.c OpenSL ES Utility Toolkit */
#include <SLES/OpenSLES.h>
#include <OMXAL/OpenMAXAL.h>
#ifdef ANDROID
#include <SLES/OpenSLES_Android.h>
#include <OMXAL/OpenMAXAL_Android.h>
#endif
#include "OpenSLESUT.h"
#include <stdio.h>
#include <string.h>
/** \brief Maps an interface ID to its display name */
typedef struct
{
const SLInterfaceID *iid; ///< The interface ID
const char *name; ///< The display name
} Pair;
// ## is token concatenation e.g. a##b becomes ab
// # is stringize operator to convert a symbol to a string constant e.g. #a becomes "a"
#define _(x) { &SL_IID_##x, "SL_IID_" #x }
#define _X(x) { (const SLInterfaceID *) &XA_IID_##x, "XA_IID_" #x }
/** \brief Array of mappings from interface IDs to display names */
static Pair pairs[] = {
_(3DCOMMIT),
_(3DDOPPLER),
_(3DGROUPING),
_(3DLOCATION),
_(3DMACROSCOPIC),
_(3DSOURCE),
_(AUDIODECODERCAPABILITIES),
_(AUDIOENCODER),
_(AUDIOENCODERCAPABILITIES),
_(AUDIOIODEVICECAPABILITIES),
_(BASSBOOST),
_(BUFFERQUEUE),
_(DEVICEVOLUME),
_(DYNAMICINTERFACEMANAGEMENT),
_(DYNAMICSOURCE),
_(EFFECTSEND),
_(ENGINE),
_(ENGINECAPABILITIES),
_(ENVIRONMENTALREVERB),
_(EQUALIZER),
_(LED),
_(METADATAEXTRACTION),
_(METADATATRAVERSAL),
_(MIDIMESSAGE),
_(MIDIMUTESOLO),
_(MIDITEMPO),
_(MIDITIME),
_(MUTESOLO),
_(NULL),
_(OBJECT),
_(OUTPUTMIX),
_(PITCH),
_(PLAY),
_(PLAYBACKRATE),
_(PREFETCHSTATUS),
_(PRESETREVERB),
_(RATEPITCH),
_(RECORD),
_(SEEK),
_(THREADSYNC),
_(VIBRA),
_(VIRTUALIZER),
_(VISUALIZATION),
_(VOLUME),
#if 0 // ifdef USE_OUTPUTMIXEXT
_(OUTPUTMIXEXT),
#endif
_X(ENGINE),
_X(VIDEODECODERCAPABILITIES),
#ifdef ANDROID
_(ANDROIDEFFECT),
_(ANDROIDEFFECTCAPABILITIES),
_(ANDROIDEFFECTSEND),
_(ANDROIDCONFIGURATION),
_(ANDROIDSIMPLEBUFFERQUEUE),
_(ANDROIDBUFFERQUEUESOURCE),
_(ANDROIDACOUSTICECHOCANCELLATION),
_(ANDROIDAUTOMATICGAINCONTROL),
_(ANDROIDNOISESUPPRESSION)
#endif
};
/** \brief Print an interface ID in human-readable format */
void slesutPrintIID(SLInterfaceID iid)
{
Pair *p;
const Pair *end = &pairs[sizeof(pairs)/sizeof(pairs[0])];
for (p = pairs; p != end; ++p) {
if (!memcmp(*p->iid, iid, sizeof(struct SLInterfaceID_))) {
printf("SL_IID_%s = ", p->name);
break;
}
}
printf(
"{ 0x%08X, 0x%04X, 0x%04X, 0x%04X, { 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X } }\n",
(unsigned) iid->time_low, iid->time_mid, iid->time_hi_and_version, iid->clock_seq,
iid->node[0], iid->node[1], iid->node[2], iid->node[3], iid->node[4], iid->node[5]);
}
/** \brief Print an array of interface IDs in human-readable format,
* including whether they are required or optional
*/
void slesutPrintIIDs(SLInterfaceID *pInterfaceIds, SLboolean *pInterfaceRequired,
unsigned numInterfaces)
{
unsigned i;
for (i = 0; i < numInterfaces; ++i) {
printf("interfaces[%u]=", i);
slesutPrintIID(pInterfaceIds[i]);
printf(" %s\n", (unsigned) pInterfaceRequired[i] ? "required" : "optional");
}
}
/** \brief Convert an object ID to a string or NULL. */
const char *slesutObjectIDToString(SLuint32 objectID)
{
static const char * const objectIDstrings[10] = {
"SL_OBJECTID_ENGINE",
"SL_OBJECTID_LEDDEVICE",
"SL_OBJECTID_VIBRADEVICE",
"SL_OBJECTID_AUDIOPLAYER",
"SL_OBJECTID_AUDIORECORDER",
"SL_OBJECTID_MIDIPLAYER",
"SL_OBJECTID_LISTENER",
"SL_OBJECTID_3DGROUP",
"SL_OBJECTID_OUTPUTMIX",
"SL_OBJECTID_METADATAEXTRACTOR"
};
return (0x1001 <= objectID) && (objectID <= 0x100A) ? objectIDstrings[objectID - 0x1001] : NULL;
}