igor's ru.po, update msg.txt, get_cursor_over_window tweaks
[goodguy/history.git] / cinelerra-5.1 / guicast / vicon.C
index 906fb6e938556377af762768e82dd8cd9428a823..031e9530c2b9c0bb5c22481efed7811e41b9bbe9 100644 (file)
@@ -2,7 +2,7 @@
 
 #include "bctimer.h"
 #include "bcwindow.h"
-#include "colors.h"
+#include "bccolors.h"
 #include "keys.h"
 #include "mutex.h"
 #include "condition.h"
@@ -13,16 +13,22 @@ VIcon(int vw, int vh, double rate)
        this->vw = vw;
        this->vh = vh;
        this->frame_rate = rate;
-       this->cycle_start = 0;
-       this->age = 0;
-       this->seq_no = 0;
-       this->in_use = 1;
+
+       cycle_start = 0;
+       age = 0;
+       seq_no = 0;
+       in_use = 1;
+       hidden = 0;
+       audio_data = 0;
+       audio_size = 0;
+       playing_audio = 0;
 }
 
 VIcon::
 ~VIcon()
 {
        clear_images();
+       delete [] audio_data;
 }
 
 void VIcon::
@@ -76,7 +82,7 @@ VIconThread(BC_WindowBase *wdw, int vw, int vh)
        timer = new Timer();
        this->refresh_rate = VICON_RATE;
        done = 0;
-       interrupted = 1;
+       interrupted = -1;
 }
 
 VIconThread::
@@ -87,8 +93,8 @@ VIconThread::
        draw_lock->unlock();
        if( Thread::running() ) {
                Thread::cancel();
-               Thread::join();
        }
+       Thread::join();
        t_heap.remove_all_objects();
        delete timer;
        delete draw_lock;
@@ -100,8 +106,9 @@ start_drawing()
        wdw->lock_window("VIconThread::start_drawing");
        if( view_win )
                wdw->set_active_subwindow(view_win);
-        if( interrupted )
+        if( interrupted < 0 )
                draw_lock->unlock();
+       interrupted = 0;
        wdw->unlock_window();
 }
 
@@ -110,7 +117,8 @@ stop_drawing()
 {
        wdw->lock_window("VIconThread::stop_drawing");
        set_view_popup(0);
-       interrupted = 1;
+       if( !interrupted )
+               interrupted = 1;
        wdw->unlock_window();
 }
 
@@ -130,6 +138,7 @@ int ViewPopup::button_press_event()
 bool VIconThread::
 visible(VIcon *vicon, int x, int y)
 {
+       if( vicon->hidden ) return false;
        int y0 = 0;
        int my = y + vicon->vh;
        if( my <= y0 ) return false;
@@ -203,6 +212,8 @@ int VIconThread::del_vicon(VIcon *&vicon)
 
 void VIconThread::set_view_popup(VIcon *vicon)
 {
+       if( !vicon && this->vicon )
+               this->vicon->stop_audio();
        this->vicon = vicon;
 }
 
@@ -214,6 +225,7 @@ update_view()
                VFrame *frame = viewing->frame();
                view_win = new_view_window(frame);
                view_win->show_window();
+               vicon->start_audio();
        }
        wdw->set_active_subwindow(view_win);
        return 1;
@@ -260,9 +272,8 @@ run()
 {
        while(!done) {
                draw_lock->lock("VIconThread::run 0");
-               if( done ) break;;
+               if( done ) break;
                wdw->lock_window("BC_WindowBase::run 1");
-               interrupted = 0;
                drawing_started();
                reset_images();
                int64_t seq_no = 0, now = 0;
@@ -275,7 +286,11 @@ run()
                                now = timer->get_difference();
                                if( now >= draw_flash ) break;
                                draw(next);
-                               if( !next->seq_no ) next->cycle_start = now;
+                               if( !next->seq_no ) {
+                                       next->cycle_start = now;
+                                       if( next->playing_audio )
+                                               next->start_audio();
+                               }
                                int64_t ref_no = (now - next->cycle_start) / 1000. * refresh_rate;
                                int count = ref_no - next->seq_no;
                                if( count < 1 ) count = 1;
@@ -316,6 +331,14 @@ run()
        }
 }
 
+
+void VIcon::init_audio(int audio_size)
+{
+       this->audio_size = audio_size;
+       audio_data = new uint8_t[audio_size];
+       memset(audio_data, 0, audio_size);
+}
+
 void VIcon::dump(const char *dir)
 {
        mkdir(dir,0777);