X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fguicast%2Fvicon.C;h=2bfedd9277b9a1465091361adafa7e1c757689a0;hb=a94468d6de897136e77c70662177f4b8b4454b6b;hp=92986663ccc25c910fbeee2ae369b4cb2aa177d2;hpb=38cb4182e11e57fc426bede3825e825e9d61433b;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/guicast/vicon.C b/cinelerra-5.1/guicast/vicon.C index 92986663..2bfedd92 100644 --- a/cinelerra-5.1/guicast/vicon.C +++ b/cinelerra-5.1/guicast/vicon.C @@ -13,17 +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; - this->hidden = 0; + + 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:: @@ -170,9 +175,15 @@ void ViewPopup::draw_vframe(VFrame *frame) ViewPopup *VIconThread::new_view_window(VFrame *frame) { - int wx = viewing->get_vx() - view_w, rx = 0; - int wy = viewing->get_vy() - view_h, ry = 0; - wdw->get_root_coordinates(wx, wy, &rx, &ry); + BC_WindowBase *parent = wdw->get_parent(); + XineramaScreenInfo *info = parent->get_xinerama_info(-1); + int cx = info ? info->x_org + info->width/2 : parent->get_root_w(0)/2; + int cy = info ? info->y_org + info->height/2 : parent->get_root_h(0)/2; + int vx = viewing->get_vx(), rx = 0; + int vy = viewing->get_vy(), ry = 0; + wdw->get_root_coordinates(vx, vy, &rx, &ry); + rx += (rx >= cx ? -view_w : viewing->vw); + ry += (ry >= cy ? -view_h : viewing->vh); ViewPopup *vwin = new ViewPopup(this, frame, rx, ry, view_w, view_h); wdw->set_active_subwindow(vwin); return vwin; @@ -207,6 +218,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; } @@ -218,6 +231,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; @@ -278,7 +292,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; @@ -319,6 +337,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);