/* API: Init factory */ static pj_status_t opensl_init(pjmedia_aud_dev_factory *f) { struct opensl_aud_factory *pa = (struct opensl_aud_factory*)f; SLresult result; /* Create engine */ result = slCreateEngine(&pa->engineObject, 0, NULL, 0, NULL, NULL); if (result != SL_RESULT_SUCCESS) { PJ_LOG(3, (THIS_FILE, "Cannot create engine %d ", result)); return opensl_to_pj_error(result); } /* Realize the engine */ result = (*pa->engineObject)->Realize(pa->engineObject, SL_BOOLEAN_FALSE); if (result != SL_RESULT_SUCCESS) { PJ_LOG(3, (THIS_FILE, "Cannot realize engine")); opensl_destroy(f); return opensl_to_pj_error(result); } /* Get the engine interface, which is needed in order to create * other objects. */ result = (*pa->engineObject)->GetInterface(pa->engineObject, SL_IID_ENGINE, &pa->engineEngine); if (result != SL_RESULT_SUCCESS) { PJ_LOG(3, (THIS_FILE, "Cannot get engine interface")); opensl_destroy(f); return opensl_to_pj_error(result); } /* Create output mix */ result = (*pa->engineEngine)->CreateOutputMix(pa->engineEngine, &pa->outputMixObject, 0, NULL, NULL); if (result != SL_RESULT_SUCCESS) { PJ_LOG(3, (THIS_FILE, "Cannot create output mix")); opensl_destroy(f); return opensl_to_pj_error(result); } /* Realize the output mix */ result = (*pa->outputMixObject)->Realize(pa->outputMixObject, SL_BOOLEAN_FALSE); if (result != SL_RESULT_SUCCESS) { PJ_LOG(3, (THIS_FILE, "Cannot realize output mix")); opensl_destroy(f); return opensl_to_pj_error(result); } PJ_LOG(4,(THIS_FILE, "OpenSL sound library initialized")); return PJ_SUCCESS; }
/*static*/ int opensl_init(cubeb ** context, char const * context_name) { cubeb * ctx; #if defined(__ANDROID__) int android_version = get_android_version(); if (android_version > 0 && android_version <= ANDROID_VERSION_GINGERBREAD_MR1) { // Don't even attempt to run on Gingerbread and lower return CUBEB_ERROR; } #endif *context = NULL; ctx = calloc(1, sizeof(*ctx)); assert(ctx); ctx->ops = &opensl_ops; ctx->lib = dlopen("libOpenSLES.so", RTLD_LAZY); ctx->libmedia = dlopen("libmedia.so", RTLD_LAZY); if (!ctx->lib || !ctx->libmedia) { free(ctx); return CUBEB_ERROR; } /* Get the latency, in ms, from AudioFlinger */ /* status_t AudioSystem::getOutputLatency(uint32_t* latency, * audio_stream_type_t streamType) */ /* First, try the most recent signature. */ ctx->get_output_latency = dlsym(ctx->libmedia, "_ZN7android11AudioSystem16getOutputLatencyEPj19audio_stream_type_t"); if (!ctx->get_output_latency) { /* in case of failure, try the legacy version. */ /* status_t AudioSystem::getOutputLatency(uint32_t* latency, * int streamType) */ ctx->get_output_latency = dlsym(ctx->libmedia, "_ZN7android11AudioSystem16getOutputLatencyEPji"); if (!ctx->get_output_latency) { opensl_destroy(ctx); return CUBEB_ERROR; } } typedef SLresult (*slCreateEngine_t)(SLObjectItf *, SLuint32, const SLEngineOption *, SLuint32, const SLInterfaceID *, const SLboolean *); slCreateEngine_t f_slCreateEngine = (slCreateEngine_t)dlsym(ctx->lib, "slCreateEngine"); SLInterfaceID SL_IID_ENGINE = *(SLInterfaceID *)dlsym(ctx->lib, "SL_IID_ENGINE"); SLInterfaceID SL_IID_OUTPUTMIX = *(SLInterfaceID *)dlsym(ctx->lib, "SL_IID_OUTPUTMIX"); ctx->SL_IID_VOLUME = *(SLInterfaceID *)dlsym(ctx->lib, "SL_IID_VOLUME"); ctx->SL_IID_BUFFERQUEUE = *(SLInterfaceID *)dlsym(ctx->lib, "SL_IID_BUFFERQUEUE"); #if defined(__ANDROID__) ctx->SL_IID_ANDROIDCONFIGURATION = *(SLInterfaceID *)dlsym(ctx->lib, "SL_IID_ANDROIDCONFIGURATION"); #endif ctx->SL_IID_PLAY = *(SLInterfaceID *)dlsym(ctx->lib, "SL_IID_PLAY"); if (!f_slCreateEngine || !SL_IID_ENGINE || !SL_IID_OUTPUTMIX || !ctx->SL_IID_BUFFERQUEUE || #if defined(__ANDROID__) !ctx->SL_IID_ANDROIDCONFIGURATION || #endif !ctx->SL_IID_PLAY) { opensl_destroy(ctx); return CUBEB_ERROR; } const SLEngineOption opt[] = {{SL_ENGINEOPTION_THREADSAFE, SL_BOOLEAN_TRUE}}; SLresult res; res = cubeb_get_sles_engine(&ctx->engObj, 1, opt, 0, NULL, NULL); if (res != SL_RESULT_SUCCESS) { opensl_destroy(ctx); return CUBEB_ERROR; } res = cubeb_realize_sles_engine(ctx->engObj); if (res != SL_RESULT_SUCCESS) { opensl_destroy(ctx); return CUBEB_ERROR; } res = (*ctx->engObj)->GetInterface(ctx->engObj, SL_IID_ENGINE, &ctx->eng); if (res != SL_RESULT_SUCCESS) { opensl_destroy(ctx); return CUBEB_ERROR; } const SLInterfaceID idsom[] = {SL_IID_OUTPUTMIX}; const SLboolean reqom[] = {SL_BOOLEAN_TRUE}; res = (*ctx->eng)->CreateOutputMix(ctx->eng, &ctx->outmixObj, 1, idsom, reqom); if (res != SL_RESULT_SUCCESS) { opensl_destroy(ctx); return CUBEB_ERROR; } res = (*ctx->outmixObj)->Realize(ctx->outmixObj, SL_BOOLEAN_FALSE); if (res != SL_RESULT_SUCCESS) { opensl_destroy(ctx); return CUBEB_ERROR; } *context = ctx; return CUBEB_OK; }
/*static*/ int opensl_init(cubeb ** context, char const * context_name) { cubeb * ctx; *context = NULL; ctx = calloc(1, sizeof(*ctx)); assert(ctx); ctx->ops = &opensl_ops; ctx->lib = dlopen("libOpenSLES.so", RTLD_LAZY); if (!ctx->lib) { free(ctx); return CUBEB_ERROR; } typedef SLresult (*slCreateEngine_t)(SLObjectItf *, SLuint32, const SLEngineOption *, SLuint32, const SLInterfaceID *, const SLboolean *); slCreateEngine_t f_slCreateEngine = (slCreateEngine_t)dlsym(ctx->lib, "slCreateEngine"); SLInterfaceID SL_IID_ENGINE = *(SLInterfaceID *)dlsym(ctx->lib, "SL_IID_ENGINE"); SLInterfaceID SL_IID_OUTPUTMIX = *(SLInterfaceID *)dlsym(ctx->lib, "SL_IID_OUTPUTMIX"); ctx->SL_IID_BUFFERQUEUE = *(SLInterfaceID *)dlsym(ctx->lib, "SL_IID_BUFFERQUEUE"); #if defined(__ANDROID__) ctx->SL_IID_ANDROIDCONFIGURATION = *(SLInterfaceID *)dlsym(ctx->lib, "SL_IID_ANDROIDCONFIGURATION"); #endif ctx->SL_IID_PLAY = *(SLInterfaceID *)dlsym(ctx->lib, "SL_IID_PLAY"); if (!f_slCreateEngine || !SL_IID_ENGINE || !SL_IID_OUTPUTMIX || !ctx->SL_IID_BUFFERQUEUE || #if defined(__ANDROID__) !ctx->SL_IID_ANDROIDCONFIGURATION || #endif !ctx->SL_IID_PLAY) { opensl_destroy(ctx); return CUBEB_ERROR; } const SLEngineOption opt[] = {{SL_ENGINEOPTION_THREADSAFE, SL_BOOLEAN_TRUE}}; SLresult res; res = f_slCreateEngine(&ctx->engObj, 1, opt, 0, NULL, NULL); if (res != SL_RESULT_SUCCESS) { opensl_destroy(ctx); return CUBEB_ERROR; } res = (*ctx->engObj)->Realize(ctx->engObj, SL_BOOLEAN_FALSE); if (res != SL_RESULT_SUCCESS) { opensl_destroy(ctx); return CUBEB_ERROR; } res = (*ctx->engObj)->GetInterface(ctx->engObj, SL_IID_ENGINE, &ctx->eng); if (res != SL_RESULT_SUCCESS) { opensl_destroy(ctx); return CUBEB_ERROR; } const SLInterfaceID idsom[] = {SL_IID_OUTPUTMIX}; const SLboolean reqom[] = {SL_BOOLEAN_TRUE}; res = (*ctx->eng)->CreateOutputMix(ctx->eng, &ctx->outmixObj, 1, idsom, reqom); if (res != SL_RESULT_SUCCESS) { opensl_destroy(ctx); return CUBEB_ERROR; } res = (*ctx->outmixObj)->Realize(ctx->outmixObj, SL_BOOLEAN_FALSE); if (res != SL_RESULT_SUCCESS) { opensl_destroy(ctx); return CUBEB_ERROR; } *context = ctx; return CUBEB_OK; }