/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
////																					 ////
////																					 ////
////								  - QTThread.cpp -   								 ////
////																					 ////
////																					 ////
////				        Implementation of QTThread Class             			     ////
////					      Version  1.0	(September 2001)	    					 ////
////																					 ////
////								  Nadege SONNET     								 ////
////																					 ////
////																					 ////
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////


#include "QTThread.h"
#include "Quicktime.h"


//-----------------------------------------------------------------------------
// Name: staticThreadProc()
// Thread routine
//-----------------------------------------------------------------------------
DWORD WINAPI staticThreadProc( LPVOID pThis)
{
	return ((QTThread*)pThis)->ThreadProc();
}




//-----------------------------------------------------------------------------
// Name: QTThread::QTThread()
// Constructor
//-----------------------------------------------------------------------------
QTThread::QTThread()
{
	Thread			= NULL ;
	ThreadID		= THREAD_ID++;
	ThreadIsRunning = false ;
	mymovie=NULL;
	mybuffermovie=NULL;
	mynewimage=false;
	myoffscreenGWorld=NULL;
}


//-----------------------------------------------------------------------------
// Name: QTThread::~QTThread()
// Destructor
//-----------------------------------------------------------------------------
QTThread::~QTThread()
{
	if (ThreadIsRunning) 
	{
		ThreadIsRunning = false ;
		MoviesTask(NULL,0);
		Stop();
	}
	Thread			= NULL ;
	mymovie=NULL;
	mybuffermovie=NULL;
	mynewimage=false;
	myoffscreenGWorld=NULL;

}





//-----------------------------------------------------------------------------
// Name: QTThread::Start()
// Start the thread
//-----------------------------------------------------------------------------
HRESULT QTThread::Start(Movie movie,bool *newimage,GrafPtr offscreenGWorld)
{
	if( ThreadIsRunning ) return 0;
	// Start the thread.
	mymovie=movie;
	mybuffermovie=mymovie;
	mynewimage=newimage;
	myoffscreenGWorld=offscreenGWorld;

	if( Thread )
		Stop();  // just to be safe.

  // Start the thread.
    Thread = CreateThread( NULL,
                                 0,
                                 (LPTHREAD_START_ROUTINE)staticThreadProc,
                                 this,
                                 0,
                                 (LPDWORD)&ThreadID );
    ThreadIsRunning = true;


	return 0 ;
}



//-----------------------------------------------------------------------------
// Name: QTThread::Stop()
// Stop the thread
//-----------------------------------------------------------------------------
void QTThread::Stop()
{
	
  if( Thread != NULL )
  {
    ThreadIsRunning = false;
    WaitForSingleObject( Thread, INFINITE );
    CloseHandle( Thread );
    Thread = NULL;
  }

}

//-----------------------------------------------------------------------------
// Name: QTThread::ThreadProc()
// 
//-----------------------------------------------------------------------------
DWORD QTThread::ThreadProc()
{
  OSErr err;
  while( ThreadIsRunning ) 
    {
		
		if ((mybuffermovie) && (mynewimage) && (myoffscreenGWorld))
		{
			if (*mynewimage==false)
			{
 				MoviesTask (mybuffermovie, 0);
				mymovie=mybuffermovie;
				*mynewimage=true;
				err = GetMoviesError();
				if (err!=0) 
					Stop();
				UpdatePort(myoffscreenGWorld);

			}
			if (IsMovieDone(mymovie))
			{	
				Stop();
			}
		}
        
    }
    return 0;
}


