📄 engine.c
字号:
//#include "\\Engine\\Engine.h"
//#include "\\Engine\\SJTU_str.h"
//#include "\\Engine\\wordpron.h"
//#include "\\Engine\\error.h"
//#include "\\Engine\\amr2mp3.h"
#include "Engine.h"
#include "CutAmr.h"
//#include <SJTU_str.h>
//#include <wordpron.h>
//#include <error.h>
//#include <amr2mp3.h>
//#include <multimedia.h>
//#include <os_file_api.h>
#include <stdio.h>
static TCHAR *arrWordType[] =
{
TEXT("n."), TEXT("pron."), TEXT("vi."),
TEXT("vt."), TEXT("adj."), TEXT("adv."),
TEXT("perp."), TEXT("conj."), TEXT("int."),
TEXT("abbr."), TEXT("")
};
//#define MAX_CONTENT 1024
//static TCHAR szContent[MAX_CONTENT];
char g_szPhonetic[40];
// 语音库是否打开
static BOOL g_bTTSOk = FALSE;
// Engine Data
static DEData g_pData;
//新添加的语音库
static DE_HANDLE arrTrueVoice[3];
extern TCHAR g_szFocusWord[MAX_WORD_SIZE];
BOOL g_Flag_Ecindex = TRUE ;
BOOL g_Flag_Ceindex = TRUE ;
BOOL g_Flag_Truevoicedata = TRUE ;
// 初始化语音库
BOOL DDE_InitTTS()
{
unsigned short szPronNameW[255];
char szPronNameA[255];
int nTTSRes = 0;
unsigned short *pPath = NULL;
// 得到默认的语音文件路径
GetModuleFileName(NULL, szPronNameW, 255);
pPath = wcsrchr(szPronNameW, TEXT('\\'));
pPath[1] = 0;
wcscat(szPronNameW, TEXT("pron.dat"));
//WideCharToMultiByte(0, 0, szPronNameW, -1, szPronNameA, 255, NULL, NULL);
tp_sc_unicode_to_gbk(szPronNameW,255,szPronNameA,255);
nTTSRes = Init_TTS(szPronNameA);
g_bTTSOk = (0 == nTTSRes);
return g_bTTSOk;
}
// 查询TTS语音库是否打开
BOOL DDE_TTSIsOk()
{
return g_bTTSOk;
}
// 卸载TTS语音库
void DDE_UnInitTTS()
{
if (g_bTTSOk)
{
Uninit_TTS();
g_bTTSOk = FALSE;
}
}
#if 1
// 初始化单词Engine
BOOL DDE_InitDDEngine()
{
int i = 0, j = 0;
int nLength = 0;
static DE_HANDLE arrLib[LIB_COUNT + 1];
LPDEData lpDEData = &g_pData;
TCHAR szEcName[128], szCeName[128],szReciteName[128]; /***** 20061122 wangjf *********/
TCHAR szTrueVoice[3][128];
TCHAR* pPath = NULL;
unsigned char error = 0;
memset( lpDEData, 0, sizeof(DEData) );
// 得到默认的语音文件路径
GetModuleFileName(NULL, szEcName, 128);
pPath = wcsrchr(szEcName, '\\');
pPath[1] = 0;
wcscat(szEcName, TEXT("Ec0.dat"));
GetModuleFileName(NULL, szCeName, 128);
pPath = wcsrchr(szCeName, '\\');
pPath[1] = 0;
wcscat(szCeName, TEXT("Ce0.dat"));
GetModuleFileName(NULL, szReciteName, 128); /************ 20061122 wangjf ***************/
pPath = wcsrchr(szReciteName, '\\');
pPath[1] = 0;
wcscat(szReciteName, TEXT("recite.dat"));
GetModuleFileName(NULL, szTrueVoice[0], 128);
pPath = wcsrchr(szTrueVoice[0], '\\');
pPath[1] = 0;
wcscat(szTrueVoice[0], TEXT("ecindex.dat"));
GetModuleFileName(NULL, szTrueVoice[1], 128);
pPath = wcsrchr(szTrueVoice[1], '\\');
pPath[1] = 0;
wcscat(szTrueVoice[1], TEXT("ceindex.dat"));
GetModuleFileName(NULL, szTrueVoice[2], 128);
pPath = wcsrchr(szTrueVoice[2], '\\');
pPath[1] = 0;
wcscat(szTrueVoice[2], TEXT("truevoicedata.dat"));
// Open Ec Dict
arrLib[0] = (unsigned long)CreateFile(szEcName, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if ( INVALID_HANDLE_VALUE ==(HANDLE) arrLib[0] )
{
CloseHandle((HANDLE)arrLib[0]);
MessageBox(NULL, TEXT("无法打开基本词库Ec!"), TEXT("错误"), MB_OK);
return FALSE;
}
// Open Ce Dict
arrLib[1] =(unsigned long) CreateFile(szCeName, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if ( INVALID_HANDLE_VALUE == (HANDLE)arrLib[1] )
{
CloseHandle((HANDLE)arrLib[0]);
CloseHandle((HANDLE)arrLib[1]);
MessageBox(NULL, TEXT("无法打开基本词库Ce!"), TEXT("错误"), MB_OK);
return FALSE;
}
//Open Recite data /************ 20061122 wangjf ***************/
arrLib[2] =(unsigned long) CreateFile(szReciteName, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if ( INVALID_HANDLE_VALUE == (HANDLE)arrLib[2] )
{
CloseHandle((HANDLE)arrLib[0]);
CloseHandle((HANDLE)arrLib[1]);
CloseHandle((HANDLE)arrLib[2]);
MessageBox(NULL, TEXT("无法打开基本词库Recite!"), TEXT("错误"), MB_OK);
return FALSE;
}
arrTrueVoice[0] =(unsigned long) CreateFile(szTrueVoice[0], GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if ( INVALID_HANDLE_VALUE == (HANDLE)arrTrueVoice[0] )
{
CloseHandle((HANDLE)arrTrueVoice[0]);
g_Flag_Ecindex = FALSE ;
}
arrTrueVoice[1] =(unsigned long) CreateFile(szTrueVoice[1], GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if ( INVALID_HANDLE_VALUE == (HANDLE)arrTrueVoice[1] )
{
CloseHandle((HANDLE)arrTrueVoice[0]);
CloseHandle((HANDLE)arrTrueVoice[1]);
g_Flag_Ceindex = FALSE ;
}
arrTrueVoice[2] =(unsigned long) CreateFile(szTrueVoice[2], GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if ( INVALID_HANDLE_VALUE == (HANDLE)arrTrueVoice[2] )
{
CloseHandle((HANDLE)arrTrueVoice[0]);
CloseHandle((HANDLE)arrTrueVoice[1]);
CloseHandle((HANDLE)arrTrueVoice[2]);
g_Flag_Truevoicedata = FALSE ;
}
// 初始化结构体
lpDEData->pStandardLib = (DE_HANDLE*)&arrLib;
lpDEData->PageSize = MAX_LIST_ITEMS;
lpDEData->pUserLib = (DE_HANDLE)arrLib[2];
lpDEData->NumofStandardLib = LIB_COUNT;
lpDEData->Seek = Seek;
lpDEData->Read = Read;
lpDEData->Write = Write;
lpDEData->pRAM = NULL;
nLength = DEGetMemSize(lpDEData);
lpDEData->pRAM = (unsigned char*)malloc(nLength + 100);
error = DEInit(lpDEData);
if ( error != DE_OK)
{
/***** +1 ** 20061124 wangjf ********/
for (i = 0; i< LIB_COUNT + 1; i++)
{
CloseHandle((HANDLE)arrLib[i]);
CloseHandle((HANDLE)arrTrueVoice[i]);
}
MessageBox(NULL, TEXT("无法初始化词库引擎"), TEXT("错误"), MB_OK);
return FALSE;
}
DENumInit((DE_HANDLE)arrTrueVoice[0], (DE_HANDLE)arrTrueVoice[1]);
DESetVoiceData(lpDEData, (DE_HANDLE)arrTrueVoice[2]);
return TRUE;
}
#endif
#if 0
// 初始化单词Engine
BOOL DDE_InitDDEngine()
{
int i = 0, j = 0;
int nLength = 0;
static DE_HANDLE arrLib[LIB_COUNT + 1];
// static DE_HANDLE arrReciteLib ;
LPDEData lpDEData = &g_pData;
char szEcName[128], szCeName[128],szReciteName[128]; /***** 20061122 wangjf *********/
char szTrueVoice[3][128];
char* pPath = NULL;
unsigned char error = 0;
char szDefaultPath[128];
memset( lpDEData, 0, sizeof(DEData) );
//当前执行文件路径
tp_getcwd(szDefaultPath,256);// /flash/
strcpy(szEcName,szDefaultPath);
strcat(szEcName,"ec0.dat");
strcpy(szCeName,szDefaultPath);
strcat(szCeName,"ce0.dat");
strcpy(szReciteName,szDefaultPath);
strcat(szReciteName,"recite.dat");
strcpy(szTrueVoice[0],szDefaultPath);
strcat(szTrueVoice[0],"ecindex.dat");
strcpy(szTrueVoice[1],szDefaultPath);
strcat(szTrueVoice[1],"ceindex.dat");
strcpy(szTrueVoice[2],szDefaultPath);
strcat(szTrueVoice[2],"truevoicedata.dat");
// Open Ec Dict
arrLib[0] = (unsigned long)CreateFile(szEcName, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if ( INVALID_HANDLE_VALUE ==(HANDLE) arrLib[0] )
{
CloseHandle((HANDLE)arrLib[0]);
MessageBox(NULL, TEXT("无法打开基本词库Ec!"), TEXT("错误"), MB_OK);
return FALSE;
}
// Open Ce Dict
arrLib[1] =(unsigned long) CreateFile(szCeName, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if ( INVALID_HANDLE_VALUE == (HANDLE)arrLib[1] )
{
CloseHandle((HANDLE)arrLib[0]);
CloseHandle((HANDLE)arrLib[1]);
MessageBox(NULL, TEXT("无法打开基本词库Ce!"), TEXT("错误"), MB_OK);
return FALSE;
}
//Open Recite data /************ 20061122 wangjf ***************/
arrLib[2] =(unsigned long) CreateFile(szReciteName, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if ( INVALID_HANDLE_VALUE == (HANDLE)arrLib[2] )
{
CloseHandle((HANDLE)arrLib[0]);
CloseHandle((HANDLE)arrLib[1]);
CloseHandle((HANDLE)arrLib[2]);
MessageBox(NULL, TEXT("无法打开基本词库Recite!"), TEXT("错误"), MB_OK);
return FALSE;
}
arrTrueVoice[0] =(unsigned long) CreateFile(szTrueVoice[0], GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if ( INVALID_HANDLE_VALUE == (HANDLE)arrTrueVoice[0] )
{
CloseHandle((HANDLE)arrTrueVoice[0]);
g_Flag_Ecindex = FALSE ;
}
arrTrueVoice[1] =(unsigned long) CreateFile(szTrueVoice[1], GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if ( INVALID_HANDLE_VALUE == (HANDLE)arrTrueVoice[1] )
{
CloseHandle((HANDLE)arrTrueVoice[0]);
CloseHandle((HANDLE)arrTrueVoice[1]);
g_Flag_Ceindex = FALSE ;
}
arrTrueVoice[2] =(unsigned long) CreateFile(szTrueVoice[2], GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if ( INVALID_HANDLE_VALUE == (HANDLE)arrTrueVoice[2] )
{
CloseHandle((HANDLE)arrTrueVoice[0]);
CloseHandle((HANDLE)arrTrueVoice[1]);
CloseHandle((HANDLE)arrTrueVoice[2]);
g_Flag_Truevoicedata = FALSE ;
}
// 初始化结构体
lpDEData->pStandardLib = (DE_HANDLE*)&arrLib;
lpDEData->PageSize = MAX_LIST_ITEMS;
lpDEData->pUserLib = (DE_HANDLE)arrLib[2];
lpDEData->NumofStandardLib = LIB_COUNT;
lpDEData->Seek = Seek;
lpDEData->Read = Read;
lpDEData->Write = Write;
lpDEData->pRAM = NULL;
nLength = DEGetMemSize(lpDEData);
//lpDEData->pRAM = (unsigned char*)malloc(nLength);
//lpDEData->pRAM = (unsigned char*)GlobalAlloc(GMEM_FIXED, nLength);
lpDEData->pRAM = (unsigned char*)malloc(nLength + 100);
error = DEInit(lpDEData);
if ( error != DE_OK)
{
for (i = 0; i< LIB_COUNT + 1; i++) /***** +1 ** 20061124 wangjf ********/
{
CloseHandle((HANDLE)arrLib[i]);
CloseHandle((HANDLE)arrTrueVoice[i]);
}
MessageBox(NULL, TEXT("无法初始化词库引擎"), TEXT("错误"), MB_OK);
return FALSE;
}
DENumInit((DE_HANDLE)arrTrueVoice[0], (DE_HANDLE)arrTrueVoice[1]);
DESetVoiceData(lpDEData, (DE_HANDLE)arrTrueVoice[2]);
return TRUE;
}
#endif
// 卸载单词Engine
BOOL DDE_UnInitDEEngine()
{
int i;
LPDEData lpDEData = &g_pData;
//GlobalFree(lpDEData->pRAM);
if ( lpDEData->pRAM != NULL )
{
free(lpDEData->pRAM);
lpDEData->pRAM = NULL;
}
if ( lpDEData->pStandardLib != NULL )
{
for (i = 0; i< LIB_COUNT + 1 ; i++) /***** +1 ** 20061124 wangjf ********/
{
// if ( lpDEData->pStandardLib[i] != NULL )
{
int j = 0 ;
if ( !CloseHandle((HANDLE)lpDEData->pStandardLib[i]))
{
j = GetLastError() ;
lpDEData->pStandardLib[i] = 0;
}
}
}
}
for (i = 0; i< 3; i++)
{
if ( !CloseHandle((HANDLE)arrTrueVoice[i]))
{
int jjj = GetLastError() ;
arrTrueVoice[i] = 0 ;
}
}
return TRUE;
}
BYTE DDE_SearchWord(DESTR InputWord, DESTR OutputWord)
{
return DESearchWord(&g_pData, InputWord, OutputWord);
}
BYTE DDE_GetWord(short steps, DESTR pWord)
{
return DEGetWord(&g_pData, steps, pWord);
}
short DDE_ChangeFocus(short steps)
{
return DEChangeFocus(&g_pData, steps);
}
BOOL DDE_CheckSpell( TCHAR* szInputWord, unsigned short szWord[MAX_NEAREST_WORD_NUM][MAX_WORD_SIZE] )
{
return DECheckSpell( &g_pData, (DESTR)szInputWord, szWord );
}
static int Read(DE_HANDLE hDE, void *lpBuffer, DWORD nLength)
{
DWORD dwRead = 0;
HANDLE hFile = NULL;
DWORD dwRelRead = 0;
//char szTemp[0x30] = {0};
// 检查handle的正确性
hFile = (HANDLE)hDE;
if (NULL == hFile)
{
return DE_CALLBACK_ERROR;
}
// 检查buffer
if (NULL == lpBuffer)
{
return DE_CALLBACK_ERROR;
}
// read data
//dwRead = ReadFile(hFile, (PVOID)szTemp, nLength);
if (!ReadFile(hFile, lpBuffer, nLength, &dwRelRead, NULL) || dwRelRead != (DWORD)nLength)
{
//int nRet = OS_GetError();
return DE_CALLBACK_ERROR;
}
return dwRead;
}
// 函数名 : Seek
// 描述 : 移动位置,正确返回0,错误返回DE_CALLBACK_ERROR(-1)
// 返回类型 : int CALLBACK
// 参数 : DE_HANDLE hDE
// 参数 : int lDistanceToMove
// 参数 : int dwMoveMethod
static int Seek(DE_HANDLE hDE, DWORD lDistanceToMove, DWORD dwMoveMethod)
{
HANDLE hFile = NULL;
DWORD dwResult = 0;
hFile = (HANDLE)hDE;
if (0 == hFile)
{
return DE_CALLBACK_ERROR;
}
dwResult = SetFilePointer(hFile, lDistanceToMove, NULL, dwMoveMethod);
if (0xFFFFFFFF == dwResult)
{
return DE_CALLBACK_ERROR;
}
return dwResult;
}
// 函数名 : Write
// 描述 : 写入文件,正确返回写入字节数,错误返回DE_CALLBACK_ERROR(-1)
// 返回类型 : int CALLBACK
// 参数 : DE_HANDLE hDE
// 参数 : void *lpBuffer
// 参数 : int nLength
static int Write(DE_HANDLE hDE, void *lpBuffer, DWORD nLength)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -