[Amis-vcs] SF.net SVN: amis: [2428] branches/amis3/AmisGuiMFC2
Brought to you by:
julienq,
marisademeglio
From: <dan...@us...> - 2008-03-18 05:32:58
|
Revision: 2428 http://amis.svn.sourceforge.net/amis/?rev=2428&view=rev Author: daniel_weck Date: 2008-03-17 22:32:42 -0700 (Mon, 17 Mar 2008) Log Message: ----------- fixed the miss-synchronization issues with TTS. Now renders nicely even with fast-switching using mouse of keyboard. A good place to test is the publication summary dialog (most of the list is TTS-rendered) Modified Paths: -------------- branches/amis3/AmisGuiMFC2/include/gui/self-voicing/TTSPlayer.h branches/amis3/AmisGuiMFC2/src/gui/self-voicing/TTSPlayer.cpp Modified: branches/amis3/AmisGuiMFC2/include/gui/self-voicing/TTSPlayer.h =================================================================== --- branches/amis3/AmisGuiMFC2/include/gui/self-voicing/TTSPlayer.h 2008-03-18 05:01:55 UTC (rev 2427) +++ branches/amis3/AmisGuiMFC2/include/gui/self-voicing/TTSPlayer.h 2008-03-18 05:32:42 UTC (rev 2428) @@ -36,6 +36,8 @@ void Play(CString str); #endif void Stop(); + +void callback(); void WaitUntilDone(); long GetSpeechRate(); @@ -52,8 +54,11 @@ static TTSPlayer* pinstance; + CRITICAL_SECTION m_csSequence; + ULONG m_currentVoiceNumber; + bool mbDoNotProcessEndEvent; TTSPlayer(void); ~TTSPlayer(void); Modified: branches/amis3/AmisGuiMFC2/src/gui/self-voicing/TTSPlayer.cpp =================================================================== --- branches/amis3/AmisGuiMFC2/src/gui/self-voicing/TTSPlayer.cpp 2008-03-18 05:01:55 UTC (rev 2427) +++ branches/amis3/AmisGuiMFC2/src/gui/self-voicing/TTSPlayer.cpp 2008-03-18 05:32:42 UTC (rev 2428) @@ -86,47 +86,63 @@ USES_CONVERSION; #endif + EnterCriticalSection(&m_csSequence); + TRACE(L"\n*-*=*+*"); TRACE(str); if (IsSpeaking()) { TRACE("????????"); } TRACE("\n"); +mbDoNotProcessEndEvent = true; +m_iV->Speak(NULL, SPF_PURGEBEFORESPEAK, NULL); +WaitUntilDone(); +mbDoNotProcessEndEvent = false; + #ifdef USE_WSTRING - m_iV->Speak(str, SPF_ASYNC | SPF_PURGEBEFORESPEAK, NULL); - #else + m_iV->Speak(str, SPF_ASYNC, NULL); +#else //LPCWSTR str_ = T2W(str); -m_iV->Speak(str, SPF_ASYNC | SPF_PURGEBEFORESPEAK, NULL); +m_iV->Speak(str, SPF_ASYNC, NULL); #endif + +LeaveCriticalSection(&m_csSequence); } void TTSPlayer::Stop() { + EnterCriticalSection(&m_csSequence); TRACE(_T("\nStop TTS\r\n") ); - m_iV->Speak(NULL, SPF_ASYNC | SPF_PURGEBEFORESPEAK, NULL); - m_isSpeaking = FALSE; + mbDoNotProcessEndEvent = true; + m_iV->Speak(NULL, SPF_PURGEBEFORESPEAK, NULL); + //m_iV->Speak(L"", SPF_PURGEBEFORESPEAK, NULL); + //m_iV->Speak(L"", SPF_ASYNC | SPF_PURGEBEFORESPEAK, NULL); +WaitUntilDone(); + +m_isSpeaking = FALSE; + +LeaveCriticalSection(&m_csSequence); } void TTSPlayer::WaitUntilDone() { - +TRACE(_T("\n//// TTS BEFORE WAIT \r\n") ); m_iV->WaitUntilDone(INFINITE); +TRACE(_T("\n//// TTS AFTER WAIT \r\n") ); +} +void __stdcall SpkCallback(WPARAM wParam, LPARAM lParam) { + ((TTSPlayer *)lParam)->callback(); } +void TTSPlayer::callback() { - - - -void __stdcall SpkCallback(WPARAM wParam, LPARAM lParam) { - - CSpEvent event; // helper class in sphelper.h for events that releases any // allocated memory in it's destructor - SAFER than SPEVENT //SPVOICESTATUS Stat; @@ -144,17 +160,27 @@ { case SPEI_START_INPUT_STREAM: TRACE(_T("\nStartStream event\r\n") ); - ((TTSPlayer *)lParam)->m_isSpeaking = TRUE; + m_isSpeaking = TRUE; break; case SPEI_END_INPUT_STREAM: - TRACE(_T("\nEndStream event\r\n") ); - ((TTSPlayer *)lParam)->m_isSpeaking = FALSE; + if (m_isSpeaking) { + m_isSpeaking = FALSE; - ((TTSPlayer *)lParam)->sendMessageCallback(); - + if (mbDoNotProcessEndEvent) { + + TRACE(_T("\nEndStream 1 mbDoNotProcessEndEvent\r\n") ); + mbDoNotProcessEndEvent = false; + } else { + + TRACE(_T("\nEndStream 2 sendMessageCallback\r\n") ); + sendMessageCallback(); + } + } else { + int i = 9; + } break; case SPEI_VOICE_CHANGE: @@ -166,15 +192,22 @@ //TRACE(_T("Unknown message\r\n") ); break; } + //break; } } -bool TTSPlayer::IsSpeaking(void) {return m_isSpeaking;} +bool TTSPlayer::IsSpeaking(void) { + + return m_isSpeaking; +} TTSPlayer::TTSPlayer(void) : m_currentVoiceNumber(-1) , m_isSpeaking(FALSE) { + mbDoNotProcessEndEvent = false; + InitializeCriticalSection(&m_csSequence); + //m_iV(NULL) m_iV = NULL; HRESULT hr = 0; @@ -211,8 +244,11 @@ TTSPlayer::~TTSPlayer(void) { + mbDoNotProcessEndEvent = false; if (m_iV != NULL) m_iV->Release(); + + DeleteCriticalSection(&m_csSequence); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |