| /* | |
| * 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. | |
| */ | |
| #include <stdlib.h> | |
| #include <stdio.h> | |
| #include <string.h> | |
| #include <unistd.h> | |
| #include <sys/time.h> | |
| #include <fcntl.h> | |
| #include <SLES/OpenSLES.h> | |
| #include <SLES/OpenSLES_Android.h> | |
| #define MAX_NUMBER_INTERFACES 1 | |
| #define GUID_DISPLAY_LENGTH 37 | |
| #define FX_NAME_LENGTH 64 | |
| //----------------------------------------------------------------- | |
| /* Exits the application if an error is encountered */ | |
| #define ExitOnError(x) ExitOnErrorFunc(x,__LINE__) | |
| void ExitOnErrorFunc( SLresult result , int line) | |
| { | |
| if (SL_RESULT_SUCCESS != result) { | |
| fprintf(stderr, "%u error code encountered at line %d, exiting\n", result, line); | |
| exit(EXIT_FAILURE); | |
| } | |
| } | |
| //----------------------------------------------------------------- | |
| void guidToString(const SLInterfaceID guid, char *str) { | |
| if ((NULL == guid) || (NULL == str)) { | |
| return; | |
| } | |
| snprintf(str, GUID_DISPLAY_LENGTH, "%08x-%04x-%04x-%04x-%02x%02x%02x%02x%02x%02x", | |
| guid->time_low, | |
| guid->time_mid, | |
| guid->time_hi_and_version, | |
| guid->clock_seq, | |
| guid->node[0], | |
| guid->node[1], | |
| guid->node[2], | |
| guid->node[3], | |
| guid->node[4], | |
| guid->node[5]); | |
| } | |
| //----------------------------------------------------------------- | |
| /* Query available effects on Android */ | |
| void TestGenericFxCapabilities( ) | |
| { | |
| SLresult result; | |
| SLObjectItf sl; | |
| /* ------------------------------------------------------ */ | |
| /* Engine configuration and creation */ | |
| SLEngineOption EngineOption[] = { | |
| {(SLuint32) SL_ENGINEOPTION_THREADSAFE, (SLuint32) SL_BOOLEAN_TRUE} | |
| }; | |
| SLboolean required[MAX_NUMBER_INTERFACES]; | |
| SLInterfaceID iidArray[MAX_NUMBER_INTERFACES]; | |
| /* Initialize arrays required[] and iidArray[] */ | |
| for (int i=0 ; i < MAX_NUMBER_INTERFACES ; i++) { | |
| required[i] = SL_BOOLEAN_FALSE; | |
| iidArray[i] = SL_IID_NULL; | |
| } | |
| iidArray[0] = SL_IID_ANDROIDEFFECTCAPABILITIES; | |
| required[0] = SL_BOOLEAN_TRUE; | |
| result = slCreateEngine( &sl, 1, EngineOption, 1, iidArray, required); | |
| ExitOnError(result); | |
| /* Realizing the SL Engine in synchronous mode. */ | |
| result = (*sl)->Realize(sl, SL_BOOLEAN_FALSE); | |
| ExitOnError(result); | |
| SLEngineItf EngineItf; | |
| SLAndroidEffectCapabilitiesItf EffectLibItf; | |
| /* Get the SL Engine interface which is implicit */ | |
| result = (*sl)->GetInterface(sl, SL_IID_ENGINE, (void*)&EngineItf); | |
| ExitOnError(result); | |
| /* Get the Android Effect Capabilities interface */ | |
| result = (*sl)->GetInterface(sl, SL_IID_ANDROIDEFFECTCAPABILITIES, (void*)&EffectLibItf); | |
| ExitOnError(result); | |
| /* ------------------------------------------------------ */ | |
| /* Query the effect library */ | |
| SLuint32 nbEffects = 0; | |
| result = (*EffectLibItf)->QueryNumEffects(EffectLibItf, &nbEffects); | |
| ExitOnError(result); | |
| fprintf(stdout, "Effect library contains %d effects:\n", nbEffects); | |
| SLchar effectName[FX_NAME_LENGTH+1]; | |
| SLuint16 effectNameLength = FX_NAME_LENGTH; | |
| char typeString[GUID_DISPLAY_LENGTH]; | |
| char implString[GUID_DISPLAY_LENGTH]; | |
| SLInterfaceID effectType, effectImplementation; | |
| for (SLuint32 i = 0 ; i < nbEffects ; i++ ) { | |
| fprintf(stdout,"- effect %d: ", i); | |
| memset(effectName, 'Z', FX_NAME_LENGTH+1); | |
| effectNameLength = FX_NAME_LENGTH; | |
| result = (*EffectLibItf)->QueryEffect(EffectLibItf, i, | |
| &effectType, &effectImplementation, effectName, &effectNameLength); | |
| if ('Z' != effectName[FX_NAME_LENGTH]) { | |
| fprintf(stderr, "QueryEffect wrote beyond end of buffer\n"); | |
| continue; | |
| } | |
| ExitOnError(result); | |
| printf("length=%u ", effectNameLength); | |
| if (FX_NAME_LENGTH < effectNameLength) { | |
| printf(" (>max) "); | |
| effectNameLength = FX_NAME_LENGTH; | |
| } | |
| guidToString(effectType, typeString); | |
| guidToString(effectImplementation, implString); | |
| effectName[FX_NAME_LENGTH - 1] = '\0'; | |
| fprintf(stdout, " type=%s, impl=%s name=%.*s \n", typeString, implString, effectNameLength, | |
| effectName); | |
| } | |
| /* Shutdown OpenSL ES */ | |
| (*sl)->Destroy(sl); | |
| } | |
| //----------------------------------------------------------------- | |
| int main(int argc __unused, char* const argv[]) | |
| { | |
| fprintf(stdout, "OpenSL ES test %s: exercises SLAndroidEffectCapabilitiesItf.\n", argv[0]); | |
| TestGenericFxCapabilities(); | |
| return EXIT_SUCCESS; | |
| } |