1104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten/* 2104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten * Copyright (C) 2010 The Android Open Source Project 3104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten * 4104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 5104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten * you may not use this file except in compliance with the License. 6104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten * You may obtain a copy of the License at 7104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten * 8104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 9104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten * 10104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten * Unless required by applicable law or agreed to in writing, software 11104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 12104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten * See the License for the specific language governing permissions and 14104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten * limitations under the License. 15104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten */ 16104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten 17104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten// output mix interface tests 18104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten 19c6853892c94800e72c0bd676d5d2136d48cea76eGlenn Kasten#include <SLES/OpenSLES.h> 20be2218961ac506ba9c2be0dddb2f74debd283bb8Glenn Kasten#include "OpenSLESUT.h" 21104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten#include <assert.h> 22104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten#include <stdio.h> 23104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten#include <stdlib.h> 24104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten#include <string.h> 25104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten 26086a6f51a7b12880ed114962136972f89ed70da2Glenn Kastenint main(int argc __unused, char **argv __unused) 27104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten{ 28104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten // create engine 29104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten SLObjectItf engineObject; 30104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten SLresult result; 31104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL); 32104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_SUCCESS == result); 33104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten printf("Engine object %p\n", engineObject); 34104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten // realize engine 35104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE); 36104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_SUCCESS == result); 37104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten // get engine interface 38104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten SLEngineItf engineEngine; 39104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine); 40104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_SUCCESS == result); 41104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten // query supported interfaces on output mix object ID and display their IDs 42104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten SLuint32 numSupportedInterfaces; 43104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*engineEngine)->QueryNumSupportedInterfaces(engineEngine, SL_OBJECTID_OUTPUTMIX, 44104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten &numSupportedInterfaces); 45104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_SUCCESS == result); 4658432eb9cea995c69b4f905e68b38c1b8216edebGlenn Kasten printf("Output mix supports %u interfaces:\n", numSupportedInterfaces); 47104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten SLuint32 i; 48104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten for (i = 0; i < numSupportedInterfaces; ++i) { 49104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten SLInterfaceID interfaceID; 50104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*engineEngine)->QuerySupportedInterfaces(engineEngine, SL_OBJECTID_OUTPUTMIX, i, 51104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten &interfaceID); 52104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_SUCCESS == result); 5358432eb9cea995c69b4f905e68b38c1b8216edebGlenn Kasten printf(" [%u] = ", i); 54104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten slesutPrintIID(interfaceID); 55104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten } 567126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten // create output mix, with no place to put the new object 577126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten result = (*engineEngine)->CreateOutputMix(engineEngine, NULL, 0, NULL, NULL); 587126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten assert(SL_RESULT_PARAMETER_INVALID == result); 59104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten // create output mix, requesting no explicit interfaces 60104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten SLObjectItf outputMixObject; 61104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*engineEngine)->CreateOutputMix(engineEngine, &outputMixObject, 0, NULL, NULL); 62104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_SUCCESS == result); 63104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten printf("Output mix object %p\n", outputMixObject); 64104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten // get object interface before realization 65104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten SLObjectItf outputMixObject2; 66104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_OBJECT, &outputMixObject2); 67104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_SUCCESS == result); 68104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(outputMixObject2 == outputMixObject); 69104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten // get any other interface before realization should fail 70104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten SLOutputMixItf outputMixOutputMix; 71104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_OUTPUTMIX, 72104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten &outputMixOutputMix); 73104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_PRECONDITIONS_VIOLATED == result); 74104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten // realize the output mix 75104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*outputMixObject)->Realize(outputMixObject, SL_BOOLEAN_FALSE); 76104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_SUCCESS == result); 77104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten // get each expected implicit interface 78104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten outputMixObject2 = NULL; 79104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_OBJECT, &outputMixObject2); 80104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_SUCCESS == result); 81104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(outputMixObject2 == outputMixObject); 82104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten SLDynamicInterfaceManagementItf outputMixDynamicInterfaceManagement; 83104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_DYNAMICINTERFACEMANAGEMENT, 84104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten &outputMixDynamicInterfaceManagement); 85104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert((SL_RESULT_SUCCESS == result) || (SL_RESULT_FEATURE_UNSUPPORTED) == result); 86104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten if (SL_RESULT_SUCCESS == result) { 87104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten printf("Output mix supports dynamic interface management\n"); 88104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten } else { 89104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten printf("Output mix does not support dynamic interface management\n"); 90104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten } 91104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_OUTPUTMIX, 92104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten &outputMixOutputMix); 93104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_SUCCESS == result); 94104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten // get explicit and optional interfaces should fail since not requested at creation 95104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten SLEnvironmentalReverbItf outputMixEnvironmentalReverb; 96104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_ENVIRONMENTALREVERB, 97104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten &outputMixEnvironmentalReverb); 98104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_FEATURE_UNSUPPORTED == result); 99104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten SLEqualizerItf outputMixEqualizer; 100104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_EQUALIZER, 101104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten &outputMixEqualizer); 102104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_FEATURE_UNSUPPORTED == result); 103104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten SLPresetReverbItf outputMixPresetReverb; 104104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_PRESETREVERB, 105104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten &outputMixPresetReverb); 106104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_FEATURE_UNSUPPORTED == result); 107104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten SLVirtualizerItf outputMixVirtualizer; 108104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_VIRTUALIZER, 109104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten &outputMixVirtualizer); 110104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_FEATURE_UNSUPPORTED == result); 111104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten SLVolumeItf outputMixVolume; 112104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_VOLUME, 113104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten &outputMixVolume); 114104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_FEATURE_UNSUPPORTED == result); 115104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten SLBassBoostItf outputMixBassBoost; 116104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_BASSBOOST, 117104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten &outputMixBassBoost); 118104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_FEATURE_UNSUPPORTED == result); 119104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten SLVisualizationItf outputMixVisualization; 120104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_VISUALIZATION, 121104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten &outputMixVisualization); 122104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_FEATURE_UNSUPPORTED == result); 123104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten // destroy output mix 124104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten (*outputMixObject)->Destroy(outputMixObject); 125104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten // re-create output mix, this time requesting implicit interfaces as "hard" requirements (must 126104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten // be there), and explicit interfaces as "soft" requirements (OK if not available) 127104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten SLInterfaceID ids[10] = {SL_IID_OBJECT, SL_IID_DYNAMICINTERFACEMANAGEMENT, SL_IID_OUTPUTMIX, 128104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten SL_IID_ENVIRONMENTALREVERB, SL_IID_EQUALIZER, SL_IID_PRESETREVERB, SL_IID_VIRTUALIZER, 129104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten SL_IID_VOLUME, SL_IID_BASSBOOST, SL_IID_VISUALIZATION}; 130104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten SLboolean req[10] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_FALSE /*SL_BOOLEAN_TRUE*/, SL_BOOLEAN_TRUE, 131104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten SL_BOOLEAN_TRUE/*FALSE*/, SL_BOOLEAN_FALSE, SL_BOOLEAN_FALSE, SL_BOOLEAN_FALSE, 132104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten SL_BOOLEAN_FALSE, SL_BOOLEAN_FALSE, SL_BOOLEAN_FALSE}; 133104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*engineEngine)->CreateOutputMix(engineEngine, &outputMixObject, 10, ids, req); 134104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_SUCCESS == result); 135104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten printf("Output mix object %p\n", outputMixObject); 136104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten // realize the output mix 137104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*outputMixObject)->Realize(outputMixObject, SL_BOOLEAN_FALSE); 138104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_SUCCESS == result); 139104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten // get implicit interfaces 140104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_OBJECT, 141104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten &outputMixObject2); 142104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_SUCCESS == result); 143104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_DYNAMICINTERFACEMANAGEMENT, 144104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten &outputMixDynamicInterfaceManagement); 145104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert((SL_RESULT_SUCCESS == result) || (SL_RESULT_FEATURE_UNSUPPORTED) == result); 146104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_OUTPUTMIX, 147104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten &outputMixOutputMix); 148104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_SUCCESS == result); 149104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten // get explicit and optional interfaces should succeed since they were requested at creation 150104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_ENVIRONMENTALREVERB, 151104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten &outputMixEnvironmentalReverb); 152104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_SUCCESS == result); 153104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_EQUALIZER, 154104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten &outputMixEqualizer); 155104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_SUCCESS == result); 156104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_PRESETREVERB, 157104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten &outputMixPresetReverb); 158104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_SUCCESS == result); 159104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_VIRTUALIZER, 160104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten &outputMixVirtualizer); 161104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_SUCCESS == result); 162104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_VOLUME, 163104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten &outputMixVolume); 164104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert((SL_RESULT_SUCCESS == result) || (SL_RESULT_FEATURE_UNSUPPORTED) == result); 165104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten if (SL_RESULT_SUCCESS == result) { 166104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten printf("Output mix supports volume\n"); 167104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten } else { 168104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten printf("Output mix does not support volume\n"); 169104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten } 170104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_BASSBOOST, 171104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten &outputMixBassBoost); 172104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_SUCCESS == result); 173104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_VISUALIZATION, 174104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten &outputMixVisualization); 175104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert((SL_RESULT_SUCCESS == result) || (SL_RESULT_FEATURE_UNSUPPORTED) == result); 176104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten if (SL_RESULT_SUCCESS == result) { 177104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten printf("Output mix supports visualization\n"); 178104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten } else { 179104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten printf("Output mix does not support visualization\n"); 180104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten } 181104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten // use the OutputMix interface on output mix object, in order to get code coverage 182104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten SLint32 numDevices = 1; 183104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten SLuint32 deviceIDs[1]; 184104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*outputMixOutputMix)->GetDestinationOutputDeviceIDs(outputMixOutputMix, &numDevices, 185104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten deviceIDs); 186104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_SUCCESS == result); 187104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(1 == numDevices); 188104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_DEFAULTDEVICEID_AUDIOOUTPUT == deviceIDs[0]); 189104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*outputMixOutputMix)->RegisterDeviceChangeCallback(outputMixOutputMix, NULL, NULL); 190104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_SUCCESS == result); 191104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*outputMixOutputMix)->ReRoute(outputMixOutputMix, 1, deviceIDs); 192104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten assert(SL_RESULT_SUCCESS == result); 193104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten // destroy output mix 194104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten (*outputMixObject)->Destroy(outputMixObject); 195104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten // destroy engine 196104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten (*engineObject)->Destroy(engineObject); 197104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten return EXIT_SUCCESS; 198104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten} 199