wmp4playerView.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:12k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. // wmp4playerView.cpp : implementation of the CWmp4playerView class
  2. //
  3. #include "stdafx.h"
  4. #include "wmp4player.h"
  5. #include "wmp4playerDoc.h"
  6. #include "wmp4playerView.h"
  7. #include "our_config_file.h"
  8. #include <SDL.h>
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. /////////////////////////////////////////////////////////////////////////////
  15. // CWmp4playerView
  16. IMPLEMENT_DYNCREATE(CWmp4playerView, CFormView)
  17. BEGIN_MESSAGE_MAP(CWmp4playerView, CFormView)
  18. //{{AFX_MSG_MAP(CWmp4playerView)
  19. ON_BN_CLICKED(IDC_BROWSE_BUTTON, OnBrowseButton)
  20. ON_CBN_DROPDOWN(IDC_COMBO1, OnDropdownCombo1)
  21. ON_CBN_DBLCLK(IDC_COMBO1, OnDblclkCombo1)
  22. ON_COMMAND(ID_ENTER, OnEnter)
  23. ON_CBN_SETFOCUS(IDC_COMBO1, OnSetfocusCombo1)
  24. ON_CBN_KILLFOCUS(IDC_COMBO1, OnKillfocusCombo1)
  25. ON_CBN_SELENDOK(IDC_COMBO1, OnSelendokCombo1)
  26. ON_BN_CLICKED(IDC_PLAY_BUTTON, OnPlayButton)
  27. ON_BN_CLICKED(IDC_PAUSE_BUTTON, OnPauseButton)
  28. ON_BN_CLICKED(IDC_STOP_BUTTON, OnStopButton)
  29. ON_WM_TIMER()
  30. ON_COMMAND(ID_AUDIO_MUTE, OnAudioMute)
  31. //}}AFX_MSG_MAP
  32. ON_WM_HSCROLL()
  33. ON_MESSAGE(WM_SDL_KEY, OnSdlKey)
  34. END_MESSAGE_MAP()
  35. /////////////////////////////////////////////////////////////////////////////
  36. // CWmp4playerView construction/destruction
  37. CWmp4playerView::CWmp4playerView()
  38. : CFormView(CWmp4playerView::IDD)
  39. {
  40. //{{AFX_DATA_INIT(CWmp4playerView)
  41. //}}AFX_DATA_INIT
  42. // TODO: add construction code here
  43. m_nTimer = 0;
  44. m_timer_slider_selected = 0;
  45. }
  46. CWmp4playerView::~CWmp4playerView()
  47. {
  48. theApp.StopSession(1);
  49. }
  50. void CWmp4playerView::DoDataExchange(CDataExchange* pDX)
  51. {
  52. CFormView::DoDataExchange(pDX);
  53. //{{AFX_DATA_MAP(CWmp4playerView)
  54. DDX_Control(pDX, IDC_SLIDER2, m_volume_slider);
  55. DDX_Control(pDX, IDC_STOP_BUTTON, m_stop_button);
  56. DDX_Control(pDX, IDC_PAUSE_BUTTON, m_pause_button);
  57. DDX_Control(pDX, IDC_PLAY_BUTTON, m_play_button);
  58. DDX_Control(pDX, IDC_SLIDER1, m_time_slider);
  59. DDX_Control(pDX, IDC_COMBO1, m_combobox);
  60. //}}AFX_DATA_MAP
  61. }
  62. BOOL CWmp4playerView::PreCreateWindow(CREATESTRUCT& cs)
  63. {
  64. // TODO: Modify the Window class or styles here by modifying
  65. //  the CREATESTRUCT cs
  66. m_play_button.LoadBitmaps("PLAY_BUTTONU", "PLAY_BUTTOND",
  67.   NULL, "PLAY_BUTTON_DIS");
  68. m_pause_button.LoadBitmaps("PAUSE_BUTTONU", "PAUSE_BUTTOND",
  69.    NULL, "PAUSE_BUTTON_DIS");
  70. m_stop_button.LoadBitmaps("STOP_BUTTONU", "STOP_BUTTOND",
  71.   NULL, "STOP_BUTTON_DIS");
  72. return CFormView::PreCreateWindow(cs);
  73. }
  74. void CWmp4playerView::OnInitialUpdate()
  75. {
  76. CFormView::OnInitialUpdate();
  77. GetParentFrame()->RecalcLayout();
  78. ResizeParentToFit();
  79. m_time_slider.SetRange(0, 100);
  80. #if 0
  81. m_play_button.EnableWindow(FALSE);
  82. m_pause_button.EnableWindow(FALSE);
  83. m_stop_button.EnableWindow(FALSE);
  84. m_time_slider.EnableWindow(FALSE);
  85. #endif
  86. }
  87. void CWmp4playerView::OnUpdate (CView* pSender, LPARAM lHint, CObject* pHint)
  88. {
  89. CFormView::OnUpdate(pSender, lHint, pHint);
  90. int seekable = 0;
  91. int timer_on = 0;
  92. int volume = 0;
  93. if (theApp.m_mp4if != NULL) {
  94. OutputDebugString("On update and have appn");
  95. seekable = theApp.m_mp4if->is_seekable();
  96. int state = theApp.m_mp4if->get_state();
  97. TRACE1("State is %d", state);
  98. if (state == MP4IF_STATE_PLAY) {
  99. // Playing
  100. m_play_button.SetState(TRUE);
  101. m_pause_button.SetState(FALSE);
  102. m_stop_button.SetState(FALSE);
  103. m_pause_button.EnableWindow(TRUE);
  104. m_stop_button.EnableWindow(TRUE);
  105. timer_on = 1;
  106. } else {
  107. // Stopped or paused
  108. m_play_button.SetState(FALSE);
  109. m_pause_button.SetState(state == MP4IF_STATE_PAUSE);
  110. m_stop_button.SetState(state == MP4IF_STATE_STOP);
  111. m_play_button.EnableWindow(TRUE);
  112. m_pause_button.EnableWindow(FALSE);
  113. m_stop_button.EnableWindow(FALSE);
  114. }
  115. if (theApp.m_mp4if->has_audio()) {
  116. volume = 1;
  117. }
  118. } else {
  119. m_pause_button.SetState(FALSE);
  120. m_play_button.SetState(FALSE);
  121. m_stop_button.SetState(FALSE);
  122. m_play_button.EnableWindow(FALSE);
  123. m_pause_button.EnableWindow(FALSE);
  124. m_stop_button.EnableWindow(FALSE);
  125. }
  126. m_volume_slider.SetPos(config.get_config_value(CONFIG_VOLUME));
  127. if (volume == 0) {
  128. m_volume_slider.EnableWindow(FALSE);
  129. } else {
  130. m_volume_slider.EnableWindow(TRUE);
  131. }
  132. m_time_slider.EnableWindow(seekable);
  133. if (seekable == 0)
  134.    m_time_slider.SetPos(0);
  135. if (timer_on) {
  136. m_nTimer = SetTimer(1, 500, NULL);
  137. } else {
  138. if (m_nTimer != 0) {
  139. KillTimer(m_nTimer);
  140. m_nTimer = 0;
  141. }
  142. }
  143. }
  144. /////////////////////////////////////////////////////////////////////////////
  145. // CWmp4playerView diagnostics
  146. #ifdef _DEBUG
  147. void CWmp4playerView::AssertValid() const
  148. {
  149. CFormView::AssertValid();
  150. }
  151. void CWmp4playerView::Dump(CDumpContext& dc) const
  152. {
  153. CFormView::Dump(dc);
  154. }
  155. CWmp4playerDoc* CWmp4playerView::GetDocument() // non-debug version is inline
  156. {
  157. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CWmp4playerDoc)));
  158. return (CWmp4playerDoc*)m_pDocument;
  159. }
  160. #endif //_DEBUG
  161. /////////////////////////////////////////////////////////////////////////////
  162. // CWmp4playerView message handlers
  163. void CWmp4playerView::OnBrowseButton() 
  164. {
  165. // TODO: Add your control notification handler code here
  166. theApp.OnFileOpen();
  167. }
  168. void CWmp4playerView::OnDropdownCombo1() 
  169. {
  170. // TODO: Add your control notification handler code here
  171.    m_combobox.ResetContent();
  172.    POSITION pos;
  173.    pos = theApp.m_played.GetTailPosition(); 
  174.    if (pos == NULL) {
  175.    } else {
  176.    while (pos != NULL)
  177.    {
  178.    CString val = theApp.m_played.GetPrev(pos);
  179.    int retval = m_combobox.AddString(val);
  180.    }
  181.    }   
  182. }
  183. void CWmp4playerView::OnDblclkCombo1() 
  184. {
  185. // TODO: Add your control notification handler code here
  186. }
  187. void CWmp4playerView::OnEnter() 
  188. {
  189. // TODO: Add your command handler code here
  190. CString result;
  191. OutputDebugString("Captured entern");
  192. int sel = m_combobox.GetCurSel();
  193. if (sel == CB_ERR) {
  194. m_combobox.GetWindowText(result);
  195. } else {
  196. m_combobox.GetLBText(sel, result);
  197. }
  198. if (!result.IsEmpty()) {
  199.    theApp.StartSession(result);
  200. }
  201. }
  202. void CWmp4playerView::OnSetfocusCombo1() 
  203. {
  204. // TODO: Add your control notification handler code here
  205. OutputDebugString("Set focus combo 1n");
  206. }
  207. void CWmp4playerView::OnKillfocusCombo1() 
  208. {
  209. OutputDebugString("kill focus Combo1n");
  210. // TODO: Add your control notification handler code here
  211. }
  212. void CWmp4playerView::OnSelendokCombo1() 
  213. {
  214. // TODO: Add your control notification handler code here
  215. CString result;
  216. int sel = m_combobox.GetCurSel();
  217. if (sel != CB_ERR) {
  218. m_combobox.GetLBText(sel, result);
  219. if (!result.IsEmpty()) {
  220. theApp.StartSession(result);
  221. }
  222. }
  223. }
  224. void CWmp4playerView::OnHScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar )
  225. {
  226. if (pScrollBar->GetDlgCtrlID() == IDC_SLIDER1) {
  227. switch (nSBCode) {
  228. case TB_LINEUP:
  229. case TB_LINEDOWN:
  230. case TB_PAGEUP:
  231. case TB_PAGEDOWN:
  232. case TB_THUMBPOSITION:
  233. case TB_THUMBTRACK:
  234. case TB_TOP:
  235. case TB_BOTTOM:
  236. m_timer_slider_selected = 1;
  237. break;
  238. case TB_ENDTRACK: 
  239. m_timer_slider_selected = 0;
  240. if (theApp.m_mp4if == NULL ||
  241. theApp.m_mp4if->is_seekable() == 0) {
  242. m_time_slider.SetPos(0);
  243. break;
  244. }
  245. double seek_time = theApp.m_mp4if->get_max_time();
  246. nPos = m_time_slider.GetPos();
  247. TRACE1("Pos is %dn", nPos);
  248. seek_time *= nPos;
  249. seek_time /= 100.0;
  250. theApp.m_mp4if->seek_to(seek_time);
  251. break;
  252. }
  253. } else if (pScrollBar->GetDlgCtrlID() == IDC_SLIDER2) {
  254. if (nSBCode == TB_ENDTRACK) {
  255. config.set_config_value(CONFIG_VOLUME, 
  256.     m_volume_slider.GetPos());
  257. TRACE1("Volume to %dn", m_volume_slider.GetPos());
  258. if (theApp.m_mp4if &&
  259. theApp.m_mp4if->has_audio()) {
  260. theApp.m_mp4if->client_read_config();
  261. }
  262. }
  263. }
  264. }
  265. void CWmp4playerView::OnPlayButton() 
  266. {
  267. if (theApp.m_mp4if && 
  268. theApp.m_mp4if->get_state() != MP4IF_STATE_PLAY) {
  269. theApp.m_mp4if->play();
  270. }
  271. OnUpdate(NULL, 0, NULL);
  272. }
  273. void CWmp4playerView::OnPauseButton() 
  274. {
  275. if (theApp.m_mp4if && 
  276. theApp.m_mp4if->get_state() == MP4IF_STATE_PLAY) {
  277. theApp.m_mp4if->pause();
  278. }
  279. OnUpdate(NULL, 0, NULL);
  280. }
  281. void CWmp4playerView::OnStopButton() 
  282. {
  283. if (theApp.m_mp4if && 
  284. theApp.m_mp4if->get_state() == MP4IF_STATE_PLAY) {
  285. theApp.m_mp4if->stop();
  286. }
  287. OnUpdate(NULL, 0, NULL);
  288. }
  289. void CWmp4playerView::OnTimer(UINT nIDEvent) 
  290. {
  291. // TODO: Add your message handler code here and/or call default
  292. // TRACE1("OnTimer %dn", nIDEvent);
  293. if (m_timer_slider_selected == 0) {
  294. uint64_t curr_time;
  295. double max_time;
  296. max_time = theApp.m_mp4if->get_max_time();
  297. if (max_time != 0.0) {
  298. if (theApp.m_mp4if->get_current_time(&curr_time)) {
  299. uint64_t time = (uint64_t)(max_time * 1000.0);
  300. curr_time *= 100;
  301. curr_time /= time;
  302. m_time_slider.SetPos(curr_time);
  303. }
  304. }
  305. }
  306. CFormView::OnTimer(nIDEvent);
  307. }
  308. void CWmp4playerView::OnAudioMute() 
  309. {
  310. // TODO: Add your command handler code here
  311. theApp.OnAudioMute();
  312. OnUpdate(NULL, 0, NULL);
  313. }
  314. void CWmp4playerView::OnCloseSession(void)
  315. {
  316. OutputDebugString("Got window closen");
  317. }
  318. afx_msg LRESULT CWmp4playerView::OnSdlKey(WPARAM key, LPARAM mod)
  319. {
  320. TRACE2("SDL key %x %xn", key, mod);
  321. int screen_size;
  322. int volume;
  323. CMP4If *mp4if = theApp.m_mp4if;
  324. if (mp4if == NULL) return 0;
  325. switch (key) {
  326. case SDLK_c:
  327. if ((mod & (KMOD_LCTRL | KMOD_RCTRL)) != 0) {
  328. theApp.StopSession();
  329. }
  330. break;
  331. case SDLK_x:
  332. if ((mod & (KMOD_LCTRL | KMOD_RCTRL)) != 0) {
  333. // don't know how to do this yet...
  334. }
  335. break;
  336. case SDLK_UP:
  337. volume = mp4if->get_audio_volume();
  338. volume += 10;
  339. if (volume > 100) volume = 100;
  340. config.set_config_value(CONFIG_VOLUME, volume);
  341. mp4if->set_audio_volume(volume);
  342. break;
  343. case SDLK_DOWN:
  344. volume = mp4if->get_audio_volume();
  345. volume -= 10;
  346. if (volume < 0) volume = 0;
  347. config.set_config_value(CONFIG_VOLUME, volume);
  348. mp4if->set_audio_volume(volume);
  349. break;
  350. case SDLK_SPACE:
  351. if (mp4if->get_state() == MP4IF_STATE_PLAY) {
  352. mp4if->pause();
  353. } else {
  354. mp4if->play();
  355. }
  356. break;
  357. case SDLK_END:
  358. // They want the end - just close, or go on to the next playlist.
  359. theApp.StopSession();
  360. break;
  361. case SDLK_HOME:
  362. mp4if->seek_to(0.0);
  363. break;
  364. case SDLK_RIGHT:
  365. if (mp4if->is_seekable()) {
  366. uint64_t play_time;
  367. if (mp4if->get_current_time(&play_time) == FALSE) return 0;
  368. double ptime, maxtime;
  369. play_time += 10 * M_LLU;
  370. ptime = (double)
  371. #ifdef _WIN32
  372. (int64_t)
  373. #endif
  374. play_time;
  375. ptime /= 1000.0;
  376. maxtime = mp4if->get_max_time();
  377. if (ptime < maxtime) {
  378. mp4if->seek_to(ptime);
  379. }
  380. }
  381. break;
  382. case SDLK_LEFT:
  383. if (mp4if->is_seekable()) {
  384. uint64_t play_time;
  385. if (mp4if->get_current_time(&play_time) == FALSE) return 0;
  386. double ptime;
  387. if (play_time > 10 * M_LLU) {
  388. play_time -= 10 * M_LLU;
  389. ptime = (double)
  390. #ifdef _WIN32
  391. (int64_t)
  392. #endif
  393. play_time;
  394. ptime /= 1000.0;
  395. } else ptime = 0.0;
  396. mp4if->seek_to(ptime);
  397. }
  398. break;
  399. case SDLK_PAGEUP:
  400. screen_size = mp4if->get_screen_size();
  401. if (screen_size < 2 && mp4if->get_fullscreen_state() == FALSE) {
  402. screen_size++;
  403. theApp.OnMediaVideo(screen_size + ID_MEDIA_VIDEO_50);
  404. }
  405. break;
  406. case SDLK_PAGEDOWN:
  407. screen_size = mp4if->get_screen_size();
  408. if (screen_size >= 1 && mp4if->get_fullscreen_state() == 0) {
  409. screen_size--;
  410. theApp.OnMediaVideo(screen_size + ID_MEDIA_VIDEO_50);
  411. }
  412. break;
  413. case SDLK_RETURN:
  414. if ((mod & (KMOD_LALT | KMOD_RALT)) != 0) {
  415. mp4if->set_fullscreen_state(TRUE);
  416. }
  417. break;
  418. case SDLK_ESCAPE:
  419. mp4if->set_fullscreen_state(FALSE);
  420. break;
  421. default:
  422. break;
  423. }
  424. return 0;
  425. }