- SECURE_SLOG(LOG_DEBUG, stt_tag(), "[Engine] Load engine id(%d), path(%s)", engine_id, filepath);
-
- /* allocation memory */
- engine = (sttengine_s*)calloc(1, sizeof(sttengine_s));
- if (NULL == engine) {
- SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
- return STTP_ERROR_OUT_OF_MEMORY;
- }
-
- /* load engine */
- char *error;
-
- engine->handle = dlopen(filepath, RTLD_LAZY);
- if (!engine->handle) {
- SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine] Invalid engine (Fail dlopen) : %s", filepath);
- free(engine);
- return STTP_ERROR_OPERATION_FAILED;
- }
-
- engine->pefuncs = (sttpe_funcs_s*)calloc(1, sizeof(sttpe_funcs_s));
- if (NULL == engine->pefuncs) {
- SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
- dlclose(engine->handle);
- free(engine);
- return STTP_ERROR_OUT_OF_MEMORY;
- }
- engine->pdfuncs = (sttpd_funcs_s*)calloc(1, sizeof(sttpd_funcs_s));
- if (NULL == engine->pdfuncs) {
- SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
- dlclose(engine->handle);
- free(engine->pefuncs);
- free(engine);
- return STTP_ERROR_OUT_OF_MEMORY;
- }
-
- engine->sttp_unload_engine = NULL;
- engine->sttp_load_engine = NULL;
-
- engine->sttp_unload_engine = (int (*)())dlsym(engine->handle, "sttp_unload_engine");
- if (NULL != (error = dlerror()) || NULL == engine->sttp_unload_engine) {
- SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to link daemon to sttp_unload_engine() : %s", error);
- dlclose(engine->handle);
- free(engine->pefuncs);
- free(engine->pdfuncs);
- free(engine);
- return STTP_ERROR_OPERATION_FAILED;
- }
-
- engine->sttp_load_engine = (int (*)(sttpd_funcs_s*, sttpe_funcs_s*) )dlsym(engine->handle, "sttp_load_engine");
- if (NULL != (error = dlerror()) || NULL == engine->sttp_load_engine) {
- SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to link daemon to sttp_load_engine() : %s", error);
- dlclose(engine->handle);
- free(engine->pefuncs);
- free(engine->pdfuncs);
- free(engine);
- return STTP_ERROR_OPERATION_FAILED;
- }
-
- engine->engine_id = engine_id;
- engine->engine_path = strdup(filepath);
-
- engine->pdfuncs->version = 1;
- engine->pdfuncs->size = sizeof(sttpd_funcs_s);
-
- int ret = engine->sttp_load_engine(engine->pdfuncs, engine->pefuncs);
- if (0 != ret) {
- SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail sttp_load_engine() : %s", __stt_get_engine_error_code(ret));
- dlclose(engine->handle);
- free(engine->pefuncs);
- free(engine->pdfuncs);
- free(engine->engine_path);
- free(engine);
- return STTP_ERROR_OPERATION_FAILED;
- }
-
- /* engine error check */
- if (engine->pefuncs->size != sizeof(sttpe_funcs_s)) {
- SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine is not valid : function size is not matched");
- }
-
- if (NULL == engine->pefuncs->initialize ||
- NULL == engine->pefuncs->deinitialize ||
- NULL == engine->pefuncs->foreach_langs ||
- NULL == engine->pefuncs->is_valid_lang ||
- NULL == engine->pefuncs->support_silence ||
- NULL == engine->pefuncs->support_recognition_type ||
- NULL == engine->pefuncs->get_audio_format ||
- NULL == engine->pefuncs->set_silence_detection ||
- NULL == engine->pefuncs->start ||
- NULL == engine->pefuncs->set_recording ||
- NULL == engine->pefuncs->stop ||
- NULL == engine->pefuncs->cancel ||
- NULL == engine->pefuncs->foreach_result_time)
- /* Current unused functions
- NULL == engine->pefuncs->start_file_recognition ||
- */
- {
- SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] The engine functions are NOT valid");
- dlclose(engine->handle);
- free(engine->pefuncs);
- free(engine->pdfuncs);
- free(engine->engine_path);
- free(engine);
-
- return STTP_ERROR_OPERATION_FAILED;
- }
-
- SECURE_SLOG(LOG_DEBUG, stt_tag(), "[Engine Success] Load engine : version(%d), size(%d)",engine->pefuncs->version, engine->pefuncs->size);
-
- g_engine_list = g_slist_append(g_engine_list, engine);