windows-nt/Source/XPSP1/NT/enduser/speech/tts/prompts/regprompts/regprompts.cpp
2020-09-26 16:20:57 +08:00

259 lines
6.1 KiB
C++

/******************************************************************************
* RegPrompt.cpp *
*---------------*
*
*------------------------------------------------------------------------------
* Copyright (C) 2000 Microsoft Corporation Date: 05/05/00
* All Rights Reserved
*
********************************************************************* PACOG ***/
#include <windows.h>
#include "sphelper.h"
#include "spddkhlp.h"
#include <stdio.h>
#include <assert.h>
#include <spunicode.h>
const CLSID CLSID_PromptEng = {0x4BA3C5FA,0x2236,0x4EE7,{0xBA,0x28,0x1C,0x8B,0x39,0xD3,0x1D,0x48}};
const int g_iNumDbs = 2;
const int g_iNumLevelsBack = 4;
struct Confg
{
WCHAR* voiceName;
WCHAR* name409;
WCHAR* contextRules;
WCHAR* ttsVoice;
WCHAR* promptGain;
WCHAR* gender;
WCHAR* age;
WCHAR* language;
WCHAR* vendor;
WCHAR* rulesLang;
WCHAR rulesPath[MAX_PATH];
WCHAR* dbNames[g_iNumDbs];
WCHAR dbPaths[g_iNumDbs][MAX_PATH];
};
static Confg g_sarahCfg =
{
L"MSSarah",
L"MS Sarah",
L"DEFAULT",
L"TrueTalk Simon Min",
L"1.0",
L"Female",
L"Adult",
L"409;9",
L"Microsoft",
L"JScript",
L"",
{L"DEFAULT", L"TEST"},
{L"", L""}
};
static HRESULT CreateVoiceSubKey( Confg* pConfg, bool fVendorDefault );
//-- Static
CSpUnicodeSupport g_Unicode;
/*****************************************************************************
* main *
*-------*
* Description:
* Locate the abs path to prompt example database.
* and register it in the system registry.
*
******************************************************************* PACOG ***/
int wmain (int argc, wchar_t* argv[])
{
HRESULT hr = S_OK;
WCHAR szVoiceDataPath[MAX_PATH];
CoInitialize(NULL);
switch (argc)
{
case 2:
wcscpy (szVoiceDataPath, argv[1]);
wcscat (szVoiceDataPath, L"\\" );
break;
case 1:
//-- Get the exe's location...
if( !g_Unicode.GetModuleFileName(NULL, szVoiceDataPath, MAX_PATH) )
{
hr = HRESULT_FROM_WIN32(GetLastError());
}
//-- ...and derive abs path to VOICE and DICT data
if( SUCCEEDED(hr) )
{
WCHAR *psz;
// modulename is "<speech>\TTS\Prompts\RegPrompts\Objd\i386\RegPrompts.exe"
// data is at "<speech>\TTS\Prompts\Voices\sw"
for ( int i = 0; i < g_iNumLevelsBack; i++ )
{
psz = wcsrchr( szVoiceDataPath, '\\' );
if (psz != 0)
{
*psz= 0;
}
else
{
hr = E_FAIL;
break;
}
}
}
wcscat( szVoiceDataPath, L"\\Voices\\sw\\" );
break;
default:
printf ("RegPrompts [voicePath]\n");
goto exit;
}
wcscat( wcscpy(g_sarahCfg.rulesPath, szVoiceDataPath), L"rules.js");
wcscat( wcscpy(g_sarahCfg.dbPaths[0], szVoiceDataPath), L"prompts_main.vdb");
wcscat( wcscpy(g_sarahCfg.dbPaths[1], szVoiceDataPath), L"prompts_test.vdb");
//-- Register the voice
hr = CreateVoiceSubKey(&g_sarahCfg, FALSE);
exit:
CoUninitialize();
if (FAILED(hr))
{
return -1;
}
return 0;
}
/*****************************************************************************
* CreateVoiceSubKey *
*--------------------*
* Description:
* Each TTS voice gets installed under one registry sub-key.
* This function installs the single voice from the passed params.
*
********************************************************************** MC ***/
HRESULT CreateVoiceSubKey( Confg* pConfg, bool fVendorDefault)
{
HRESULT hr;
CComPtr<ISpObjectToken> cpToken;
CComPtr<ISpDataKey> cpDataKeyAttribs;
ISpDataKey* pRulesKey = 0;
ISpDataKey* pDbKey = 0;
hr = SpCreateNewTokenEx(
SPCAT_VOICES,
pConfg->voiceName,
&CLSID_PromptEng,
pConfg->name409,
0x409,
pConfg->name409,
&cpToken,
&cpDataKeyAttribs);
//Set attributes
if (SUCCEEDED(hr))
{
hr = cpDataKeyAttribs->SetStringValue(L"Name", pConfg->name409);
}
if (SUCCEEDED(hr))
{
hr = cpDataKeyAttribs->SetStringValue(L"Gender", pConfg->gender);
}
if (SUCCEEDED(hr))
{
hr = cpDataKeyAttribs->SetStringValue(L"Age", pConfg->age);
}
if (SUCCEEDED(hr))
{
hr = cpDataKeyAttribs->SetStringValue(L"Vendor", pConfg->vendor);
}
if (SUCCEEDED(hr))
{
hr = cpDataKeyAttribs->SetStringValue(L"Language", pConfg->language);
}
if (SUCCEEDED(hr) && fVendorDefault)
{
hr = cpDataKeyAttribs->SetStringValue(L"VendorDefault", L"");
}
// Now, the string values in the main key
if (SUCCEEDED(hr))
{
hr = cpToken->SetStringValue(L"TTSVoice", pConfg->ttsVoice);
}
if (SUCCEEDED(hr))
{
hr = cpToken->SetStringValue(L"PromptGain", pConfg->promptGain);
}
// Create rules key
if (SUCCEEDED (hr))
{
hr = cpToken->CreateKey(L"PromptRules", &pRulesKey);
}
if (SUCCEEDED(hr))
{
hr = pRulesKey->SetStringValue(L"ScriptLanguage", pConfg->rulesLang);
}
if (SUCCEEDED(hr))
{
hr = pRulesKey->SetStringValue(L"Path", pConfg->rulesPath);
}
if (pRulesKey)
{
pRulesKey->Release();
}
// Database Key
if (SUCCEEDED(hr))
{
WCHAR pszKeyName[MAX_PATH];
for (int i = 0; i<g_iNumDbs && SUCCEEDED(hr); i++)
{
swprintf(pszKeyName, L"PromptData%d", i);
hr = cpToken->CreateKey(pszKeyName, &pDbKey);
if (SUCCEEDED(hr))
{
hr = pDbKey->SetStringValue(L"Name", pConfg->dbNames[i]);
}
if (SUCCEEDED(hr))
{
hr = pDbKey->SetStringValue(L"Path", pConfg->dbPaths[i]);
}
if (pDbKey)
{
pDbKey->Release();
}
}
}
return hr;
}