4.24.2012

OpenSL ES事始

OpenSL ESを触っていたので備忘録的にまとめたいと思います。
最初なのでエンジンの生成、破棄の流れをざらっと書いてみます。

#define PRINT(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define ERROR_LOG(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)

#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))

#define CheckError(result) ErrorAnalyze(result, __LINE__)
#define LOG_RESULT(type) case type:\
                         ERROR_LOG("Error="#type"(%d)", line);\
                         break;
#define ASSERT(exp, ...) if (!(exp)){ERROR_LOG(__VA_ARGS__); for(;;){}}
//エラー内容の出力
inline void ErrorAnalyze(SLresult result, int line)
{
  if (SL_RESULT_SUCCESS != result)
  {
    switch(result)
    {
      LOG_RESULT(SL_RESULT_PRECONDITIONS_VIOLATED)
      LOG_RESULT(SL_RESULT_PARAMETER_INVALID)
      LOG_RESULT(SL_RESULT_MEMORY_FAILURE)
      LOG_RESULT(SL_RESULT_RESOURCE_ERROR)
      LOG_RESULT(SL_RESULT_RESOURCE_LOST)
      LOG_RESULT(SL_RESULT_IO_ERROR)
      LOG_RESULT(SL_RESULT_BUFFER_INSUFFICIENT)
      LOG_RESULT(SL_RESULT_CONTENT_CORRUPTED)
      LOG_RESULT(SL_RESULT_CONTENT_UNSUPPORTED)
      LOG_RESULT(SL_RESULT_CONTENT_NOT_FOUND)
      LOG_RESULT(SL_RESULT_PERMISSION_DENIED)
      LOG_RESULT(SL_RESULT_FEATURE_UNSUPPORTED)
      LOG_RESULT(SL_RESULT_INTERNAL_ERROR)
      LOG_RESULT(SL_RESULT_UNKNOWN_ERROR)
      LOG_RESULT(SL_RESULT_OPERATION_ABORTED)
      LOG_RESULT(SL_RESULT_CONTROL_LOST)
      default:
        return;
    }
  }
  ERROR_LOG("error=%u", result);
}

SLEngineItf engine;
SLObjectItf engine_object;
SLObjectItf output_mix_object;

//生成
{
  SLresult result;
  {
    //エンジンの生成
    const SLInterfaceID iids[] = {SL_IID_ENGINE};
    const SLboolean reqs[] = {SL_BOOLEAN_TRUE};
    result = slCreateEngine(&engine_object, 0, NULL, ARRAY_SIZE(iids), iids, reqs);
    CheckError(result);
  }
  {
    result = (*engine_object)->Realize(engine_object, SL_BOOLEAN_FALSE);
    CheckError(result);
    result = (*engine_object)->GetInterface(engine_object, SL_IID_ENGINE, &engine);
    CheckError(result);
  }
  {
    //出力先の生成
    const SLInterfaceID iids[] = {};
    const SLboolean reqs[] = {};
    (*engine)->CreateOutputMix(engine, &output_mix_object, ARRAY_SIZE(iids), iids, reqs);
    CheckError(result);
  }
  {
    result = (*output_mix_object)->Realize(output_mix_object, SL_BOOLEAN_FALSE);
    CheckError(result);
  }
}

//破棄
{
  //出力先の破棄
  if (output_mix_object != NULL)
  {
    (*output_mix_object)->Destroy(output_mix_object);
    output_mix_object = NULL;
  }
  //エンジンの破棄
  if (engine_object != NULL)
  {
    (*engine_object)->Destroy(engine_object);
    engine_object = NULL;
    engine = NULL;
  }
}

こんな感じでエンジンを先ず作成し、そこから必要なオブジェクトを作成していきます。
作成するときに必要なインターフェイスを渡してあげます。