/* * 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. */ // output mix interface tests #include <SLES/OpenSLES.h> #include "OpenSLESUT.h" #include <assert.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char **argv) { // create engine SLObjectItf engineObject; SLresult result; result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL); assert(SL_RESULT_SUCCESS == result); printf("Engine object %p\n", engineObject); // realize engine result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE); assert(SL_RESULT_SUCCESS == result); // get engine interface SLEngineItf engineEngine; result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine); assert(SL_RESULT_SUCCESS == result); // query supported interfaces on output mix object ID and display their IDs SLuint32 numSupportedInterfaces; result = (*engineEngine)->QueryNumSupportedInterfaces(engineEngine, SL_OBJECTID_OUTPUTMIX, &numSupportedInterfaces); assert(SL_RESULT_SUCCESS == result); printf("Output mix supports %u interfaces:\n", numSupportedInterfaces); SLuint32 i; for (i = 0; i < numSupportedInterfaces; ++i) { SLInterfaceID interfaceID; result = (*engineEngine)->QuerySupportedInterfaces(engineEngine, SL_OBJECTID_OUTPUTMIX, i, &interfaceID); assert(SL_RESULT_SUCCESS == result); printf(" [%u] = ", i); slesutPrintIID(interfaceID); } // create output mix, with no place to put the new object result = (*engineEngine)->CreateOutputMix(engineEngine, NULL, 0, NULL, NULL); assert(SL_RESULT_PARAMETER_INVALID == result); // create output mix, requesting no explicit interfaces SLObjectItf outputMixObject; result = (*engineEngine)->CreateOutputMix(engineEngine, &outputMixObject, 0, NULL, NULL); assert(SL_RESULT_SUCCESS == result); printf("Output mix object %p\n", outputMixObject); // get object interface before realization SLObjectItf outputMixObject2; result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_OBJECT, &outputMixObject2); assert(SL_RESULT_SUCCESS == result); assert(outputMixObject2 == outputMixObject); // get any other interface before realization should fail SLOutputMixItf outputMixOutputMix; result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_OUTPUTMIX, &outputMixOutputMix); assert(SL_RESULT_PRECONDITIONS_VIOLATED == result); // realize the output mix result = (*outputMixObject)->Realize(outputMixObject, SL_BOOLEAN_FALSE); assert(SL_RESULT_SUCCESS == result); // get each expected implicit interface outputMixObject2 = NULL; result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_OBJECT, &outputMixObject2); assert(SL_RESULT_SUCCESS == result); assert(outputMixObject2 == outputMixObject); SLDynamicInterfaceManagementItf outputMixDynamicInterfaceManagement; result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_DYNAMICINTERFACEMANAGEMENT, &outputMixDynamicInterfaceManagement); assert((SL_RESULT_SUCCESS == result) || (SL_RESULT_FEATURE_UNSUPPORTED) == result); if (SL_RESULT_SUCCESS == result) { printf("Output mix supports dynamic interface management\n"); } else { printf("Output mix does not support dynamic interface management\n"); } result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_OUTPUTMIX, &outputMixOutputMix); assert(SL_RESULT_SUCCESS == result); // get explicit and optional interfaces should fail since not requested at creation SLEnvironmentalReverbItf outputMixEnvironmentalReverb; result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_ENVIRONMENTALREVERB, &outputMixEnvironmentalReverb); assert(SL_RESULT_FEATURE_UNSUPPORTED == result); SLEqualizerItf outputMixEqualizer; result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_EQUALIZER, &outputMixEqualizer); assert(SL_RESULT_FEATURE_UNSUPPORTED == result); SLPresetReverbItf outputMixPresetReverb; result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_PRESETREVERB, &outputMixPresetReverb); assert(SL_RESULT_FEATURE_UNSUPPORTED == result); SLVirtualizerItf outputMixVirtualizer; result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_VIRTUALIZER, &outputMixVirtualizer); assert(SL_RESULT_FEATURE_UNSUPPORTED == result); SLVolumeItf outputMixVolume; result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_VOLUME, &outputMixVolume); assert(SL_RESULT_FEATURE_UNSUPPORTED == result); SLBassBoostItf outputMixBassBoost; result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_BASSBOOST, &outputMixBassBoost); assert(SL_RESULT_FEATURE_UNSUPPORTED == result); SLVisualizationItf outputMixVisualization; result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_VISUALIZATION, &outputMixVisualization); assert(SL_RESULT_FEATURE_UNSUPPORTED == result); // destroy output mix (*outputMixObject)->Destroy(outputMixObject); // re-create output mix, this time requesting implicit interfaces as "hard" requirements (must // be there), and explicit interfaces as "soft" requirements (OK if not available) SLInterfaceID ids[10] = {SL_IID_OBJECT, SL_IID_DYNAMICINTERFACEMANAGEMENT, SL_IID_OUTPUTMIX, SL_IID_ENVIRONMENTALREVERB, SL_IID_EQUALIZER, SL_IID_PRESETREVERB, SL_IID_VIRTUALIZER, SL_IID_VOLUME, SL_IID_BASSBOOST, SL_IID_VISUALIZATION}; SLboolean req[10] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_FALSE /*SL_BOOLEAN_TRUE*/, SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE/*FALSE*/, SL_BOOLEAN_FALSE, SL_BOOLEAN_FALSE, SL_BOOLEAN_FALSE, SL_BOOLEAN_FALSE, SL_BOOLEAN_FALSE, SL_BOOLEAN_FALSE}; result = (*engineEngine)->CreateOutputMix(engineEngine, &outputMixObject, 10, ids, req); assert(SL_RESULT_SUCCESS == result); printf("Output mix object %p\n", outputMixObject); // realize the output mix result = (*outputMixObject)->Realize(outputMixObject, SL_BOOLEAN_FALSE); assert(SL_RESULT_SUCCESS == result); // get implicit interfaces result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_OBJECT, &outputMixObject2); assert(SL_RESULT_SUCCESS == result); result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_DYNAMICINTERFACEMANAGEMENT, &outputMixDynamicInterfaceManagement); assert((SL_RESULT_SUCCESS == result) || (SL_RESULT_FEATURE_UNSUPPORTED) == result); result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_OUTPUTMIX, &outputMixOutputMix); assert(SL_RESULT_SUCCESS == result); // get explicit and optional interfaces should succeed since they were requested at creation result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_ENVIRONMENTALREVERB, &outputMixEnvironmentalReverb); assert(SL_RESULT_SUCCESS == result); result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_EQUALIZER, &outputMixEqualizer); assert(SL_RESULT_SUCCESS == result); result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_PRESETREVERB, &outputMixPresetReverb); assert(SL_RESULT_SUCCESS == result); result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_VIRTUALIZER, &outputMixVirtualizer); assert(SL_RESULT_SUCCESS == result); result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_VOLUME, &outputMixVolume); assert((SL_RESULT_SUCCESS == result) || (SL_RESULT_FEATURE_UNSUPPORTED) == result); if (SL_RESULT_SUCCESS == result) { printf("Output mix supports volume\n"); } else { printf("Output mix does not support volume\n"); } result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_BASSBOOST, &outputMixBassBoost); assert(SL_RESULT_SUCCESS == result); result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_VISUALIZATION, &outputMixVisualization); assert((SL_RESULT_SUCCESS == result) || (SL_RESULT_FEATURE_UNSUPPORTED) == result); if (SL_RESULT_SUCCESS == result) { printf("Output mix supports visualization\n"); } else { printf("Output mix does not support visualization\n"); } // use the OutputMix interface on output mix object, in order to get code coverage SLint32 numDevices = 1; SLuint32 deviceIDs[1]; result = (*outputMixOutputMix)->GetDestinationOutputDeviceIDs(outputMixOutputMix, &numDevices, deviceIDs); assert(SL_RESULT_SUCCESS == result); assert(1 == numDevices); assert(SL_DEFAULTDEVICEID_AUDIOOUTPUT == deviceIDs[0]); result = (*outputMixOutputMix)->RegisterDeviceChangeCallback(outputMixOutputMix, NULL, NULL); assert(SL_RESULT_SUCCESS == result); result = (*outputMixOutputMix)->ReRoute(outputMixOutputMix, 1, deviceIDs); assert(SL_RESULT_SUCCESS == result); // destroy output mix (*outputMixObject)->Destroy(outputMixObject); // destroy engine (*engineObject)->Destroy(engineObject); return EXIT_SUCCESS; }