262 lines
7.4 KiB
C
Raw Normal View History

2024-01-08 23:37:00 +08:00
#ifndef API_ADAPTER_H
#define API_ADAPTER_H
#include <cstdint>
// forward-declaration to avoid including Windows.h in header
#ifndef _WINDEF_
struct HINSTANCE__;
typedef HINSTANCE__* HINSTANCE;
#endif
namespace ebyroid {
static constexpr int32_t kMaxVoiceName = 80;
static constexpr int32_t kControlLength = 12;
static constexpr int32_t kConfigRawbufSize = 0x158880;
static constexpr int32_t kLenSeedValue = 0;
enum EventReasonCode : uint32_t {
TEXTBUF_FULL = 0x00000065,
TEXTBUF_FLUSH = 0x00000066,
TEXTBUF_CLOSE = 0x00000067,
RAWBUF_FULL = 0x000000C9,
RAWBUF_FLUSH = 0x000000CA,
RAWBUF_CLOSE = 0x000000CB,
PH_LABEL = 0x0000012D,
BOOKMARK = 0x0000012E,
AUTOBOOKMARK = 0x0000012F
};
enum ExtendFormat : uint32_t {
NONE = 0,
JEITA_RUBY = 1,
AUTO_BOOKMARK = 16,
BOTH = JEITA_RUBY | AUTO_BOOKMARK
};
enum JobInOut : uint32_t {
IOMODE_PLAIN_TO_WAVE = 11,
IOMODE_AIKANA_TO_WAVE = 12,
IOMODE_JEITA_TO_WAVE = 13,
IOMODE_PLAIN_TO_AIKANA = 21,
IOMODE_AIKANA_TO_JEITA = 32
};
enum ResultCode : int32_t {
ERR_USERDIC_NOENTRY = -1012,
ERR_USERDIC_LOCKED = -1011,
ERR_COUNT_LIMIT = -1004,
ERR_READ_FAULT = -1003,
ERR_PATH_NOT_FOUND = -1002,
ERR_FILE_NOT_FOUND = -1001,
ERR_OUT_OF_MEMORY = -206,
ERR_JOB_BUSY = -203,
ERR_INVALID_JOBID = -202,
ERR_TOO_MANY_JOBS = -201,
ERR_LICENSE_REJECTED = -102,
ERR_LICENSE_EXPIRED = -101,
ERR_LICENSE_ABSENT = -100,
ERR_INSUFFICIENT = -20,
ERR_NOT_LOADED = -11,
ERR_NOT_INITIALIZED = -10,
ERR_WAIT_TIMEOUT = -4,
ERR_INVALID_ARGUMENT = -3,
ERR_UNSUPPORTED = -2,
ERR_INTERNAL_ERROR = -1,
ERR_SUCCESS = 0,
ERR_ALREADY_INITIALIZED = 10,
ERR_ALREADY_LOADED = 11,
ERR_PARTIALLY_REGISTERED = 21,
ERR_NOMORE_DATA = 204
};
enum StatusCode : int32_t {
STAT_WRONG_STATE = -1,
STAT_INPROGRESS = 10,
STAT_STILL_RUNNING = 11,
STAT_DONE = 12
};
typedef void* IntPtr;
typedef int(__stdcall* ProcTextBuf)(EventReasonCode reason_code, int32_t job_id, IntPtr user_data);
typedef int(__stdcall* ProcRawBuf)(EventReasonCode reason_code,
int32_t job_id,
uint64_t tick,
IntPtr user_data);
typedef int(__stdcall* ProcEventTTS)(EventReasonCode reason_code,
int32_t job_id,
uint64_t tick,
const char* name,
IntPtr user_data);
#pragma pack(push, 1)
struct AITalk_TTtsParam
{
// C#: public const int MAX_VOICENAME_ = 80;
enum { MAX_VOICENAME_ = 80 }; // 80 is used in AITalkMarshal.cs
struct TJeitaParam
{
char femaleName[MAX_VOICENAME_]; // default: ""
char maleName[MAX_VOICENAME_]; // default ""
int pauseMiddle; // default 0
int pauseLong; // default 0
int pauseSentence; // default 0
char control[12]; // default "" the length is used in AITalkMarshal.cs
};
struct TSpeakerParam
{
char voiceName[MAX_VOICENAME_];
float volume;
float speed;
float pitch;
float range;
int pauseMiddle;
int pauseLong;
int pauseSentence;
};
unsigned int size; // default 308
ProcTextBuf proc_text_buf;
ProcRawBuf proc_raw_buf;
ProcEventTTS proc_event_tts;
unsigned int lenTextBufBytes; // default 16384
unsigned int lenRawBufBytes; // default 176400
float volume; // default 1
int pauseBegin; // default -1
int pauseTerm; // default -1
char voiceName[MAX_VOICENAME_]; // default empty
TJeitaParam Jeita;
unsigned int numSpeakers; // default 0
int __reserved__;
TSpeakerParam Speaker[1]; // TSpeakerParam[] Speaker;
size_t TotalSize() const
{
return sizeof(*this) + numSpeakers * sizeof(TSpeakerParam);
}
};
struct TTtsParam {
uint32_t size;
ProcTextBuf proc_text_buf;
ProcRawBuf proc_raw_buf;
ProcEventTTS proc_event_tts;
uint32_t len_text_buf_bytes;
uint32_t len_raw_buf_bytes;
float volume;
int32_t pause_begin;
int32_t pause_term;
ExtendFormat extend_format;
char voice_name[kMaxVoiceName];
struct TJeitaParam {
char female_name[kMaxVoiceName];
char male_name[kMaxVoiceName];
int32_t pause_middle;
int32_t pause_long;
int32_t pause_sentence;
char control[kControlLength];
};
TJeitaParam jeita;
uint32_t num_speakers;
int32_t __reserved__;
struct TSpeakerParam {
char voice_name[kMaxVoiceName];
float volume;
float speed;
float pitch;
float range;
int32_t pause_middle;
int32_t pause_long;
int32_t pause_sentence;
char style_rate[kMaxVoiceName];
};
TSpeakerParam speaker[1];
};
#pragma pack(pop)
#pragma pack(push, 1)
struct TJobParam {
JobInOut mode_in_out;
IntPtr user_data;
};
#pragma pack(pop)
#pragma pack(push, 1)
struct TConfig {
uint32_t hz_voice_db;
const char* dir_voice_dbs;
uint32_t msec_timeout;
const char* path_license;
const char* code_auth_seed;
uint32_t len_auth_seed;
};
#pragma pack(pop)
class ApiAdapter {
public:
ApiAdapter(const ApiAdapter&) = delete;
ApiAdapter(ApiAdapter&&) = delete;
~ApiAdapter();
static ApiAdapter* Create( const char* );
ResultCode Init(TConfig* config);
ResultCode End();
ResultCode SetParam(IntPtr p_param);
ResultCode GetParam(IntPtr p_param, uint32_t* size);
ResultCode LangLoad(const char* dir_lang);
ResultCode VoiceLoad(const char* voice_name);
ResultCode VoiceClear();
ResultCode TextToKana(int32_t* job_id, TJobParam* param, const char* text);
ResultCode CloseKana(int32_t job_id, int32_t use_event = 0);
ResultCode GetKana(int32_t job_id,
char* text_buf,
uint32_t len_buf,
uint32_t* size,
uint32_t* pos);
ResultCode TextToSpeech(int32_t* job_id, TJobParam* param, const char* text);
ResultCode CloseSpeech(int32_t job_id, int32_t use_event = 0);
ResultCode GetData(int32_t job_id, int16_t* raw_buf, uint32_t len_buf, uint32_t* size);
private:
ApiAdapter(HINSTANCE dll_instance) : dll_instance_(dll_instance) {}
typedef ResultCode(__stdcall* ApiInit)(TConfig*);
typedef ResultCode(__stdcall* ApiEnd)(void);
typedef ResultCode(__stdcall* ApiSetParam)(IntPtr);
typedef ResultCode(__stdcall* ApiGetParam)(IntPtr, uint32_t*);
typedef ResultCode(__stdcall* ApiLangLoad)(const char*);
typedef ResultCode(__stdcall* ApiVoiceLoad)(const char*);
typedef ResultCode(__stdcall* ApiVoiceClear)(void);
typedef ResultCode(__stdcall* ApiTextToKana)(int32_t*, TJobParam*, const char*);
typedef ResultCode(__stdcall* ApiCloseKana)(int32_t, int32_t);
typedef ResultCode(__stdcall* ApiGetKana)(int32_t, char*, uint32_t, uint32_t*, uint32_t*);
typedef ResultCode(__stdcall* ApiTextToSpeech)(int32_t*, TJobParam*, const char*);
typedef ResultCode(__stdcall* ApiCloseSpeech)(int32_t, int32_t);
typedef ResultCode(__stdcall* ApiGetData)(int32_t, int16_t*, uint32_t, uint32_t*);
HINSTANCE dll_instance_ = nullptr;
ApiInit init_;
ApiEnd end_;
ApiVoiceLoad voice_load_;
ApiVoiceClear voice_clear_;
ApiSetParam set_param_;
ApiGetParam get_param_;
ApiLangLoad lang_load_;
ApiTextToKana text_to_kana_;
ApiCloseKana close_kana_;
ApiGetKana get_kana_;
ApiTextToSpeech text_to_speech_;
ApiCloseSpeech close_speech_;
ApiGetData get_data_;
};
} // namespace ebyroid
#endif // API_ADAPTER_H