[Amis-vcs] SF.net SVN: amis: [2391] branches/amis3/AmisGuiMFC2
Brought to you by:
julienq,
marisademeglio
From: <dan...@us...> - 2008-03-05 05:37:51
|
Revision: 2391 http://amis.svn.sourceforge.net/amis/?rev=2391&view=rev Author: daniel_weck Date: 2008-03-04 21:37:51 -0800 (Tue, 04 Mar 2008) Log Message: ----------- * added a DEFINE flag to compile using a special single-thread mode for the DirectShow backend. It works well so far, but I have not tested as much as the previous design (one-thread-per-audio). Simply un/comment the flag to switch between the 2 different architectures. The single-thread should be (in theory) safer, as it means less overhead and less data to synchronize. It should definitely be cheaper at runtime, as there's only one thread allocated at startup. Modified Paths: -------------- branches/amis3/AmisGuiMFC2/include/gui/self-voicing/directshow/dx_audio_player.h branches/amis3/AmisGuiMFC2/src/gui/AmisApp.cpp branches/amis3/AmisGuiMFC2/src/gui/self-voicing/directshow/dx_audio_player.cpp Modified: branches/amis3/AmisGuiMFC2/include/gui/self-voicing/directshow/dx_audio_player.h =================================================================== --- branches/amis3/AmisGuiMFC2/include/gui/self-voicing/directshow/dx_audio_player.h 2008-03-05 04:09:10 UTC (rev 2390) +++ branches/amis3/AmisGuiMFC2/include/gui/self-voicing/directshow/dx_audio_player.h 2008-03-05 05:37:51 UTC (rev 2391) @@ -134,6 +134,8 @@ static double s_current_playback_rate = 1.0; +#define SINGLE_THREAD_HACK + namespace ambulantX { namespace gui { @@ -151,7 +153,9 @@ static audio_playerX* Instance(); static void DestroyInstance(); - +#ifdef SINGLE_THREAD_HACK +HANDLE m_hEventWakeup; +#endif ~audio_playerX(); void start(double t); Modified: branches/amis3/AmisGuiMFC2/src/gui/AmisApp.cpp =================================================================== --- branches/amis3/AmisGuiMFC2/src/gui/AmisApp.cpp 2008-03-05 04:09:10 UTC (rev 2390) +++ branches/amis3/AmisGuiMFC2/src/gui/AmisApp.cpp 2008-03-05 05:37:51 UTC (rev 2391) @@ -270,9 +270,13 @@ if (mpRecentBooks != NULL) delete mpRecentBooks; + CoUninitialize(); + + amis::util::Log::Instance()->writeMessage("AMIS EXIT."); + amis::util::Log::Instance()->endLog(); amis::util::Log::Instance()->DestroyInstance(); - CoUninitialize(); + TRACE("\nEXIT.\n\n"); Modified: branches/amis3/AmisGuiMFC2/src/gui/self-voicing/directshow/dx_audio_player.cpp =================================================================== --- branches/amis3/AmisGuiMFC2/src/gui/self-voicing/directshow/dx_audio_player.cpp 2008-03-05 04:09:10 UTC (rev 2390) +++ branches/amis3/AmisGuiMFC2/src/gui/self-voicing/directshow/dx_audio_player.cpp 2008-03-05 05:37:51 UTC (rev 2391) @@ -73,9 +73,18 @@ while(!bSelfBreak) { hResult = E_FAIL; +#ifdef SINGLE_THREAD_HACK + if (pPlayer->m_media_event == NULL) { + Sleep(100); + continue; + } +#endif + + TRACE(L"\n== THREAD BEFORE EVENT %d\n", nn); hResult = pPlayer->m_media_event->GetEvent(&lEventCode, &lParam1, &lParam2, INFINITE); - pPlayer->m_media_event->FreeEventParams(lEventCode, lParam1, lParam2); + TRACE(L"\n== THREAD AFTER EVENT %d\n", nn); + if (hResult == S_OK) { switch(lEventCode) { case EC_COMPLETE: @@ -83,12 +92,11 @@ TRACE(L"\n== THREAD EVENT COMPLETE %d\n", nn); pPlayer->stop(false, true); - - TRACE(L"\n== THREAD BEFORE CALLBACK %d\n", nn); pPlayer->sendMessageCallback(); - +#ifndef SINGLE_THREAD_HACK bSelfBreak = true; +#endif break; } case EC_USER + 4: { @@ -99,6 +107,39 @@ bSelfBreak = true; break; } + +#ifdef SINGLE_THREAD_HACK +case EC_USER + 5: { +TRACE(L"\n== THREAD BEFORE WAIT TOGGLE %d\n", nn); + DWORD hr = WaitForSingleObject(pPlayer->m_hEventWakeup, INFINITE); + switch (hr) { + case WAIT_FAILED: { + int i = 0; + break; + } + + case WAIT_ABANDONED + : { + int i = 0; + break;} + + case WAIT_OBJECT_0 + : { + int i = 0; + break;} + + case WAIT_TIMEOUT: + { + int i = 0; + break; + } + + } + TRACE(L"\n== THREAD AFTER WAIT TOGGLE %d\n", nn); + break; + } +#endif + default: TRACE(L"\n== THREAD EVENT OTHER %d (%d)\n", nn, lEventCode); } @@ -125,6 +166,9 @@ hEventHandler(0) { set_rate(1.0); + m_hEventWakeup = CreateEvent(NULL, TRUE, FALSE, NULL); + _ASSERT(m_hEventWakeup); + ResetEvent(m_hEventWakeup); InitializeCriticalSection(&m_csSequence); } @@ -230,8 +274,15 @@ void gui::dx::audio_playerX::stop(bool fromPlay, bool fromThread) { +#ifdef SINGLE_THREAD_HACK + ResetEvent(m_hEventWakeup); +#endif + if (fromThread) { + +#ifndef SINGLE_THREAD_HACK hEventHandler = NULL; +#endif return; } @@ -249,9 +300,19 @@ EnterCriticalSection(&m_csSequence); } +#ifndef SINGLE_THREAD_HACK TRACE(L"\n####### -- STOP DX || BEFORE END THREAD\n"); end_thread(); +#else + IMediaEventSink *pIMES = NULL; + m_graph_builder->QueryInterface(IID_IMediaEventSink, (void**) &pIMES); + pIMES->Notify(EC_USER + 5, 0, 0); + pIMES->Release(); + pIMES = NULL; +#endif +Sleep(100); + TRACE(L"\n####### -- STOP DX || AFTER END THREAD\n"); HRESULT hr = m_media_control->Stop(); @@ -725,6 +786,9 @@ //hEventHandler = (HANDLE) _beginthreadex(NULL, 0, eventHandler, (void*) this, 0, &lpdwThreadID); hEventHandler = CreateThread(NULL, 0, &eventHandler, this, 0, &lpdwThreadID); } +#ifdef SINGLE_THREAD_HACK + SetEvent(m_hEventWakeup); +#endif hr = m_media_control->Run(); if(FAILED(hr)) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |