Home | History | Annotate | Download | only in sandbox
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 // Test dynamic interface management
     18 
     19 #include <assert.h>
     20 #include <math.h>
     21 #include <stdio.h>
     22 #include <stdlib.h>
     23 
     24 #include <SLES/OpenSLES.h>
     25 #ifdef ANDROID
     26 #include <SLES/OpenSLES_Android.h>
     27 #endif
     28 
     29 int main(int argc, char **argv)
     30 {
     31     if (argc != 1) {
     32         fprintf(stderr, "usage: %s\n", argv[0]);
     33         return EXIT_FAILURE;
     34     }
     35 
     36     SLresult result;
     37     SLObjectItf engineObject;
     38 
     39     // create engine
     40     result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL);
     41     assert(SL_RESULT_SUCCESS == result);
     42     SLEngineItf engineEngine;
     43     result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);
     44     assert(SL_RESULT_SUCCESS == result);
     45     result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine);
     46     assert(SL_RESULT_SUCCESS == result);
     47 
     48     // create output mix
     49     SLObjectItf outputMixObject;
     50     result = (*engineEngine)->CreateOutputMix(engineEngine, &outputMixObject, 0, NULL, NULL);
     51     assert(SL_RESULT_SUCCESS == result);
     52 
     53     // get the dynamic interface management interface for output mix, before realize
     54     SLDynamicInterfaceManagementItf outputMixDIM;
     55     result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_DYNAMICINTERFACEMANAGEMENT,
     56             &outputMixDIM);
     57     assert(SL_RESULT_PRECONDITIONS_VIOLATED == result);
     58     assert(NULL == outputMixDIM);
     59 
     60     // realize output mix
     61     result = (*outputMixObject)->Realize(outputMixObject, SL_BOOLEAN_FALSE);
     62     assert(SL_RESULT_SUCCESS == result);
     63 
     64     // get the dynamic interface management interface for output mix, after realize
     65     result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_DYNAMICINTERFACEMANAGEMENT,
     66             &outputMixDIM);
     67     assert(SL_RESULT_SUCCESS == result);
     68     assert(NULL != outputMixDIM);
     69 
     70     // register callback
     71     result = (*outputMixDIM)->RegisterCallback(outputMixDIM, NULL, NULL);
     72     assert(SL_RESULT_SUCCESS == result);
     73 
     74     // get environmental reverb interface, before add or resume
     75     SLEnvironmentalReverbItf outputMixEnvironmentalReverb;
     76     result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_ENVIRONMENTALREVERB,
     77             &outputMixEnvironmentalReverb);
     78     assert(SL_RESULT_FEATURE_UNSUPPORTED == result);
     79     assert(NULL == outputMixEnvironmentalReverb);
     80 
     81     // resume environmental reverb interface
     82     result = (*outputMixDIM)->ResumeInterface(outputMixDIM, SL_IID_ENVIRONMENTALREVERB,
     83             SL_BOOLEAN_FALSE);
     84     assert(SL_RESULT_PRECONDITIONS_VIOLATED == result);
     85 
     86     // get environmental reverb interface, after resume but before add
     87     result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_ENVIRONMENTALREVERB,
     88             &outputMixEnvironmentalReverb);
     89     assert(SL_RESULT_FEATURE_UNSUPPORTED == result);
     90     assert(NULL == outputMixEnvironmentalReverb);
     91 
     92     // add environmental reverb interface
     93     result = (*outputMixDIM)->AddInterface(outputMixDIM, SL_IID_ENVIRONMENTALREVERB,
     94             SL_BOOLEAN_FALSE);
     95     assert(SL_RESULT_SUCCESS == result);
     96 
     97     // get environmental reverb interface, after add
     98     result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_ENVIRONMENTALREVERB,
     99             &outputMixEnvironmentalReverb);
    100     assert(SL_RESULT_SUCCESS == result);
    101     assert(NULL != outputMixEnvironmentalReverb);
    102 
    103     // add environmental reverb interface again
    104     result = (*outputMixDIM)->AddInterface(outputMixDIM, SL_IID_ENVIRONMENTALREVERB,
    105             SL_BOOLEAN_FALSE);
    106     assert(SL_RESULT_PRECONDITIONS_VIOLATED == result);
    107 
    108     // resume environmental reverb interface
    109     result = (*outputMixDIM)->ResumeInterface(outputMixDIM, SL_IID_ENVIRONMENTALREVERB,
    110             SL_BOOLEAN_FALSE);
    111     assert(SL_RESULT_PRECONDITIONS_VIOLATED == result);
    112 
    113     // remove environmental reverb interface (FIXME not yet implemented)
    114     result = (*outputMixDIM)->RemoveInterface(outputMixDIM, SL_IID_ENVIRONMENTALREVERB);
    115     assert((SL_RESULT_SUCCESS == result) || (SL_RESULT_FEATURE_UNSUPPORTED == result));
    116 
    117     // FIXME once remove is implemented we can try this
    118     if (SL_RESULT_SUCCESS == result) {
    119         result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_ENVIRONMENTALREVERB,
    120                 &outputMixEnvironmentalReverb);
    121         assert(SL_RESULT_PRECONDITIONS_VIOLATED == result);
    122         assert(NULL == outputMixEnvironmentalReverb);
    123         result = (*outputMixDIM)->RemoveInterface(outputMixDIM, SL_IID_ENVIRONMENTALREVERB);
    124         assert(SL_RESULT_PRECONDITIONS_VIOLATED == result);
    125         result = (*outputMixDIM)->AddInterface(outputMixDIM, SL_IID_ENVIRONMENTALREVERB,
    126                 SL_BOOLEAN_FALSE);
    127         assert(SL_RESULT_SUCCESS == result);
    128         result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_ENVIRONMENTALREVERB,
    129                 &outputMixEnvironmentalReverb);
    130         assert(SL_RESULT_SUCCESS == result);
    131         assert(NULL != outputMixEnvironmentalReverb);
    132     }
    133 
    134     // get non-sensical play interface, before add
    135     SLPlayItf outputMixPlay;
    136     result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_PLAY, &outputMixPlay);
    137     assert(SL_RESULT_FEATURE_UNSUPPORTED == result);
    138     assert(NULL == outputMixPlay);
    139 
    140     // add play interface
    141     result = (*outputMixDIM)->AddInterface(outputMixDIM, SL_IID_PLAY, SL_BOOLEAN_FALSE);
    142     assert(SL_RESULT_FEATURE_UNSUPPORTED == result);
    143 
    144     // get play interface should still fail
    145     result = (*outputMixObject)->GetInterface(outputMixObject, SL_IID_PLAY, &outputMixPlay);
    146     assert(SL_RESULT_FEATURE_UNSUPPORTED == result);
    147     assert(NULL == outputMixPlay);
    148 
    149     // destroy output mix
    150     (*outputMixObject)->Destroy(outputMixObject);
    151 
    152     // destroy engine
    153     (*engineObject)->Destroy(engineObject);
    154 
    155     return EXIT_SUCCESS;
    156 }
    157