📄 osmo4.cpp
字号:
// GPAC.cpp : Defines the class behaviors for the application.//#include "stdafx.h"#include "Osmo4.h"#include <gpac/network.h>#include "MainFrm.h"#include "OpenUrl.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// WinGPACBEGIN_MESSAGE_MAP(WinGPAC, CWinApp) //{{AFX_MSG_MAP(WinGPAC) ON_COMMAND(ID_FILEOPEN, OnOpenFile) ON_COMMAND(ID_FILE_STEP, OnFileStep) ON_COMMAND(ID_OPEN_URL, OnOpenUrl) ON_COMMAND(ID_FILE_RELOAD, OnFileReload) ON_COMMAND(ID_FILE_PLAY, OnFilePlay) ON_UPDATE_COMMAND_UI(ID_FILE_PLAY, OnUpdateFilePlay) ON_UPDATE_COMMAND_UI(ID_FILE_STEP, OnUpdateFileStep) ON_COMMAND(ID_FILE_STOP, OnFileStop) ON_UPDATE_COMMAND_UI(ID_FILE_STOP, OnUpdateFileStop) ON_COMMAND(ID_SWITCH_RENDER, OnSwitchRender) ON_COMMAND(ID_RELOAD_TERMINAL, OnReloadTerminal) ON_UPDATE_COMMAND_UI(ID_FILE_RELOAD, OnUpdateFileStop) ON_COMMAND(ID_H_ABOUT, OnAbout) //}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// WinGPAC constructionWinGPAC::WinGPAC(){}/////////////////////////////////////////////////////////////////////////////// The one and only WinGPAC objectWinGPAC theApp;class UserPassDialog : public CDialog{// Constructionpublic: UserPassDialog(CWnd* pParent = NULL); // standard constructor Bool GetPassword(const char *site_url, char *user, char *password);// Dialog Data //{{AFX_DATA(UserPassDialog) enum { IDD = IDD_PASSWD }; CStatic m_SiteURL; CEdit m_User; CEdit m_Pass; //}}AFX_DATA void SetSelection(u32 sel); char cur_ext[200], cur_mime[200];// Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(UserPassDialog) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected: const char *m_site_url; char *m_user, *m_password; // Generated message map functions //{{AFX_MSG(UserPassDialog) virtual BOOL OnInitDialog(); afx_msg void OnClose(); //}}AFX_MSG};UserPassDialog::UserPassDialog(CWnd* pParent /*=NULL*/) : CDialog(UserPassDialog::IDD, pParent){ //{{AFX_DATA_INIT(COptStream) //}}AFX_DATA_INIT}void UserPassDialog::DoDataExchange(CDataExchange* pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(UserPassDialog) DDX_Control(pDX, IDC_TXT_SITE, m_SiteURL); DDX_Control(pDX, IDC_EDIT_USER, m_User); DDX_Control(pDX, IDC_EDIT_PASSWORD, m_Pass); //}}AFX_DATA_MAP}BOOL UserPassDialog::OnInitDialog() { CDialog::OnInitDialog(); m_SiteURL.SetWindowText(m_site_url); m_User.SetWindowText(m_user); m_Pass.SetWindowText(""); return TRUE;}void UserPassDialog::OnClose(){ m_User.GetWindowText(m_user, 50); m_Pass.GetWindowText(m_password, 50);}Bool UserPassDialog::GetPassword(const char *site_url, char *user, char *password){ m_site_url = site_url; m_user = user; if (DoModal() != IDOK) return 0; return 1;}u32 get_sys_col(int idx){ u32 res; DWORD val = GetSysColor(idx); res = (val)&0xFF; res<<=8; res |= (val>>8)&0xFF; res<<=8; res |= (val>>16)&0xFF; return res;}static void Osmo4_progress_cbk(void *usr, char *title, u32 done, u32 total){ if (!total) return; CMainFrame *pFrame = (CMainFrame *) ((WinGPAC *) usr)->m_pMainWnd; s32 prog = (s32) ( (100 * (u64)done) / total); if (pFrame->m_last_prog < prog) { pFrame->console_err = GF_OK; pFrame->m_last_prog = prog; pFrame->console_message.Format("%s %02d %%", title, prog); pFrame->PostMessage(WM_CONSOLEMSG, 0, 0); if (done==total) pFrame->m_last_prog = -1; }}#define W32_MIN_WIDTH 120static log_msg(char *msg){ ::MessageBox(NULL, msg, "GPAC", MB_OK);}Bool Osmo4_EventProc(void *priv, GF_Event *evt){ u32 dur; WinGPAC *gpac = (WinGPAC *) priv; CMainFrame *pFrame = (CMainFrame *) gpac->m_pMainWnd; /*shutdown*/ if (!pFrame) return 0; switch (evt->type) { case GF_EVENT_DURATION: dur = (u32) (1000 * evt->duration.duration); //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) pFrame->m_pPlayList->GetURL() )) { 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 0; } if (gpac->m_NoConsole) return 0; /*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*/ 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); break; case GF_EVENT_CONNECT: if (pFrame->m_bStartupFile) return 0; pFrame->BuildStreamList(1); if (evt->connect.is_connected) { pFrame->BuildChapterList(0); gpac->m_isopen = 1; } else { gpac->max_duration = 0; gpac->m_isopen = 0; pFrame->BuildChapterList(1); } pFrame->m_wndToolBar.SetButtonInfo(5, ID_FILE_PLAY, TBBS_BUTTON, gpac->m_isopen ? 4 : 3); pFrame->m_Sliders.m_PosSlider.SetPos(0); pFrame->SetProgTimer(1); if (!pFrame->m_bFullScreen) { pFrame->SetFocus(); pFrame->SetForegroundWindow(); } break; case GF_EVENT_QUIT: pFrame->PostMessage(WM_CLOSE, 0L, 0L); break; case GF_EVENT_KEYDOWN: if (gpac->can_seek && evt->key.flags & GF_KEY_MOD_ALT) { s32 res; switch (evt->key.key_code) { case GF_KEY_LEFT: res = gf_term_get_time_in_ms(gpac->m_term) - 5*gpac->max_duration/100; if (res<0) res=0; gpac->PlayFromTime(res); break; case GF_KEY_RIGHT: res = gf_term_get_time_in_ms(gpac->m_term) + 5*gpac->max_duration/100; if ((u32) res>=gpac->max_duration) res = 0; gpac->PlayFromTime(res); break; case GF_KEY_DOWN: res = gf_term_get_time_in_ms(gpac->m_term) - 60000; if (res<0) res=0; gpac->PlayFromTime(res); break; case GF_KEY_UP: res = gf_term_get_time_in_ms(gpac->m_term) + 60000; if ((u32) res>=gpac->max_duration) res = 0; gpac->PlayFromTime(res); break; } } else if (evt->key.flags & GF_KEY_MOD_CTRL) { switch (evt->key.key_code) { case GF_KEY_LEFT: pFrame->m_pPlayList->PlayPrev(); break; case GF_KEY_RIGHT: pFrame->m_pPlayList->PlayNext(); break; } } else { 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; } } 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 1; case GF_EVENT_VIEWPOINTS: pFrame->BuildViewList(); return 0; case GF_EVENT_STREAMLIST: pFrame->BuildStreamList(0); return 0; case GF_EVENT_MOUSEDOUBLECLICK: pFrame->PostMessage(WM_COMMAND, ID_VIEW_FULLSCREEN); return 0; case GF_EVENT_AUTHORIZATION: { UserPassDialog passdlg; return passdlg.GetPassword(evt->auth.site_url, evt->auth.user, evt->auth.password); } case GF_EVENT_SYS_COLORS: evt->sys_cols.sys_colors[0] = get_sys_col(COLOR_ACTIVEBORDER); evt->sys_cols.sys_colors[1] = get_sys_col(COLOR_ACTIVECAPTION); evt->sys_cols.sys_colors[2] = get_sys_col(COLOR_APPWORKSPACE); evt->sys_cols.sys_colors[3] = get_sys_col(COLOR_BACKGROUND); evt->sys_cols.sys_colors[4] = get_sys_col(COLOR_BTNFACE); evt->sys_cols.sys_colors[5] = get_sys_col(COLOR_BTNHIGHLIGHT); evt->sys_cols.sys_colors[6] = get_sys_col(COLOR_BTNSHADOW); evt->sys_cols.sys_colors[7] = get_sys_col(COLOR_BTNTEXT); evt->sys_cols.sys_colors[8] = get_sys_col(COLOR_CAPTIONTEXT); evt->sys_cols.sys_colors[9] = get_sys_col(COLOR_GRAYTEXT); evt->sys_cols.sys_colors[10] = get_sys_col(COLOR_HIGHLIGHT); evt->sys_cols.sys_colors[11] = get_sys_col(COLOR_HIGHLIGHTTEXT); evt->sys_cols.sys_colors[12] = get_sys_col(COLOR_INACTIVEBORDER); evt->sys_cols.sys_colors[13] = get_sys_col(COLOR_INACTIVECAPTION); evt->sys_cols.sys_colors[14] = get_sys_col(COLOR_INACTIVECAPTIONTEXT); evt->sys_cols.sys_colors[15] = get_sys_col(COLOR_INFOBK); evt->sys_cols.sys_colors[16] = get_sys_col(COLOR_INFOTEXT); evt->sys_cols.sys_colors[17] = get_sys_col(COLOR_MENU); evt->sys_cols.sys_colors[18] = get_sys_col(COLOR_MENUTEXT); evt->sys_cols.sys_colors[19] = get_sys_col(COLOR_SCROLLBAR); evt->sys_cols.sys_colors[20] = get_sys_col(COLOR_3DDKSHADOW); evt->sys_cols.sys_colors[21] = get_sys_col(COLOR_3DFACE); evt->sys_cols.sys_colors[22] = get_sys_col(COLOR_3DHIGHLIGHT); evt->sys_cols.sys_colors[23] = get_sys_col(COLOR_3DLIGHT); evt->sys_cols.sys_colors[24] = get_sys_col(COLOR_3DSHADOW); evt->sys_cols.sys_colors[25] = get_sys_col(COLOR_WINDOW); evt->sys_cols.sys_colors[26] = get_sys_col(COLOR_WINDOWFRAME); evt->sys_cols.sys_colors[27] = get_sys_col(COLOR_WINDOWTEXT); return 1; } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -