home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Geek 6
/
Geek-006.iso
/
linux
/
video
/
xmovie-1.5.3.tar.gz
/
xmovie-1.5.3.tar
/
xmovie-1.5.3
/
xmovie
/
playbackengine.C
< prev
next >
Wrap
C/C++ Source or Header
|
2000-11-29
|
3KB
|
174 lines
#include "arender.h"
#include "asset.h"
#include "audiodevice.h"
#include "file.h"
#include "mainwindow.h"
#include "mwindowgui.h"
#include "playbackengine.h"
#include "vrender.h"
PlaybackEngine::PlaybackEngine(MainWindow *mwindow)
: Thread()
{
this->mwindow = mwindow;
reset_parameters();
}
PlaybackEngine::~PlaybackEngine()
{
}
int PlaybackEngine::reset_parameters()
{
arender = 0;
vrender = 0;
playing_back = 0;
scroll = 0;
return 0;
}
int PlaybackEngine::start_playback()
{
if(!playing_back)
{
playing_back = 1;
complete.lock();
startup_lock.lock();
int result = 0;
if(mwindow->asset->video_data)
{
vrender = new VRender(mwindow);
result = vrender->arm_playback();
}
if(mwindow->asset->audio_data && !result)
{
arender = new ARender(mwindow);
result = arender->arm_playback();
if(!mwindow->asset->video_data)
starting_sample = (long)(mwindow->current_percentage * mwindow->audio_file->get_audio_length());
}
scroll = new PlaybackScroll(mwindow);
synchronous = 0;
start();
timer.update();
wait_for_startup();
}
return 0;
}
int PlaybackEngine::stop_playback()
{
if(playing_back)
{
if(arender) arender->stop_playback();
if(vrender) vrender->stop_playback();
scroll->stop_playback();
complete.lock();
complete.unlock();
}
return 0;
}
int PlaybackEngine::close_playback()
{
if(playing_back)
{
if(arender) delete arender;
if(vrender) delete vrender;
delete scroll;
reset_parameters();
mwindow->gui->playbutton->set_mode(0);
playing_back = 0;
}
return 0;
}
int PlaybackEngine::wait_for_startup()
{
startup_lock.lock();
startup_lock.unlock();
if(arender) arender->wait_for_startup();
if(vrender) vrender->wait_for_startup();
scroll->wait_for_startup();
return 0;
}
// Get position for scrollbar and time box
int PlaybackEngine::current_position(double &percentage, double &seconds)
{
if(playing_back)
{
if(vrender && mwindow->video_file)
{
mwindow->video_file->lock_read();
mwindow->video_file->get_position(percentage, seconds);
mwindow->video_file->unlock_read();
}
else
// Audio-only uses device
if(arender && mwindow->audio_file)
{
if(!mwindow->asset->video_data)
{
long sample = current_sample() + starting_sample;
percentage = (double)sample / mwindow->audio_file->get_audio_length();
seconds = (double)sample / mwindow->asset->rate;
}
else
{
mwindow->video_file->lock_read();
mwindow->video_file->get_position(percentage, seconds);
mwindow->video_file->unlock_read();
}
}
}
else
percentage = seconds = 0;
return 0;
}
// Get position for synchronization
long PlaybackEngine::current_sample()
{
if(playing_back)
{
long result;
// Use audio driver
if(arender && arender->audio)
{
result = arender->audio->samples_rendered();
}
else
// use elapsed time
{
result = timer.get_scaled_difference(mwindow->samplerate);
}
return result;
}
return 0;
}
void PlaybackEngine::run()
{
startup_lock.unlock();
scroll->start_playback();
if(arender) arender->start();
if(vrender) vrender->start();
if(arender) arender->wait_for_completion();
if(vrender) vrender->wait_for_completion();
scroll->stop_playback();
scroll->wait_for_completion();
close_playback();
complete.unlock();
}