⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 engine.c

📁 arena SDK开发应用
💻 C
📖 第 1 页 / 共 3 页
字号:
//#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 + -