static Bool play_pause_seek_gettime(GF_Terminal *term, const char *fn) { u32 time; const u32 target_time_in_ms = 10000; //play connected = GF_FALSE; gf_term_connect_from_time(term, fn, 0, GF_FALSE); while (!connected) gf_sleep(1); //seek to target_time_in_ms gf_term_play_from_time(term, target_time_in_ms, GF_FALSE); gf_term_set_option(term, GF_OPT_PLAY_STATE, GF_STATE_STEP_PAUSE); time = gf_term_get_time_in_ms(term); assert(time == target_time_in_ms); //seek to 0 connected = GF_FALSE; gf_term_play_from_time(term, 0, GF_FALSE); while (!connected) gf_sleep(1); time = gf_term_get_time_in_ms(term); assert(time == 0); return GF_TRUE; }
void ProgressBar::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { COsmo4 *app = GetApp(); if (pScrollBar->GetDlgCtrlID() == IDC_SLIDER) { if (!app->m_can_seek) return; switch (nSBCode) { case TB_LINEUP: case TB_LINEDOWN: case TB_PAGEUP: case TB_PAGEDOWN: case TB_THUMBPOSITION: case TB_THUMBTRACK: case TB_TOP: case TB_BOTTOM: m_grabbed = 1; break; case TB_ENDTRACK: if (!app->m_open) { SetPosition(0); } else { u32 seek_to = m_Slider.GetPos(); gf_term_play_from_time(app->m_term, seek_to, 0); } m_grabbed = 0; return; } } CDialog::OnHScroll(nSBCode, nPos, pScrollBar); }
void V4SceneGraph::LoadFileOld(const char *path) { m_pService = new V4Service(path); gf_term_attach_service(m_term, m_pService->m_pNetClient); m_pIs = m_term->root_scene; m_pSg = m_pIs->graph; gf_term_play_from_time(m_term, 0); while(!m_pIs->graph_attached) {} // CreateDictionnary crashes because the root node in m_pSg is not set. CreateDictionnary(); }
void CMainFrame::UpdateTime() { u32 now; COsmo4 *app = GetApp(); if (!app->m_open || app->m_stoped) return; now = gf_term_get_time_in_ms(app->m_term); if (!now) return; if (app->m_can_seek && (now>=app->m_duration + 100)) { if (gf_term_get_option(app->m_term, GF_OPT_IS_FINISHED)) { if (app->m_Loop && m_full_screen) { gf_term_play_from_time(app->m_term, 0, 0); } else { OnFileStop(); if (app->m_Loop) OnFilePause(); } return; } } if (!m_full_screen) m_progBar.SetPosition(now); }
Bool GPAC_EventProc(void *ptr, GF_Event *evt) { switch (evt->type) { case GF_EVENT_DURATION: Duration = (u32) (evt->duration.duration*1000); CanSeek = evt->duration.can_seek; break; case GF_EVENT_MESSAGE: { if (!evt->message.message) return 0; GF_LOG(GF_LOG_ERROR, GF_LOG_CONSOLE, ("%s: %s\n", evt->message.message, gf_error_to_string(evt->message.error))); //set_status((char *) evt->message.message); } break; case GF_EVENT_PROGRESS: { char *szTitle = ""; if (evt->progress.progress_type==0) szTitle = "Buffer "; else if (evt->progress.progress_type==1) szTitle = "Download "; else if (evt->progress.progress_type==2) szTitle = "Import "; cbk_on_progress(szTitle, evt->progress.done, evt->progress.total); } break; case GF_EVENT_SIZE: break; case GF_EVENT_RESOLUTION: recompute_res(evt->size.width, evt->size.height); do_layout(1); break; case GF_EVENT_SCENE_SIZE: do_layout(1); break; case GF_EVENT_DBLCLICK: set_full_screen(); return 0; case GF_EVENT_CONNECT: if (evt->connect.is_connected) { is_connected = 1; if (!backlight_off) set_backlight_state(1); refresh_recent_files(); navigation_on = (gf_term_get_option(term, GF_OPT_NAVIGATION)==GF_NAVIGATE_NONE) ? 0 : 1; } else { navigation_on = 0; is_connected = 0; Duration = 0; } break; case GF_EVENT_EOS: if (Duration>2000) gf_term_play_from_time(term, 0, 0); break; case GF_EVENT_QUIT: PostMessage(g_hwnd, WM_DESTROY, 0, 0); break; case GF_EVENT_KEYDOWN: switch (evt->key.key_code) { case GF_KEY_ENTER: if (full_screen) set_full_screen(); break; case GF_KEY_1: ctrl_mod_down = !ctrl_mod_down; evt->key.key_code = GF_KEY_CONTROL; evt->type = ctrl_mod_down ? GF_EVENT_KEYDOWN : GF_EVENT_KEYUP; gf_term_user_event(term, evt); break; case GF_KEY_MEDIAPREVIOUSTRACK: playlist_act = 2; break; case GF_KEY_MEDIANEXTTRACK: playlist_act = 1; break; } break; case GF_EVENT_NAVIGATE: if (gf_term_is_supported_url(term, evt->navigate.to_url, 1, 1)) { gf_term_navigate_to(term, evt->navigate.to_url); return 1; } else { #ifdef _WIN32_WCE u16 dst[1024]; #endif SHELLEXECUTEINFO info; /* if (full_screen) gf_term_set_option(term, GF_OPT_FULLSCREEN, 0); full_screen = 0; */ memset(&info, 0, sizeof(SHELLEXECUTEINFO)); info.cbSize = sizeof(SHELLEXECUTEINFO); info.lpVerb = _T("open"); info.fMask = SEE_MASK_NOCLOSEPROCESS; info.lpFile = _T("iexplore"); #ifdef _WIN32_WCE CE_CharToWide((char *) evt->navigate.to_url, dst); info.lpParameters = (LPCTSTR) dst; #else info.lpParameters = evt->navigate.to_url; #endif info.nShow = SW_SHOWNORMAL; ShellExecuteEx(&info); } return 1; } return 0; }
Bool Osmo4CE_EventProc(void *priv, GF_Event *event) { u32 dur; COsmo4 *app = (COsmo4 *) priv; CMainFrame *pFrame = (CMainFrame *) app->m_pMainWnd; /*shutdown*/ if (!pFrame) return 0; switch (event->type) { case GF_EVENT_MESSAGE: if (event->message.error!=GF_OK) { if (event->message.error<GF_OK) { pFrame->console_err = event->message.error; pFrame->console_message = event->message.message; pFrame->PostMessage(WM_CONSOLEMSG, 0, 0); } return 0; } if (1) return 0; /*process user message*/ pFrame->console_err = GF_OK; pFrame->console_message = event->message.message; pFrame->PostMessage(WM_CONSOLEMSG, 0, 0); break; case GF_EVENT_SIZE: break; case GF_EVENT_SCENE_SIZE: app->m_scene_width = event->size.width; app->m_scene_height = event->size.height; if (!pFrame->m_full_screen) pFrame->PostMessage(WM_SETSIZE, event->size.width, event->size.height); break; case GF_EVENT_CONNECT: app->m_open = event->connect.is_connected; break; case GF_EVENT_DURATION: dur = (u32) (1000 * event->duration.duration); if (dur<2000) dur = 0; app->m_duration = dur; app->m_can_seek = event->duration.can_seek && dur; pFrame->m_progBar.m_range_invalidated = 1; /*by default, don't display timing if not seekable and vice-versa*/ if (app->m_can_seek != pFrame->m_view_timing) { pFrame->m_view_timing = app->m_can_seek; if (!pFrame->m_full_screen) pFrame->PostMessage(WM_SETSIZE, 0, 0); } break; case GF_EVENT_NAVIGATE: /*store URL since it may be destroyed, and post message*/ app->m_navigate_url = event->navigate.to_url; pFrame->PostMessage(WM_NAVIGATE, NULL, NULL); return 1; case GF_EVENT_QUIT: pFrame->PostMessage(WM_CLOSE, 0L, 0L); break; /*ipaq keys*/ case GF_EVENT_KEYDOWN: switch (event->key.key_code) { case GF_KEY_F1: pFrame->PostMessage(WM_COMMAND, ID_FILE_OPEN); break; case GF_KEY_F2: pFrame->PostMessage(WM_QUIT); break; case GF_KEY_F3: pFrame->PostMessage(WM_COMMAND, ID_FILE_RESTART); break; case GF_KEY_F5: pFrame->PostMessage(WM_COMMAND, ID_VIEW_FULLSCREEN); break; case GF_KEY_ENTER: pFrame->PostMessage(WM_COMMAND, ID_FILE_PAUSE); break; case GF_KEY_LEFT: if (app->m_duration>=2000) { s32 res = gf_term_get_time_in_ms(app->m_term) - 5*app->m_duration/100; if (res<0) res=0; gf_term_play_from_time(app->m_term, res, 0); } break; case GF_KEY_RIGHT: if (app->m_duration>=2000) { u32 res = gf_term_get_time_in_ms(app->m_term) + 5*app->m_duration/100; if (res>=app->m_duration) res = 0; gf_term_play_from_time(app->m_term, res, 0); } break; case GF_KEY_UP: if (app->m_duration>=2000) pFrame->PostMessage(WM_COMMAND, ID_FILE_STEP); break; case GF_KEY_DOWN: gf_term_set_option(app->m_term, GF_OPT_REFRESH, 0); break; } break; case GF_EVENT_MOUSEDOUBLECLICK: pFrame->PostMessage(WM_COMMAND, ID_VIEW_FULLSCREEN); return 0; } return 0; }
Bool Osmo4_EventProc(void *priv, GF_Event *evt) { u32 dur; Osmo4 *gpac = (Osmo4 *) priv; CMainFrame *pFrame = (CMainFrame *) gpac->m_pMainWnd; /*shutdown*/ if (!pFrame) return GF_FALSE; CT2A url_ch(pFrame->m_pPlayList->GetURL()); switch (evt->type) { case GF_EVENT_DURATION: dur = (u32) (1000 * evt->duration.duration); if (dur){ pFrame->SetPlayLayout(); } //if (dur<1100) dur = 0; pFrame->m_pPlayList->SetDuration((u32) evt->duration.duration ); gpac->max_duration = dur; gpac->can_seek = evt->duration.can_seek; if (!gpac->can_seek) { pFrame->m_Sliders.m_PosSlider.EnableWindow(FALSE); } else { pFrame->m_Sliders.m_PosSlider.EnableWindow(TRUE); pFrame->m_Sliders.m_PosSlider.SetRangeMin(0); pFrame->m_Sliders.m_PosSlider.SetRangeMax(dur); } break; case GF_EVENT_MESSAGE: if (!evt->message.service || !strcmp(evt->message.service, (LPCSTR)url_ch)) { pFrame->console_service = "main service"; } else { pFrame->console_service = evt->message.service; } if (evt->message.error!=GF_OK) { if (evt->message.error<GF_OK || !gpac->m_NoConsole) { pFrame->console_err = evt->message.error; pFrame->console_message = evt->message.message; gpac->m_pMainWnd->PostMessage(WM_CONSOLEMSG, 0, 0); /*any error before connection confirm is a service connection error*/ if (!gpac->m_isopen) pFrame->m_pPlayList->SetDead(); } return GF_FALSE; } if (gpac->m_NoConsole) return GF_FALSE; /*process user message*/ pFrame->console_err = GF_OK; pFrame->console_message = evt->message.message; gpac->m_pMainWnd->PostMessage(WM_CONSOLEMSG, 0, 0); break; case GF_EVENT_PROGRESS: char *szType; if (evt->progress.progress_type==0) szType = "Buffer "; else if (evt->progress.progress_type==1) szType = "Download "; else if (evt->progress.progress_type==2) szType = "Import "; gf_set_progress(szType, evt->progress.done, evt->progress.total); break; case GF_EVENT_NAVIGATE_INFO: pFrame->console_message = evt->navigate.to_url; gpac->m_pMainWnd->PostMessage(WM_CONSOLEMSG, 1000, 0); break; case GF_EVENT_SCENE_SIZE: if (evt->size.width && evt->size.height) { gpac->orig_width = evt->size.width; gpac->orig_height = evt->size.height; if (gpac->m_term && !pFrame->m_bFullScreen) pFrame->PostMessage(WM_SETSIZE, evt->size.width, evt->size.height); } break; /*don't resize on win32 msg notif*/ #if 0 case GF_EVENT_SIZE: if (/*gpac->m_term && !pFrame->m_bFullScreen && */gpac->orig_width && (evt->size.width < W32_MIN_WIDTH) ) pFrame->PostMessage(WM_SETSIZE, W32_MIN_WIDTH, (W32_MIN_WIDTH*gpac->orig_height) / gpac->orig_width); else pFrame->PostMessage(WM_SETSIZE, evt->size.width, evt->size.height); break; #endif case GF_EVENT_CONNECT: // if (pFrame->m_bStartupFile) return 0; // Maja commented out buildstream list since menu item discarded //pFrame->BuildStreamList(GF_TRUE); if (evt->connect.is_connected) { //pFrame->BuildChapterList(GF_FALSE); gpac->m_isopen = GF_TRUE; //resetting sliders when opening a new file creates a deadlock on the window thread which is disconnecting // Maja changed: must change when change toolbar //pFrame->m_wndToolBar.SetButtonInfo(5, ID_FILE_PLAY, TBBS_BUTTON, gpac->m_isopen ? 4 : 3); //pFrame->m_wndToolBar.SetButtonInfo(2, ID_FILE_PLAY, TBBS_BUTTON, gpac->m_isopen ? 4 : 3); pFrame->m_Sliders.m_PosSlider.SetPos(0); pFrame->SetProgTimer(GF_TRUE); } else { gpac->max_duration = 0; gpac->m_isopen = GF_FALSE; //pFrame->BuildChapterList(GF_TRUE); } if (!pFrame->m_bFullScreen) { pFrame->SetFocus(); pFrame->SetForegroundWindow(); } break; case GF_EVENT_QUIT: pFrame->PostMessage(WM_CLOSE, 0L, 0L); break; case GF_EVENT_MIGRATE: { } break; case GF_EVENT_KEYDOWN: gf_term_process_shortcut(gpac->m_term, evt); /*update volume control*/ pFrame->m_Sliders.SetVolume(); switch (evt->key.key_code) { case GF_KEY_HOME: gf_term_set_option(gpac->m_term, GF_OPT_NAVIGATION_TYPE, 1); break; case GF_KEY_ESCAPE: pFrame->PostMessage(WM_COMMAND, ID_VIEW_FULLSCREEN); break; case GF_KEY_MEDIANEXTTRACK: pFrame->m_pPlayList->PlayNext(); break; case GF_KEY_MEDIAPREVIOUSTRACK: pFrame->m_pPlayList->PlayPrev(); break; case GF_KEY_H: if ((evt->key.flags & GF_KEY_MOD_CTRL) && gpac->m_isopen) gf_term_switch_quality(gpac->m_term, GF_TRUE); break; case GF_KEY_L: if ((evt->key.flags & GF_KEY_MOD_CTRL) && gpac->m_isopen) gf_term_switch_quality(gpac->m_term, GF_FALSE); break; case GF_KEY_LEFT: case GF_KEY_RIGHT: if (gpac->m_isopen && (gf_term_get_option(gpac->m_term, GF_OPT_NAVIGATION) == GF_NAVIGATE_NONE)) { if (evt->key.flags & GF_KEY_MOD_CTRL) { if (evt->key.key_code==GF_KEY_LEFT) pFrame->m_pPlayList->PlayPrev(); else if (evt->key.key_code==GF_KEY_RIGHT) pFrame->m_pPlayList->PlayNext(); } else if (gpac->can_seek && (evt->key.flags & GF_KEY_MOD_ALT)) { u32 duration = gpac->max_duration; s32 current_time = gf_term_get_time_in_ms(gpac->m_term); if (evt->key.key_code==GF_KEY_LEFT) { current_time -= 5*duration/100; if (current_time<0) current_time=0; gf_term_play_from_time(gpac->m_term, (u64) current_time, 0); } else if (evt->key.key_code==GF_KEY_RIGHT) { current_time += 5*duration/100; if ((u32) current_time < duration) { gf_term_play_from_time(gpac->m_term, (u64) current_time, 0); } } } } break; } break; case GF_EVENT_NAVIGATE: /*fixme - a proper browser would require checking mime type & co*/ /*store URL since it may be destroyed, and post message*/ gpac->m_navigate_url = evt->navigate.to_url; pFrame->PostMessage(WM_NAVIGATE, NULL, NULL); return GF_TRUE; case GF_EVENT_VIEWPOINTS: pFrame->BuildViewList(); return GF_FALSE; case GF_EVENT_STREAMLIST: //pFrame->BuildStreamList(GF_FALSE); return GF_FALSE; case GF_EVENT_SET_CAPTION: pFrame->SetWindowText(CString(evt->caption.caption)); break; case GF_EVENT_DBLCLICK: pFrame->PostMessage(WM_COMMAND, ID_VIEW_FULLSCREEN); return GF_FALSE; case GF_EVENT_AUTHORIZATION: { UserPassDialog passdlg; return passdlg.GetPassword(CString(evt->auth.site_url), CString(evt->auth.user), evt->auth.password); } } return GF_FALSE; }