2009-10-05 69 views
3

我想使用以下功能將文本轉換爲波形文件。如果從主UI線程調用,它工作正常。但從另一個線程調用時會失敗。如何從多線程函數調用它?如何使用SAPI和多線程將文本轉換爲Wave?

void Pan_Channel::TextToPlaybackFile(CString Text, CString FileName) 
{ 
// Result variable 
HRESULT Result = S_OK; 

// Voice Object 
CComPtr<ISpVoice> cpVoice; 

// Create a SAPI Voice 
Result = cpVoice.CoCreateInstance(CLSID_SpVoice); 

// Audio format 
CSpStreamFormat cAudioFmt; 

// Set the audio format 
if(SUCCEEDED(Result)) 
{ 
    Result = cAudioFmt.AssignFormat(SPSF_8kHz16BitMono); 
} 

// File Stream 
CComPtr<ISpStream> cpStream; 

// Call SPBindToFile, a SAPI helper method, to bind the audio stream to the file 
if(SUCCEEDED(Result)) 
{ 
    Result = SPBindToFile(FileName, SPFM_CREATE_ALWAYS, &cpStream, 
    &cAudioFmt.FormatId(), cAudioFmt.WaveFormatExPtr()); 
} 

// set the output to cpStream so that the output audio data will be stored in cpStream 
if(SUCCEEDED(Result)) 
{ 
    Result = cpVoice->SetOutput(cpStream, TRUE); 
} 

    // Speak the text syncronously 
if(SUCCEEDED(Result)) 
{ 
    Result = cpVoice->Speak(Text.AllocSysString(), SPF_DEFAULT, NULL); 
} 

// close the stream 
if(SUCCEEDED(Result)) 
{ 
    Result = cpStream->Close(); 
} 

// Release stream 
cpStream.Release(); 

// Release voice object 
cpVoice.Release(); 
} 
+0

定義失敗。什麼失敗。如果有的話,你會得到什麼錯誤信息? – Glen 2009-10-05 16:38:31

回答

2

你有CoInitialized其他線程嗎? COM需要在每個線程上使用它進行初始化。另外..你使用在另一個線程中的一個線程中創建的COM對象?因爲你需要編組線程之間的接口,如果你這樣做...

+0

非常感謝您的回覆。我忘了調用導致問題的CoInitialize()和CoUninitialize()。現在它正在加入適當的初始化調用後工作。你能告訴我爲什麼即使沒有調用CoInitialize(),在主UI線程中調用同樣的函數也能工作嗎? – Vadakkumpadath 2009-10-05 17:29:59

+0

可能是因爲某些東西在主線程上調用了CoInitialize。 MFC初始化也許? – Goz 2009-10-05 18:14:37