Cleanup mediaplayer sample a bit - get rid of bad loop/islooped since it has internal state
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@31955 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -110,7 +110,7 @@ public:
|
|||||||
class WXDLLIMPEXP_MEDIA wxMediaCtrl : public wxControl
|
class WXDLLIMPEXP_MEDIA wxMediaCtrl : public wxControl
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
wxMediaCtrl() : m_imp(NULL), m_bLoaded(false), m_bLoop(false)
|
wxMediaCtrl() : m_imp(NULL), m_bLoaded(false)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
wxMediaCtrl(wxWindow* parent, wxWindowID winid,
|
wxMediaCtrl(wxWindow* parent, wxWindowID winid,
|
||||||
@@ -121,7 +121,7 @@ public:
|
|||||||
const wxString& szBackend = wxEmptyString,
|
const wxString& szBackend = wxEmptyString,
|
||||||
const wxValidator& validator = wxDefaultValidator,
|
const wxValidator& validator = wxDefaultValidator,
|
||||||
const wxString& name = wxT("mediaCtrl"))
|
const wxString& name = wxT("mediaCtrl"))
|
||||||
: m_imp(NULL), m_bLoaded(false), m_bLoop(false)
|
: m_imp(NULL), m_bLoaded(false)
|
||||||
{ Create(parent, winid, fileName, pos, size, style,
|
{ Create(parent, winid, fileName, pos, size, style,
|
||||||
szBackend, validator, name); }
|
szBackend, validator, name); }
|
||||||
|
|
||||||
@@ -133,7 +133,7 @@ public:
|
|||||||
const wxString& szBackend = wxEmptyString,
|
const wxString& szBackend = wxEmptyString,
|
||||||
const wxValidator& validator = wxDefaultValidator,
|
const wxValidator& validator = wxDefaultValidator,
|
||||||
const wxString& name = wxT("mediaCtrl"))
|
const wxString& name = wxT("mediaCtrl"))
|
||||||
: m_imp(NULL), m_bLoop(false)
|
: m_imp(NULL), m_bLoaded(false)
|
||||||
{ Create(parent, winid, location, pos, size, style,
|
{ Create(parent, winid, location, pos, size, style,
|
||||||
szBackend, validator, name); }
|
szBackend, validator, name); }
|
||||||
|
|
||||||
@@ -170,20 +170,23 @@ public:
|
|||||||
bool Stop();
|
bool Stop();
|
||||||
|
|
||||||
bool Load(const wxString& fileName);
|
bool Load(const wxString& fileName);
|
||||||
bool Load(const wxURI& location); //DirectShow only
|
|
||||||
|
|
||||||
void Loop(bool bLoop = true);
|
|
||||||
bool IsLooped();
|
|
||||||
|
|
||||||
wxMediaState GetState();
|
wxMediaState GetState();
|
||||||
|
|
||||||
double GetPlaybackRate(); //All but MCI
|
|
||||||
bool SetPlaybackRate(double dRate); //All but MCI
|
|
||||||
|
|
||||||
wxFileOffset Seek(wxFileOffset where, wxSeekMode mode = wxFromStart);
|
wxFileOffset Seek(wxFileOffset where, wxSeekMode mode = wxFromStart);
|
||||||
wxFileOffset Tell(); //FIXME: This should be const
|
wxFileOffset Tell(); //FIXME: This should be const
|
||||||
wxFileOffset Length(); //FIXME: This should be const
|
wxFileOffset Length(); //FIXME: This should be const
|
||||||
|
|
||||||
|
//
|
||||||
|
// Unofficial parts of API
|
||||||
|
//
|
||||||
|
//DirectShow/GStreamer only. Quicktime too, but somewhat buggy...
|
||||||
|
bool Load(const wxURI& location);
|
||||||
|
|
||||||
|
double GetPlaybackRate(); //All but MCI & GStreamer
|
||||||
|
bool SetPlaybackRate(double dRate); //All but MCI & GStreamer
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
static wxClassInfo* NextBackend();
|
static wxClassInfo* NextBackend();
|
||||||
|
|
||||||
@@ -191,6 +194,8 @@ protected:
|
|||||||
virtual void DoMoveWindow(int x, int y, int w, int h);
|
virtual void DoMoveWindow(int x, int y, int w, int h);
|
||||||
wxSize DoGetBestSize() const;
|
wxSize DoGetBestSize() const;
|
||||||
|
|
||||||
|
//FIXME: This is nasty... find a better way to work around
|
||||||
|
//inheritance issues
|
||||||
#ifdef __WXMAC__
|
#ifdef __WXMAC__
|
||||||
friend class wxQTMediaBackend;
|
friend class wxQTMediaBackend;
|
||||||
#endif
|
#endif
|
||||||
@@ -199,7 +204,6 @@ protected:
|
|||||||
#endif
|
#endif
|
||||||
class wxMediaBackend* m_imp;
|
class wxMediaBackend* m_imp;
|
||||||
bool m_bLoaded;
|
bool m_bLoaded;
|
||||||
bool m_bLoop;
|
|
||||||
|
|
||||||
DECLARE_DYNAMIC_CLASS(wxMediaCtrl)
|
DECLARE_DYNAMIC_CLASS(wxMediaCtrl)
|
||||||
};
|
};
|
||||||
|
@@ -26,11 +26,10 @@
|
|||||||
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
// Known bugs with wxMediaCtrl:
|
// Known bugs with wxMediaCtrl:
|
||||||
//
|
//
|
||||||
// 1) Not available on Unix :\.
|
// 1) Certain backends can't play the same media file at the same time (MCI,
|
||||||
// 2) Certain backends can't play the same media file at the same time (MCI,
|
// Cocoa NSMovieView-Quicktime).
|
||||||
// Cocoa NSMovieView/Quicktime).
|
// 2) Positioning on Mac Carbon is messed up if put in a sub-control like a
|
||||||
// 3) 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.
|
||||||
// Notebook (like this sample does).
|
|
||||||
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
@@ -197,13 +196,14 @@ class MyNotebookPage : public wxPanel
|
|||||||
void OnSeek(wxCommandEvent& event);
|
void OnSeek(wxCommandEvent& event);
|
||||||
|
|
||||||
// Media event handlers
|
// Media event handlers
|
||||||
void OnMediaStop(wxMediaEvent& event);
|
void OnMediaFinished(wxMediaEvent& event);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
friend class MyFrame; //make MyFrame able to access private members
|
friend class MyFrame; //make MyFrame able to access private members
|
||||||
wxMediaCtrl* m_mediactrl; //Our media control
|
wxMediaCtrl* m_mediactrl; //Our media control
|
||||||
wxSlider* m_slider; //The slider below our media control
|
wxSlider* m_slider; //The slider below our media control
|
||||||
int m_nLoops; //Number of times media has looped
|
int m_nLoops; //Number of times media has looped
|
||||||
|
bool m_bLoop; //Whether we are looping or not
|
||||||
};
|
};
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -598,7 +598,9 @@ void MyFrame::OnLoop(wxCommandEvent& WXUNUSED(event))
|
|||||||
wxMessageBox(wxT("No files are currently open!"));
|
wxMessageBox(wxT("No files are currently open!"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
GetCurrentMediaCtrl()->Loop( !GetCurrentMediaCtrl()->IsLooped() );
|
|
||||||
|
((MyNotebookPage*)m_notebook->GetCurrentPage())->m_bLoop =
|
||||||
|
!((MyNotebookPage*)m_notebook->GetCurrentPage())->m_bLoop;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -856,7 +858,7 @@ void MyTimer::Notify()
|
|||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
MyNotebookPage::MyNotebookPage(wxNotebook* theBook) :
|
MyNotebookPage::MyNotebookPage(wxNotebook* theBook) :
|
||||||
wxPanel(theBook, wxID_ANY), m_nLoops(0)
|
wxPanel(theBook, wxID_ANY), m_nLoops(0), m_bLoop(false)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
// Create and attach the first/main sizer
|
// Create and attach the first/main sizer
|
||||||
@@ -904,9 +906,9 @@ MyNotebookPage::MyNotebookPage(wxNotebook* theBook) :
|
|||||||
//
|
//
|
||||||
// Media Control events
|
// Media Control events
|
||||||
//
|
//
|
||||||
this->Connect(wxID_MEDIACTRL, wxEVT_MEDIA_STOP,
|
this->Connect(wxID_MEDIACTRL, wxEVT_MEDIA_FINISHED,
|
||||||
(wxObjectEventFunction) (wxEventFunction)
|
(wxObjectEventFunction) (wxEventFunction)
|
||||||
(wxMediaEventFunction) &MyNotebookPage::OnMediaStop);
|
(wxMediaEventFunction) &MyNotebookPage::OnMediaFinished);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -925,14 +927,20 @@ void MyNotebookPage::OnSeek(wxCommandEvent& WXUNUSED(event))
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// MyNotebookPage::OnMediaStop
|
// OnMediaFinished
|
||||||
//
|
//
|
||||||
// Called when the media is about to stop playing.
|
// Called when the media stops playing.
|
||||||
|
// Here we loop it if the user wants to (has been selected from file menu)
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
void MyNotebookPage::OnMediaStop(wxMediaEvent& WXUNUSED(event))
|
void MyNotebookPage::OnMediaFinished(wxMediaEvent& WXUNUSED(event))
|
||||||
{
|
{
|
||||||
if(m_mediactrl->IsLooped())
|
if(m_bLoop)
|
||||||
++m_nLoops;
|
{
|
||||||
|
if ( !m_mediactrl->Play() )
|
||||||
|
wxMessageBox(wxT("Couldn't loop movie!"));
|
||||||
|
else
|
||||||
|
++m_nLoops;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@@ -214,10 +214,6 @@ bool wxMediaCtrl::DoCreate(wxClassInfo* classInfo,
|
|||||||
if( m_imp->CreateControl(this, parent, id, pos, size,
|
if( m_imp->CreateControl(this, parent, id, pos, size,
|
||||||
style, validator, name) )
|
style, validator, name) )
|
||||||
{
|
{
|
||||||
this->Connect(GetId(), wxEVT_MEDIA_FINISHED,
|
|
||||||
(wxObjectEventFunction) (wxEventFunction)
|
|
||||||
(wxMediaEventFunction)
|
|
||||||
&wxMediaCtrl::OnMediaFinished);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -415,28 +411,6 @@ void wxMediaCtrl::DoMoveWindow(int x, int y, int w, int h)
|
|||||||
m_imp->Move(x, y, w, h);
|
m_imp->Move(x, y, w, h);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxMediaCtrl::Loop(bool bLoop)
|
|
||||||
{
|
|
||||||
m_bLoop = bLoop;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool wxMediaCtrl::IsLooped()
|
|
||||||
{
|
|
||||||
return m_bLoop;
|
|
||||||
}
|
|
||||||
|
|
||||||
void wxMediaCtrl::OnMediaFinished(wxMediaEvent& WXUNUSED(evt))
|
|
||||||
{
|
|
||||||
if(m_bLoop)
|
|
||||||
{
|
|
||||||
#ifdef __WXDEBUG__
|
|
||||||
wxASSERT( Play() );
|
|
||||||
#else
|
|
||||||
Play();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//DARWIN gcc compiler badly screwed up - needs destructor impl in source
|
//DARWIN gcc compiler badly screwed up - needs destructor impl in source
|
||||||
wxMediaBackend::~wxMediaBackend()
|
wxMediaBackend::~wxMediaBackend()
|
||||||
{ }
|
{ }
|
||||||
|
Reference in New Issue
Block a user