#include "api_adapter.h" #include #include #include "ebyutil.h" namespace ebyroid { namespace { template inline T LoadProc(const HINSTANCE& handle, const char* proc_name) { FARPROC proc = GetProcAddress(handle, proc_name); if (proc == nullptr) { FreeLibrary(handle); char m[64]; std::snprintf(m, 64, "Could not find '%s' in the library.", proc_name); throw std::runtime_error(m); } return reinterpret_cast(proc); } } // namespace ApiAdapter* ApiAdapter::Create( const char* dllpath ) { printf("dllpath %s\n", dllpath); HINSTANCE handle = LoadLibraryA(dllpath); if (handle == nullptr) { char m[128]; printf("load error\n"); std::snprintf(m, 128, "LoadLibrary failed with code %d (Check out the voiceroid path setting)", GetLastError()); throw new std::runtime_error(m); } ApiAdapter* adapter = new ApiAdapter(handle); adapter->init_ = LoadProc(handle, "_AITalkAPI_Init@4"); adapter->end_ = LoadProc(handle, "_AITalkAPI_End@0"); adapter->voice_load_ = LoadProc(handle, "_AITalkAPI_VoiceLoad@4"); adapter->voice_clear_ = LoadProc(handle, "_AITalkAPI_VoiceClear@0"); adapter->set_param_ = LoadProc(handle, "_AITalkAPI_SetParam@4"); adapter->get_param_ = LoadProc(handle, "_AITalkAPI_GetParam@8"); adapter->lang_load_ = LoadProc(handle, "_AITalkAPI_LangLoad@4"); adapter->text_to_kana_ = LoadProc(handle, "_AITalkAPI_TextToKana@12"); adapter->close_kana_ = LoadProc(handle, "_AITalkAPI_CloseKana@8"); adapter->get_kana_ = LoadProc(handle, "_AITalkAPI_GetKana@20"); adapter->text_to_speech_ = LoadProc(handle, "_AITalkAPI_TextToSpeech@12"); adapter->close_speech_ = LoadProc(handle, "_AITalkAPI_CloseSpeech@8"); adapter->get_data_ = LoadProc(handle, "_AITalkAPI_GetData@16"); printf("load dll ok\n"); return adapter; } ApiAdapter::~ApiAdapter() { BOOL result = FreeLibrary(dll_instance_); if ( !result) { Eprintf("FreeLibrary(HMODULE) failed. Though the program will go on, may lead to fatal error."); } } ResultCode ApiAdapter::Init(TConfig* config) { return init_(config); } ResultCode ApiAdapter::End() { return end_(); } ResultCode ApiAdapter::VoiceLoad(const char* voice_name) { return voice_load_(voice_name); } ResultCode ApiAdapter::VoiceClear() { return voice_clear_(); } ResultCode ApiAdapter::SetParam(IntPtr p_param) { return set_param_(p_param); } ResultCode ApiAdapter::GetParam(IntPtr p_param, uint32_t* size) { return get_param_(p_param, size); } ResultCode ApiAdapter::LangLoad(const char* dir_lang) { return lang_load_(dir_lang); } ResultCode ApiAdapter::TextToKana(int32_t* job_id, TJobParam* param, const char* text) { return text_to_kana_(job_id, param, text); } ResultCode ApiAdapter::CloseKana(int32_t job_id, int32_t use_event) { return close_kana_(job_id, use_event); } ResultCode ApiAdapter::GetKana(int32_t job_id, char* text_buf, uint32_t len_buf, uint32_t* size, uint32_t* pos) { return get_kana_(job_id, text_buf, len_buf, size, pos); } ResultCode ApiAdapter::TextToSpeech(int32_t* job_id, TJobParam* param, const char* text) { return text_to_speech_(job_id, param, text); } ResultCode ApiAdapter::CloseSpeech(int32_t job_id, int32_t use_event) { return close_speech_(job_id, use_event); } ResultCode ApiAdapter::GetData(int32_t job_id, int16_t* raw_buf, uint32_t len_buf, uint32_t* size) { return get_data_(job_id, raw_buf, len_buf, size); } } // namespace ebyroid