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