X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ecd20d4a916884895dcd8873a9f1156e34f4ac89..7618402ddb0bc7033ea07cf447871fd3e2d77212:/samples/mediaplayer/mediaplayer.cpp?ds=sidebyside diff --git a/samples/mediaplayer/mediaplayer.cpp b/samples/mediaplayer/mediaplayer.cpp index b3d3cb273e..260a6c97cb 100644 --- a/samples/mediaplayer/mediaplayer.cpp +++ b/samples/mediaplayer/mediaplayer.cpp @@ -16,13 +16,22 @@ // the wxMediaCtrl class in wxWidgets. // // To use this sample, simply select Open File from the file menu, -// select the file you want to play - and MediaPlayer will play the file, -// showing video if neccessary. +// select the file you want to play - and MediaPlayer will play the file in a +// new notebook page, showing video if neccessary. // // You can select one of the menu options, or move the slider around // to manipulate what is playing. // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// Known bugs with wxMediaCtrl: +// +// 1) Certain backends can't play the same media file at the same time (MCI, +// Cocoa NSMovieView-Quicktime). +// 2) Positioning on Mac Carbon is messed up if put in a sub-control like a +// Notebook (like this sample does) on OS versions < 10.2. +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + // ============================================================================ // Definitions // ============================================================================ @@ -53,6 +62,10 @@ #include "wx/textdlg.h" //for getting user text from OpenURL #include "wx/notebook.h" //for wxNotebook and putting movies in pages +// Use some stuff that's not part of the current API, such as loading +// media from a URL, etc. +#define wxUSE_UNOFFICIALSTUFF 0 + // ---------------------------------------------------------------------------- // Bail out if the user doesn't want one of the // things we need @@ -66,11 +79,6 @@ #error "menus, slider, mediactrl, notebook, and timers must all be enabled for this sample!" #endif -#define MEDIASTUFF \ - if (!m_notebook || !m_notebook->GetCurrentPage()) return; \ - wxMediaCtrl* m_mediactrl = ((MyNotebookPage*)m_notebook->GetCurrentPage())->m_mediactrl; \ - wxSlider* m_slider = ((MyNotebookPage*)m_notebook->GetCurrentPage())->m_slider; - // ============================================================================ // Declarations // ============================================================================ @@ -84,20 +92,19 @@ enum { // menu items wxID_LOOP = 1, - wxID_OPENFILE, + wxID_OPENFILESAMEPAGE, + wxID_OPENFILENEWPAGE, + wxID_OPENURLSAMEPAGE, + wxID_OPENURLNEWPAGE, + wxID_CLOSECURRENTPAGE, wxID_PLAY, wxID_PAUSE, -// wxID_CLOSE, [built-in to wxWidgets] // wxID_STOP, [built-in to wxWidgets] // wxID_ABOUT, [built-in to wxWidgets] // wxID_EXIT, [built-in to wxWidgets] - - // id for our slider - wxID_SLIDER, - - wxID_NOTEBOOK, - // id for our wxMediaCtrl - wxID_MEDIACTRL + wxID_SLIDER, // event id for our slider + wxID_NOTEBOOK, // event id for our notebook + wxID_MEDIACTRL // event id for our wxMediaCtrl }; // ---------------------------------------------------------------------------- @@ -126,44 +133,61 @@ public: void OnAbout(wxCommandEvent& event); void OnLoop(wxCommandEvent& event); - void OnOpenFile(wxCommandEvent& event); - void OnOpenURL(wxCommandEvent& event); + void OnOpenFileSamePage(wxCommandEvent& event); + void OnOpenFileNewPage(wxCommandEvent& event); + void OnOpenURLSamePage(wxCommandEvent& event); + void OnOpenURLNewPage(wxCommandEvent& event); + void OnCloseCurrentPage(wxCommandEvent& event); void OnPlay(wxCommandEvent& event); void OnPause(wxCommandEvent& event); void OnStop(wxCommandEvent& event); - void OnClose(wxCommandEvent& event); - - // Slider event handlers - void OnSeek(wxCommandEvent& event); - // Media event handlers - void OnMediaStop(wxMediaEvent& event); - + // Notebook event handlers void OnPageChange(wxNotebookEvent& event); - void OnClosePage(wxCommandEvent& event); private: // Rebuild base status string (see Implementation) void ResetStatus(); + // Common open file code + void OpenFile(bool bNewPage); + void OpenURL(bool bNewPage); + + // Get the media control and slider of current notebook page + wxMediaCtrl* GetCurrentMediaCtrl(); + wxSlider* GetCurrentSlider(); + class MyTimer* m_timer; //Timer to write info to status bar wxString m_basestatus; //Base status string (see ResetStatus()) - wxNotebook* m_notebook; + wxNotebook* m_notebook; //Notebook containing our pages // So that mytimer can access MyFrame's members friend class MyTimer; }; + + +// ---------------------------------------------------------------------------- +// MyNotebookPage +// ---------------------------------------------------------------------------- + class MyNotebookPage : public wxPanel { - MyNotebookPage(wxNotebook* boook); - - + MyNotebookPage(wxNotebook* book); + + // Slider event handlers + void OnSeek(wxCommandEvent& event); + + // Media event handlers + void OnMediaFinished(wxMediaEvent& event); + public: - friend class MyFrame; + friend class MyFrame; //make MyFrame able to access private members wxMediaCtrl* m_mediactrl; //Our media control wxSlider* m_slider; //The slider below our media control + int m_nLoops; //Number of times media has looped + bool m_bLoop; //Whether we are looping or not }; // ---------------------------------------------------------------------------- @@ -260,7 +284,7 @@ bool MyApp::OnInit() // MyFrame Constructor // // 1) Create our menus -// 2) Create our controls and add them to some sizers +// 2) Create our notebook control and add it to the frame // 3) Create our status bar // 4) Connect our events // 5) Start our timer @@ -279,14 +303,24 @@ MyFrame::MyFrame(const wxString& title) _T("&About...\tF1"), _T("Show about dialog")); - menuFile->Append(wxID_OPENFILE, _T("&Open File"), _T("Open a File")); + menuFile->Append(wxID_OPENFILESAMEPAGE, _T("&Open File"), + _T("Open a File in the current notebook page")); + menuFile->Append(wxID_OPENFILENEWPAGE, _T("&Open File in a new page"), + _T("Open a File in a new notebook page")); +#if wxUSE_UNOFFICIALSTUFF + menuFile->Append(wxID_OPENURLSAMEPAGE, _T("&Open URL"), + _T("Open a URL in the current notebook page")); + menuFile->Append(wxID_OPENURLNEWPAGE, _T("&Open URL in a new page"), + _T("Open a URL in a new notebook page")); +#endif + menuFile->AppendSeparator(); + menuFile->Append(wxID_CLOSECURRENTPAGE, _T("&Close Current Page"), + _T("Close current notebook page")); menuFile->AppendSeparator(); menuFile->Append(wxID_PLAY, _T("&Play"), _T("Resume playback")); menuFile->Append(wxID_PAUSE, _T("P&ause"), _T("Pause playback")); menuFile->Append(wxID_STOP, _T("&Stop"), _T("Stop playback")); menuFile->AppendSeparator(); - menuFile->Append(wxID_CLOSE, _T("&Close"), _T("Close current notebook page")); - menuFile->AppendSeparator(); menuFile->AppendCheckItem(wxID_LOOP, _T("&Loop"), _T("Loop Selected Media")); @@ -301,6 +335,10 @@ MyFrame::MyFrame(const wxString& title) SetMenuBar(menuBar); + // + // Create our notebook - using wxNotebook is luckily pretty + // simple and self-explanatory in most cases + // m_notebook = new wxNotebook(this, wxID_NOTEBOOK); // @@ -309,8 +347,6 @@ MyFrame::MyFrame(const wxString& title) #if wxUSE_STATUSBAR // create a status bar just for fun (by default with 1 pane only) CreateStatusBar(1); - ResetStatus(); - SetStatusText(m_basestatus); #endif // wxUSE_STATUSBAR // @@ -361,9 +397,15 @@ MyFrame::MyFrame(const wxString& title) // (wxObjectEventFunction)(wxEventFunction) // (wxCommandEventFunction) &MyFrame::MyHandler // + // Or, you can use the new (2.5.5+) event handler + // conversion macros - for instance the above could + // be done as + // wxCommandEventHandler(MyFrame::MyHandler) + // pretty simple, eh? + // // The fourth is an optional userdata param - // this is of historical relevance only and is - // there only for backwards compatability. + // there only for backwards compatibility. // // The fifth is the context in which to call the // handler - by default (this param is optional) @@ -380,55 +422,44 @@ MyFrame::MyFrame(const wxString& title) // Menu events // this->Connect(wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, - (wxObjectEventFunction) (wxEventFunction) - (wxCommandEventFunction) &MyFrame::OnQuit); + wxCommandEventHandler(MyFrame::OnQuit)); this->Connect(wxID_ABOUT, wxEVT_COMMAND_MENU_SELECTED, - (wxObjectEventFunction) (wxEventFunction) - (wxCommandEventFunction) &MyFrame::OnAbout); + wxCommandEventHandler(MyFrame::OnAbout)); this->Connect(wxID_LOOP, wxEVT_COMMAND_MENU_SELECTED, - (wxObjectEventFunction) (wxEventFunction) - (wxCommandEventFunction) &MyFrame::OnLoop); + wxCommandEventHandler(MyFrame::OnLoop)); + + this->Connect(wxID_OPENFILENEWPAGE, wxEVT_COMMAND_MENU_SELECTED, + wxCommandEventHandler(MyFrame::OnOpenFileNewPage)); - this->Connect(wxID_OPENFILE, wxEVT_COMMAND_MENU_SELECTED, - (wxObjectEventFunction) (wxEventFunction) - (wxCommandEventFunction) &MyFrame::OnOpenFile); + this->Connect(wxID_OPENFILESAMEPAGE, wxEVT_COMMAND_MENU_SELECTED, + wxCommandEventHandler(MyFrame::OnOpenFileSamePage)); + + this->Connect(wxID_OPENURLNEWPAGE, wxEVT_COMMAND_MENU_SELECTED, + wxCommandEventHandler(MyFrame::OnOpenURLNewPage)); + + this->Connect(wxID_OPENURLSAMEPAGE, wxEVT_COMMAND_MENU_SELECTED, + wxCommandEventHandler(MyFrame::OnOpenURLSamePage)); + + this->Connect(wxID_CLOSECURRENTPAGE, wxEVT_COMMAND_MENU_SELECTED, + wxCommandEventHandler(MyFrame::OnCloseCurrentPage)); this->Connect(wxID_PLAY, wxEVT_COMMAND_MENU_SELECTED, - (wxObjectEventFunction) (wxEventFunction) - (wxCommandEventFunction) &MyFrame::OnPlay); + wxCommandEventHandler(MyFrame::OnPlay)); this->Connect(wxID_PAUSE, wxEVT_COMMAND_MENU_SELECTED, - (wxObjectEventFunction) (wxEventFunction) - (wxCommandEventFunction) &MyFrame::OnPause); + wxCommandEventHandler(MyFrame::OnPause)); this->Connect(wxID_STOP, wxEVT_COMMAND_MENU_SELECTED, - (wxObjectEventFunction) (wxEventFunction) - (wxCommandEventFunction) &MyFrame::OnStop); - - this->Connect(wxID_CLOSE, wxEVT_COMMAND_MENU_SELECTED, - (wxObjectEventFunction) (wxEventFunction) - (wxCommandEventFunction) &MyFrame::OnClosePage); + wxCommandEventHandler(MyFrame::OnStop)); // - // Slider events + // Notebook events // - this->Connect(wxID_SLIDER, wxEVT_COMMAND_SLIDER_UPDATED, - (wxObjectEventFunction) (wxEventFunction) - (wxCommandEventFunction) &MyFrame::OnSeek); - - // - // Media Control events - // - this->Connect(wxID_MEDIACTRL, wxEVT_MEDIA_STOP, - (wxObjectEventFunction) (wxEventFunction) - (wxMediaEventFunction) &MyFrame::OnMediaStop); - this->Connect(wxID_NOTEBOOK, wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, - (wxObjectEventFunction) (wxEventFunction) - (wxNotebookEventFunction) &MyFrame::OnPageChange); - + wxNotebookEventHandler(MyFrame::OnPageChange)); + // // End of Events // @@ -470,19 +501,39 @@ MyFrame::~MyFrame() // ---------------------------------------------------------------------------- void MyFrame::ResetStatus() { - - MEDIASTUFF + wxMediaCtrl* currentMediaCtrl = GetCurrentMediaCtrl(); m_basestatus = wxString::Format(_T("Size(x,y):%i,%i ") _T("Length(Seconds):%u Speed:%1.1fx"), - m_mediactrl->GetBestSize().x, - m_mediactrl->GetBestSize().y, - (unsigned)((m_mediactrl->Length() / 1000)), - m_mediactrl->GetPlaybackRate() + currentMediaCtrl->GetBestSize().x, + currentMediaCtrl->GetBestSize().y, + (unsigned)((currentMediaCtrl->Length() / 1000)), + currentMediaCtrl->GetPlaybackRate() ); +} - m_slider->SetRange(0, (int)(m_mediactrl->Length() / 1000)); +// ---------------------------------------------------------------------------- +// MyFrame::GetCurrentMediaCtrl +// +// Obtains the media control of the current page, or NULL if there are no +// pages open +// ---------------------------------------------------------------------------- +wxMediaCtrl* MyFrame::GetCurrentMediaCtrl() +{ + wxASSERT(m_notebook->GetCurrentPage() != NULL); + return ((MyNotebookPage*)m_notebook->GetCurrentPage())->m_mediactrl; +} +// ---------------------------------------------------------------------------- +// MyFrame::GetCurrentSlider +// +// Obtains the slider of the current page, or NULL if there are no +// pages open +// ---------------------------------------------------------------------------- +wxSlider* MyFrame::GetCurrentSlider() +{ + wxASSERT(m_notebook->GetCurrentPage() != NULL); + return ((MyNotebookPage*)m_notebook->GetCurrentPage())->m_slider; } // ---------------------------------------------------------------------------- @@ -520,33 +571,150 @@ void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) // ---------------------------------------------------------------------------- void MyFrame::OnLoop(wxCommandEvent& WXUNUSED(event)) { - MEDIASTUFF - m_mediactrl->Loop( !m_mediactrl->IsLooped() ); + if(!m_notebook->GetCurrentPage()) + { + wxMessageBox(wxT("No files are currently open!")); + return; + } + + ((MyNotebookPage*)m_notebook->GetCurrentPage())->m_bLoop = + !((MyNotebookPage*)m_notebook->GetCurrentPage())->m_bLoop; } // ---------------------------------------------------------------------------- -// MyFrame::OnOpenFile +// MyFrame::OnOpenFileSamePage // // Called from file->openfile. -// Opens and plays a media file +// Opens and plays a media file in the current notebook page +// ---------------------------------------------------------------------------- +void MyFrame::OnOpenFileSamePage(wxCommandEvent& WXUNUSED(event)) +{ + OpenFile(false); +} + +// ---------------------------------------------------------------------------- +// MyFrame::OnOpenFileNewPage +// +// Called from file->openfileinnewpage. +// Opens and plays a media file in a new notebook page +// ---------------------------------------------------------------------------- +void MyFrame::OnOpenFileNewPage(wxCommandEvent& WXUNUSED(event)) +{ + OpenFile(true); +} + +// ---------------------------------------------------------------------------- +// MyFrame::OpenFile +// +// Code to actually open the media file +// +// 1) Create file dialog and ask the user for input file +// 2) If the user didn't want anything, break out +// 3) Create a new page if the user wanted one or there isn't a current page +// 4) Load the media +// 5) Play the media +// 6) Reset the text on the status bar +// 7) Set the slider of the current page to accurately reflect media length // ---------------------------------------------------------------------------- -void MyFrame::OnOpenFile(wxCommandEvent& WXUNUSED(event)) +void MyFrame::OpenFile(bool bNewPage) { wxFileDialog fd(this); if(fd.ShowModal() == wxID_OK) { - m_notebook->AddPage(new MyNotebookPage(m_notebook), fd.GetPath(), true); - - MEDIASTUFF - - if( !m_mediactrl->Load(fd.GetPath()) ) + if(bNewPage || !m_notebook->GetCurrentPage()) + m_notebook->AddPage(new MyNotebookPage(m_notebook), fd.GetPath(), true); + else //don't forget to update notebook page title + m_notebook->SetPageText(m_notebook->GetSelection(), fd.GetPath()); + + if( !GetCurrentMediaCtrl()->Load(fd.GetPath()) ) wxMessageBox(wxT("Couldn't load file!")); - if( !m_mediactrl->Play() ) + if( !GetCurrentMediaCtrl()->Play() ) + wxMessageBox(wxT("Couldn't play movie!")); + + ResetStatus(); + + GetCurrentSlider()->SetRange(0, + (int)(GetCurrentMediaCtrl()->Length() / 1000)); + } +} + +// ---------------------------------------------------------------------------- +// MyFrame::OnOpenURLSamePage +// +// Called from file->openurl. +// Opens and plays a media file from a URL in the current notebook page +// ---------------------------------------------------------------------------- +void MyFrame::OnOpenURLSamePage(wxCommandEvent& WXUNUSED(event)) +{ + OpenURL(false); +} + +// ---------------------------------------------------------------------------- +// MyFrame::OnOpenURLNewPage +// +// Called from file->openurlinnewpage. +// Opens and plays a media file from a URL in a new notebook page +// ---------------------------------------------------------------------------- +void MyFrame::OnOpenURLNewPage(wxCommandEvent& WXUNUSED(event)) +{ + OpenURL(true); +} + +// ---------------------------------------------------------------------------- +// MyFrame::OpenURL +// +// Code to actually open the media file from a URL +// +// 1) Create text input dialog and ask the user for an input URL +// 2) If the user didn't want anything, break out +// 3) Create a new page if the user wanted one or there isn't a current page +// 4) Load the media +// 5) Play the media +// 6) Reset the text on the status bar +// 7) Set the slider of the current page to accurately reflect media length +// ---------------------------------------------------------------------------- +void MyFrame::OpenURL(bool bNewPage) +{ + wxString theURL = wxGetTextFromUser(wxT("Enter the URL that has the movie to play")); + + if(!theURL.empty()) + { + if(bNewPage || !m_notebook->GetCurrentPage()) + m_notebook->AddPage(new MyNotebookPage(m_notebook), theURL, true); + else //don't forget to update notebook page title + m_notebook->SetPageText(m_notebook->GetSelection(), theURL); + + if( !GetCurrentMediaCtrl()->Load(wxURI(theURL)) ) + wxMessageBox(wxT("Couldn't load URL!")); + + if( !GetCurrentMediaCtrl()->Play() ) wxMessageBox(wxT("Couldn't play movie!")); ResetStatus(); + + GetCurrentSlider()->SetRange(0, + (int)(GetCurrentMediaCtrl()->Length() / 1000)); + } +} + +// ---------------------------------------------------------------------------- +// MyFrame::OnCloseCurrentPage +// +// Called when the user wants to close the current notebook page +// +// 1) Get the current page number (wxControl::GetSelection) +// 2) If there is no current page, break out +// 3) Delete the current page +// ---------------------------------------------------------------------------- +void MyFrame::OnCloseCurrentPage(wxCommandEvent& WXUNUSED(event)) +{ + int sel = m_notebook->GetSelection(); + + if (sel != wxNOT_FOUND) + { + m_notebook->DeletePage(sel); } } @@ -558,8 +726,13 @@ void MyFrame::OnOpenFile(wxCommandEvent& WXUNUSED(event)) // ---------------------------------------------------------------------------- void MyFrame::OnPlay(wxCommandEvent& WXUNUSED(event)) { - MEDIASTUFF - if( !m_mediactrl->Play() ) + if(!m_notebook->GetCurrentPage()) + { + wxMessageBox(wxT("No files are currently open!")); + return; + } + + if( !GetCurrentMediaCtrl()->Play() ) wxMessageBox(wxT("Couldn't play movie!")); } @@ -571,8 +744,13 @@ void MyFrame::OnPlay(wxCommandEvent& WXUNUSED(event)) // ---------------------------------------------------------------------------- void MyFrame::OnPause(wxCommandEvent& WXUNUSED(event)) { - MEDIASTUFF - if( !m_mediactrl->Pause() ) + if(!m_notebook->GetCurrentPage()) + { + wxMessageBox(wxT("No files are currently open!")); + return; + } + + if( !GetCurrentMediaCtrl()->Pause() ) wxMessageBox(wxT("Couldn't pause movie!")); } @@ -587,49 +765,27 @@ void MyFrame::OnPause(wxCommandEvent& WXUNUSED(event)) // ---------------------------------------------------------------------------- void MyFrame::OnStop(wxCommandEvent& WXUNUSED(event)) { - MEDIASTUFF - if( !m_mediactrl->Stop() ) - wxMessageBox(wxT("Couldn't stop movie!")); -} + if(!m_notebook->GetCurrentPage()) + { + wxMessageBox(wxT("No files are currently open!")); + return; + } -// ---------------------------------------------------------------------------- -// MyFrame::OnSeek -// -// Called from file->seek. -// Called when the user moves the slider - -// seeks to a position within the media -// ---------------------------------------------------------------------------- -void MyFrame::OnSeek(wxCommandEvent& WXUNUSED(event)) -{ - MEDIASTUFF - if( m_mediactrl->Seek( m_slider->GetValue() * 1000 ) == wxInvalidOffset ) - wxMessageBox(wxT("Couldn't seek in movie!")); + if( !GetCurrentMediaCtrl()->Stop() ) + wxMessageBox(wxT("Couldn't stop movie!")); } // ---------------------------------------------------------------------------- -// MyFrame::OnMediaStop +// MyFrame::OnCloseCurrentPage // -// Called when the media is about to stop playing. +// Called when the user wants to closes the current notebook page // ---------------------------------------------------------------------------- -void MyFrame::OnMediaStop(wxMediaEvent& WXUNUSED(event)) -{ -} void MyFrame::OnPageChange(wxNotebookEvent& WXUNUSED(event)) { ResetStatus(); } -void MyFrame::OnClosePage(wxCommandEvent& WXUNUSED(event)) -{ - int sel = m_notebook->GetSelection(); - - if (sel != wxNOT_FOUND) - { - m_notebook->DeletePage(sel); - } -} - // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // MyTimer @@ -646,10 +802,9 @@ void MyFrame::OnClosePage(wxCommandEvent& WXUNUSED(event)) // ---------------------------------------------------------------------------- void MyTimer::Notify() { - - if (!m_frame->m_notebook || !m_frame->m_notebook->GetCurrentPage()) return; - wxMediaCtrl* m_mediactrl = ((MyNotebookPage*)m_frame->m_notebook->GetCurrentPage())->m_mediactrl; - wxSlider* m_slider = ((MyNotebookPage*)m_frame->m_notebook->GetCurrentPage())->m_slider; + if (!m_frame->m_notebook->GetCurrentPage()) return; + wxMediaCtrl* m_mediactrl = ((MyNotebookPage*)m_frame->m_notebook->GetCurrentPage())->m_mediactrl; + wxSlider* m_slider = ((MyNotebookPage*)m_frame->m_notebook->GetCurrentPage())->m_slider; if (!m_mediactrl) return; long lPosition = (long)( m_mediactrl->Tell() / 1000 ); @@ -657,11 +812,12 @@ void MyTimer::Notify() #if wxUSE_STATUSBAR m_frame->SetStatusText(wxString::Format( - _T("%s Pos:%u State:%s"), + _T("%s Pos:%u State:%s Loops:%i"), m_frame->m_basestatus.c_str(), (unsigned int)lPosition, - wxGetMediaStateText(m_mediactrl->GetState()) - + wxGetMediaStateText(m_mediactrl->GetState()), + ((MyNotebookPage*)m_frame->m_notebook->GetCurrentPage())->m_nLoops + ) ); #endif @@ -669,10 +825,22 @@ void MyTimer::Notify() } +// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// +// MyNotebookPage +// +// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +// ---------------------------------------------------------------------------- +// MyNotebookPage Constructor +// +// Creates a media control and slider and adds it to this panel, +// along with some sizers for positioning +// ---------------------------------------------------------------------------- + MyNotebookPage::MyNotebookPage(wxNotebook* theBook) : - wxPanel(theBook, wxID_ANY) + wxPanel(theBook, wxID_ANY), m_nLoops(0), m_bLoop(false) { - // // Create and attach the first/main sizer // @@ -683,7 +851,13 @@ MyNotebookPage::MyNotebookPage(wxNotebook* theBook) : // // Create our media control // - m_mediactrl = new wxMediaCtrl(this, wxID_MEDIACTRL); + m_mediactrl = new wxMediaCtrl(); + + // Make sure creation was successful + bool bOK = m_mediactrl->Create(this, wxID_MEDIACTRL); + wxASSERT_MSG(bOK, wxT("Could not create media control!")); + wxUnusedVar(bOK); + vertsizer->Add(m_mediactrl, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5); // @@ -709,8 +883,50 @@ MyNotebookPage::MyNotebookPage(wxNotebook* theBook) : wxBoxSizer* horzsizer = new wxBoxSizer(wxHORIZONTAL); vertsizer->Add(horzsizer, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5); + // + // Slider events + // + this->Connect(wxID_SLIDER, wxEVT_COMMAND_SLIDER_UPDATED, + wxCommandEventHandler(MyNotebookPage::OnSeek)); + + // + // Media Control events + // + this->Connect(wxID_MEDIACTRL, wxEVT_MEDIA_FINISHED, + wxMediaEventHandler(MyNotebookPage::OnMediaFinished)); +} + +// ---------------------------------------------------------------------------- +// MyNotebook::OnSeek +// +// Called from file->seek. +// Called when the user moves the slider - +// seeks to a position within the media +// ---------------------------------------------------------------------------- +void MyNotebookPage::OnSeek(wxCommandEvent& WXUNUSED(event)) +{ + if( m_mediactrl->Seek( + m_slider->GetValue() * 1000 + ) == wxInvalidOffset ) + wxMessageBox(wxT("Couldn't seek in movie!")); } +// ---------------------------------------------------------------------------- +// OnMediaFinished +// +// Called when the media stops playing. +// Here we loop it if the user wants to (has been selected from file menu) +// ---------------------------------------------------------------------------- +void MyNotebookPage::OnMediaFinished(wxMediaEvent& WXUNUSED(event)) +{ + if(m_bLoop) + { + if ( !m_mediactrl->Play() ) + wxMessageBox(wxT("Couldn't loop movie!")); + else + ++m_nLoops; + } +} // // End of MediaPlayer sample