Как преобразовать текст в Wave с помощью SAPI с многопоточностью? - PullRequest
3 голосов
/ 05 октября 2009

Я пытаюсь преобразовать текст в волновой файл, используя следующую функцию. Он работает нормально, если вызывается из основного потока пользовательского интерфейса. Но происходит сбой при вызове из другого потока. Как вызвать его из многопоточной функции?

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();
}

1 Ответ

2 голосов
/ 05 октября 2009

Вы соинициализировали другой поток? COM должен быть инициализирован в каждом потоке, используя его. Также .. вы используете COM-объект, созданный в одном потоке в другом потоке? Потому что вам нужно маршаллировать интерфейс между потоками, если вы делаете это ...

...