最初なのでエンジンの生成、破棄の流れをざらっと書いてみます。
#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;
}
}
こんな感じでエンジンを先ず作成し、そこから必要なオブジェクトを作成していきます。
作成するときに必要なインターフェイスを渡してあげます。