/*********************************************************************
*	OggPlayer
*	SOURCE FILE
*	Autor:	Michal Jirouš
*	Datum: 16.7.2008
*	Soubor: oggplayer.cpp
*	Popis: Prehravac ogg audio/video souboru - pouziva tridy COggAudioPlayer
*			a COggVideoPlayer k teto cinnosti a provadi synchronizaci audia
*			s videem
**********************************************************************/

#include "oggplayer.h"
#include "sys_console.h"

using namespace systemConsole;

OggPlayer::OggPlayer()
{
	m_uiFps = m_uiFrameTime = 0;
	m_uiNumFrames = 0;
	m_bVideoPlaying = m_bFinnish = false;
	reset();
}

//inicializace - potrebuje hlavni surface, do ktereho se bude film vykreslovat
void OggPlayer::init( SDL_Surface *surface )
{
	console << "Initializing Ogg player." << endline;
	m_videoPlayer.setMainSurface( surface );
	m_audioPlayer.init();
}

//nacteni noveho souboru
bool OggPlayer::loadFile( const char * filename )
{
	console << "Loading movie file: " << filename << endline;
	/* video init */
	m_bVideoPlaying = m_videoPlayer.loadFile( filename );

	if( m_bVideoPlaying )
		m_uiFps = (int)m_videoPlayer.getFps();
	else
	{
		console << "Cannot open " << filename << " for video playback" << endline;
		return false;
	}

	/* audio init */
	if( m_audioPlayer.loadSound( filename ) )
		m_audioPlayer.play();
	m_uiStartTime = SDL_GetTicks();
	
	m_bFinnish = false;
	return true;
}

//prehravani
void OggPlayer::play()
{
	if( m_bVideoPlaying )
	{
		int time_per_fps = 1000 / m_uiFps;
		Uint32 currentTime = SDL_GetTicks();
		if( m_uiFrameTime <= currentTime )
		{
			m_uiNumFrames++;
			Uint32 nextFrameTime = m_uiStartTime + time_per_fps * ( m_uiNumFrames + 1 );
			if( nextFrameTime > currentTime )
				m_uiFrameTime +=  nextFrameTime - currentTime;
			
			m_bVideoPlaying = m_videoPlayer.update();
		}
	}

	//ukonceni
	if( !m_bVideoPlaying )
	{
		m_bFinnish = true;
		reset();
	}
}

//vykreslovani
void OggPlayer::draw()
{
	if( m_bVideoPlaying)
		m_videoPlayer.draw();
}

//reset pred nactenim dalsiho souboru
void OggPlayer::reset()
{
	m_uiNumFrames = 0;
	m_videoPlayer.reset();
	m_audioPlayer.stop();
	m_bVideoPlaying = false;
}

//ukonceni
void OggPlayer::destroy()
{
	m_audioPlayer.destroy();
}



