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 >
C/C++ Source or Header  |  2000-11-29  |  3KB  |  174 lines

  1. #include "arender.h"
  2. #include "asset.h"
  3. #include "audiodevice.h"
  4. #include "file.h"
  5. #include "mainwindow.h"
  6. #include "mwindowgui.h"
  7. #include "playbackengine.h"
  8. #include "vrender.h"
  9.  
  10. PlaybackEngine::PlaybackEngine(MainWindow *mwindow)
  11.  : Thread()
  12. {
  13.     this->mwindow = mwindow;
  14.     reset_parameters();
  15. }
  16.  
  17. PlaybackEngine::~PlaybackEngine()
  18. {
  19. }
  20.  
  21. int PlaybackEngine::reset_parameters()
  22. {
  23.     arender = 0;
  24.     vrender = 0;
  25.     playing_back = 0;
  26.     scroll = 0;
  27.     return 0;
  28. }
  29.  
  30. int PlaybackEngine::start_playback()
  31. {
  32.     if(!playing_back)
  33.     {
  34.         playing_back = 1;
  35.         complete.lock();
  36.         startup_lock.lock();
  37.         int result = 0;
  38.  
  39.         if(mwindow->asset->video_data)
  40.         {
  41.             vrender = new VRender(mwindow);
  42.             result = vrender->arm_playback();
  43.         }
  44.  
  45.         if(mwindow->asset->audio_data && !result)
  46.         {
  47.             arender = new ARender(mwindow);
  48.             result = arender->arm_playback();
  49.  
  50.             if(!mwindow->asset->video_data)
  51.                 starting_sample = (long)(mwindow->current_percentage * mwindow->audio_file->get_audio_length());
  52.         }
  53.  
  54.         scroll = new PlaybackScroll(mwindow);
  55.         synchronous = 0;
  56.  
  57.         start();
  58.         timer.update();
  59.         wait_for_startup();
  60.     }
  61.     return 0;
  62. }
  63.  
  64. int PlaybackEngine::stop_playback()
  65. {
  66.     if(playing_back)
  67.     {
  68.         if(arender) arender->stop_playback();
  69.         if(vrender) vrender->stop_playback();
  70.         scroll->stop_playback();
  71.         complete.lock();
  72.         complete.unlock();
  73.     }
  74.     return 0;
  75. }
  76.  
  77. int PlaybackEngine::close_playback()
  78. {
  79.     if(playing_back)
  80.     {
  81.         if(arender) delete arender;
  82.         if(vrender) delete vrender;
  83.         delete scroll;
  84.         reset_parameters();
  85.         mwindow->gui->playbutton->set_mode(0);
  86.         playing_back = 0;
  87.     }
  88.     return 0;
  89. }
  90.  
  91. int PlaybackEngine::wait_for_startup()
  92. {
  93.     startup_lock.lock();
  94.     startup_lock.unlock();
  95.     if(arender) arender->wait_for_startup();
  96.     if(vrender) vrender->wait_for_startup();
  97.     scroll->wait_for_startup();
  98.     return 0;
  99. }
  100.  
  101. // Get position for scrollbar and time box
  102. int PlaybackEngine::current_position(double &percentage, double &seconds)
  103. {
  104.     if(playing_back)
  105.     {
  106.         if(vrender && mwindow->video_file)
  107.         {
  108.             mwindow->video_file->lock_read();
  109.             mwindow->video_file->get_position(percentage, seconds);
  110.             mwindow->video_file->unlock_read();
  111.         }
  112.         else
  113. // Audio-only uses device 
  114.         if(arender && mwindow->audio_file)
  115.         {
  116.             if(!mwindow->asset->video_data)
  117.             {
  118.                 long sample = current_sample() + starting_sample;
  119.                 percentage = (double)sample / mwindow->audio_file->get_audio_length();
  120.                 seconds = (double)sample / mwindow->asset->rate;
  121.             }
  122.             else
  123.             {
  124.                 mwindow->video_file->lock_read();
  125.                 mwindow->video_file->get_position(percentage, seconds);
  126.                 mwindow->video_file->unlock_read();
  127.             }
  128.         }
  129.     }
  130.     else
  131.         percentage = seconds = 0;
  132.  
  133.     return 0;
  134. }
  135.  
  136. // Get position for synchronization
  137. long PlaybackEngine::current_sample()
  138. {
  139.     if(playing_back)
  140.     {
  141.         long result;
  142.  
  143. // Use audio driver
  144.         if(arender && arender->audio)
  145.         {
  146.             result = arender->audio->samples_rendered();
  147.         }
  148.         else
  149. // use elapsed time
  150.         {
  151.             result = timer.get_scaled_difference(mwindow->samplerate);
  152.         }
  153.  
  154.         return result;
  155.     }
  156.     return 0;
  157. }
  158.  
  159. void PlaybackEngine::run()
  160. {
  161.     startup_lock.unlock();
  162.     scroll->start_playback();
  163.     if(arender) arender->start();
  164.     if(vrender) vrender->start();
  165.  
  166.     if(arender) arender->wait_for_completion();
  167.     if(vrender) vrender->wait_for_completion();
  168.     scroll->stop_playback();
  169.     scroll->wait_for_completion();
  170.  
  171.     close_playback();
  172.     complete.unlock();
  173. }
  174.