#define SPCAT_VOICES L"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices"
#define SPKEY_ATTRIBUTES L"Attributes"
#define SPVALUE_LANGUAGE L"Language"
BOOL CActionCenter::InitializeSAPI()
{
ReleaseSAPI();
HRESULT hr;
hr = m_cpVoice.CoCreateInstance( CLSID_SpVoice );
if(hr == S_OK)
{
ISpObjectToken * pToken; // NOTE: Not a CComPtr! Be Careful.
CComPtr<IEnumSpObjectTokens> cpEnum;
hr = SpEnumTokens(SPCAT_VOICES, L"", L"", &cpEnum);
if (hr == S_OK)
{
bool fSetDefault = false;
while (cpEnum->Next(1, &pToken, NULL) == S_OK)
{
//CSpDynamicString dstrDesc;
//hr = SpGetDescription(pToken, &dstrDesc);
//if (SUCCEEDED(hr))
{
m_vecISpToken.push_back(pToken);
}
}
return (m_vecISpToken.size() > 0);
}
}
return FALSE;
}
void CActionCenter::ReleaseSAPI()
{
vector<ISpObjectToken*>::iterator it;
for(it=m_vecISpToken.begin(); it!=m_vecISpToken.end(); ++it)
{
(*it)->Release();
}
m_vecISpToken.clear();
}
void CActionCenter::SetVoice(LANGID lid)
{
vector<ISpObjectToken*>::iterator it;
WCHAR wstrLangID[32] = {0};
swprintf(wstrLangID, L"%X", lid);
for(it=m_vecISpToken.begin(); it!=m_vecISpToken.end(); ++it)
{
ISpObjectToken *pToken = (*it);
ISpDataKey *pSpDataKeyAttributes = NULL;
HRESULT hr = pToken->OpenKey(SPKEY_ATTRIBUTES, &pSpDataKeyAttributes);
if(SUCCEEDED(hr))
{
WCHAR *wstrLanguageID = NULL;
hr = pSpDataKeyAttributes->GetStringValue(SPVALUE_LANGUAGE, (WCHAR**)&wstrLanguageID);
if(SUCCEEDED(hr))
{
if(wcsstr((BSTR)wstrLanguageID, (BSTR)wstrLangID))
{
m_cpVoice->SetVoice(pToken);
break;
}
}
pSpDataKeyAttributes->Release();
}
}
}