Applied patch [ 1204548 ] Add Get and SetVolume to wxMediaCtrl and fix bug 1200182

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@34225 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2005-05-21 16:45:20 +00:00
parent 2171cac7db
commit 6f8c67e710
3 changed files with 175 additions and 2 deletions

View File

@@ -190,6 +190,9 @@ public:
double GetPlaybackRate(); //All but MCI & GStreamer double GetPlaybackRate(); //All but MCI & GStreamer
bool SetPlaybackRate(double dRate); //All but MCI & GStreamer bool SetPlaybackRate(double dRate); //All but MCI & GStreamer
double GetVolume(); //DirectShow only
bool SetVolume(double dVolume); //DirectShow only
protected: protected:
static wxClassInfo* NextBackend(); static wxClassInfo* NextBackend();
@@ -270,8 +273,11 @@ public:
virtual wxMediaState GetState() virtual wxMediaState GetState()
{ return wxMEDIASTATE_STOPPED; } { return wxMEDIASTATE_STOPPED; }
virtual void RESERVED1() {} virtual double GetVolume()
virtual void RESERVED2() {} { return 0.0; }
virtual bool SetVolume(double WXUNUSED(dVolume))
{ return false; }
virtual void RESERVED3() {} virtual void RESERVED3() {}
virtual void RESERVED4() {} virtual void RESERVED4() {}
virtual void RESERVED5() {} virtual void RESERVED5() {}

View File

@@ -311,6 +311,8 @@ bool wxMediaCtrl::Load(const wxURI& location)
// wxMediaCtrl::Length --> GetDuration // wxMediaCtrl::Length --> GetDuration
// wxMediaCtrl::GetState // wxMediaCtrl::GetState
// wxMediaCtrl::DoGetBestSize // wxMediaCtrl::DoGetBestSize
// wxMediaCtrl::SetVolume
// wxMediaCtrl::GetVolume
// //
// 1) Check to see whether the backend exists and is loading // 1) Check to see whether the backend exists and is loading
// 2) Call the backend's version of the method, returning success // 2) Call the backend's version of the method, returning success
@@ -402,6 +404,20 @@ wxSize wxMediaCtrl::DoGetBestSize() const
return wxSize(0,0); return wxSize(0,0);
} }
double wxMediaCtrl::GetVolume()
{
if(m_imp && m_bLoaded)
return m_imp->GetVolume();
return 0.0;
}
bool wxMediaCtrl::SetVolume(double dVolume)
{
if(m_imp && m_bLoaded)
return m_imp->SetVolume(dVolume);
return false;
}
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// wxMediaCtrl::DoMoveWindow // wxMediaCtrl::DoMoveWindow
// //

View File

@@ -27,6 +27,8 @@
#ifdef __BORLANDC__ #ifdef __BORLANDC__
#pragma hdrstop #pragma hdrstop
#endif #endif
#define wxUSE_DIRECTSHOW 0
#define wxUSE_QUICKTIME 0
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Includes // Includes
@@ -736,6 +738,9 @@ public:
virtual double GetPlaybackRate(); virtual double GetPlaybackRate();
virtual bool SetPlaybackRate(double); virtual bool SetPlaybackRate(double);
virtual double GetVolume();
virtual bool SetVolume(double);
void Cleanup(); void Cleanup();
bool m_bVideo; bool m_bVideo;
@@ -808,6 +813,9 @@ public:
virtual double GetPlaybackRate(); virtual double GetPlaybackRate();
virtual bool SetPlaybackRate(double dRate); virtual bool SetPlaybackRate(double dRate);
virtual double GetVolume();
virtual bool SetVolume(double);
static LRESULT CALLBACK NotifyWndProc(HWND hWnd, UINT nMsg, static LRESULT CALLBACK NotifyWndProc(HWND hWnd, UINT nMsg,
WPARAM wParam, LPARAM lParam); WPARAM wParam, LPARAM lParam);
@@ -978,6 +986,8 @@ public:
wxDL_METHOD_DEFINE(TimeScale, GetMovieTimeScale, (Movie m), (m), 0); wxDL_METHOD_DEFINE(TimeScale, GetMovieTimeScale, (Movie m), (m), 0);
wxDL_METHOD_DEFINE(long, GetMovieTime, (Movie m, void* cruft), (m,cruft), 0); wxDL_METHOD_DEFINE(long, GetMovieTime, (Movie m, void* cruft), (m,cruft), 0);
wxDL_VOIDMETHOD_DEFINE(SetMovieTime, (Movie m, TimeRecord* tr), (m,tr) ); wxDL_VOIDMETHOD_DEFINE(SetMovieTime, (Movie m, TimeRecord* tr), (m,tr) );
wxDL_METHOD_DEFINE(short, GetMovieVolume, (Movie m), (m), 0);
wxDL_VOIDMETHOD_DEFINE(SetMovieVolume, (Movie m, short sVolume), (m,sVolume) );
}; };
bool wxQuickTimeLibrary::Initialize() bool wxQuickTimeLibrary::Initialize()
@@ -1022,6 +1032,8 @@ bool wxQuickTimeLibrary::Initialize()
wxDL_METHOD_LOAD( m_dll, GetMovieTimeScale, bOk ); wxDL_METHOD_LOAD( m_dll, GetMovieTimeScale, bOk );
wxDL_METHOD_LOAD( m_dll, GetMovieTime, bOk ); wxDL_METHOD_LOAD( m_dll, GetMovieTime, bOk );
wxDL_METHOD_LOAD( m_dll, SetMovieTime, bOk ); wxDL_METHOD_LOAD( m_dll, SetMovieTime, bOk );
wxDL_METHOD_LOAD( m_dll, GetMovieVolume, bOk );
wxDL_METHOD_LOAD( m_dll, SetMovieVolume, bOk );
m_ok = true; m_ok = true;
@@ -1062,6 +1074,9 @@ public:
virtual double GetPlaybackRate(); virtual double GetPlaybackRate();
virtual bool SetPlaybackRate(double dRate); virtual bool SetPlaybackRate(double dRate);
virtual double GetVolume();
virtual bool SetVolume(double);
void Cleanup(); void Cleanup();
void FinishLoad(); void FinishLoad();
@@ -1287,8 +1302,13 @@ bool wxAMMediaBackend::Load(const wxString& fileName)
return false; return false;
} }
#if defined(_WIN32)
::SetWindowLong(m_hNotifyWnd, GWL_WNDPROC,
(LONG)wxAMMediaBackend::NotifyWndProc);
#else
::SetWindowLongPtr(m_hNotifyWnd, GWLP_WNDPROC, ::SetWindowLongPtr(m_hNotifyWnd, GWLP_WNDPROC,
(LONG_PTR)wxAMMediaBackend::NotifyWndProc); (LONG_PTR)wxAMMediaBackend::NotifyWndProc);
#endif
::SetWindowLong(m_hNotifyWnd, GWL_USERDATA, ::SetWindowLong(m_hNotifyWnd, GWL_USERDATA,
(LONG) this); (LONG) this);
@@ -1389,6 +1409,33 @@ wxLongLong wxAMMediaBackend::GetPosition()
return (outCur*1000); return (outCur*1000);
} }
//---------------------------------------------------------------------------
// wxAMMediaBackend::SetVolume
//
// Sets the volume through the IBasicAudio interface -
// value ranges from 0 (MAX volume) to -10000 (minimum volume).
// -100 per decibel.
//---------------------------------------------------------------------------
bool wxAMMediaBackend::SetVolume(double dVolume)
{
return SUCCEEDED(m_pBA->put_Volume( (long) ((dVolume-1.0) * 10000.0) ));
}
//---------------------------------------------------------------------------
// wxAMMediaBackend::GetVolume
//
// Gets the volume through the IBasicAudio interface -
// value ranges from 0 (MAX volume) to -10000 (minimum volume).
// -100 per decibel.
//---------------------------------------------------------------------------
double wxAMMediaBackend::GetVolume()
{
long lVolume;
if ( SUCCEEDED(m_pBA->get_Volume(&lVolume)) )
return (((double)(lVolume + 10000)) / 10000.0);
return 0.0;
}
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// wxAMMediaBackend::GetDuration // wxAMMediaBackend::GetDuration
// //
@@ -1646,6 +1693,15 @@ typedef struct {
DWORD dwSpeed; DWORD dwSpeed;
} MCI_DGV_SET_PARMS; } MCI_DGV_SET_PARMS;
typedef struct {
DWORD_PTR dwCallback;
DWORD dwItem;
DWORD dwValue;
DWORD dwOver;
wxChar* lpstrAlgorithm;
wxChar* lpstrQuality;
} MCI_DGV_SETAUDIO_PARMS;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// wxMCIMediaBackend Constructor // wxMCIMediaBackend Constructor
// //
@@ -1782,8 +1838,13 @@ bool wxMCIMediaBackend::Load(const wxString& fileName)
return false; return false;
} }
#if defined(_WIN32)
::SetWindowLong(m_hNotifyWnd, GWL_WNDPROC, ::SetWindowLong(m_hNotifyWnd, GWL_WNDPROC,
(LONG)wxMCIMediaBackend::NotifyWndProc); (LONG)wxMCIMediaBackend::NotifyWndProc);
#else
::SetWindowLongPtr(m_hNotifyWnd, GWLP_WNDPROC,
(LONG_PTR)wxMCIMediaBackend::NotifyWndProc);
#endif
::SetWindowLong(m_hNotifyWnd, GWL_USERDATA, ::SetWindowLong(m_hNotifyWnd, GWL_USERDATA,
(LONG) this); (LONG) this);
@@ -1934,6 +1995,48 @@ wxLongLong wxMCIMediaBackend::GetPosition()
return statusParms.dwReturn; return statusParms.dwReturn;
} }
//---------------------------------------------------------------------------
// wxMCIMediaBackend::GetVolume
//
// Gets the volume of the current media via the MCI_DGV_STATUS_VOLUME
// message. Value ranges from 0 (minimum) to 1000 (maximum volume).
//---------------------------------------------------------------------------
double wxMCIMediaBackend::GetVolume()
{
MCI_STATUS_PARMS statusParms;
statusParms.dwCallback = NULL;
statusParms.dwItem = 0x4019; //MCI_DGV_STATUS_VOLUME
if (mciSendCommand(m_hDev, MCI_STATUS, MCI_STATUS_ITEM,
(DWORD)(LPSTR)&statusParms) != 0)
return 0;
return ((double)statusParms.dwReturn) / 1000.0;
}
//---------------------------------------------------------------------------
// wxMCIMediaBackend::SetVolume
//
// Sets the volume of the current media via the MCI_DGV_SETAUDIO_VOLUME
// message. Value ranges from 0 (minimum) to 1000 (maximum volume).
//---------------------------------------------------------------------------
bool wxMCIMediaBackend::SetVolume(double dVolume)
{
MCI_DGV_SETAUDIO_PARMS audioParms;
audioParms.dwCallback = NULL;
audioParms.dwItem = 0x4002; //MCI_DGV_SETAUDIO_VOLUME
audioParms.dwValue = (DWORD) (dVolume * 1000.0);
audioParms.dwOver = 0;
audioParms.lpstrAlgorithm = NULL;
audioParms.lpstrQuality = NULL;
if (mciSendCommand(m_hDev, 0x0873, //MCI_SETAUDIO
0x00800000L | 0x01000000L, //MCI_DGV_SETAUDIO+(_ITEM | _VALUE)
(DWORD)(LPSTR)&audioParms) != 0)
return false;
return true;
}
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// wxMCIMediaBackend::GetDuration // wxMCIMediaBackend::GetDuration
// //
@@ -2450,6 +2553,54 @@ wxLongLong wxQTMediaBackend::GetPosition()
return m_lib.GetMovieTime(m_movie, NULL); return m_lib.GetMovieTime(m_movie, NULL);
} }
//---------------------------------------------------------------------------
// wxQTMediaBackend::GetVolume
//
// Gets the volume through GetMovieVolume - which returns a 16 bit short -
//
// +--------+--------+
// + (1) + (2) +
// +--------+--------+
//
// (1) first 8 bits are value before decimal
// (2) second 8 bits are value after decimal
//
// Volume ranges from -1.0 (gain but no sound), 0 (no sound and no gain) to
// 1 (full gain and sound)
//---------------------------------------------------------------------------
double wxQTMediaBackend::GetVolume()
{
short sVolume = m_lib.GetMovieVolume(m_movie);
if(sVolume & (128 << 8)) //negative - no sound
return 0.0;
return (sVolume & (127 << 8)) ? 1.0 : ((double)(sVolume & 255)) / 255.0;
}
//---------------------------------------------------------------------------
// wxQTMediaBackend::SetVolume
//
// Sets the volume through SetMovieVolume - which takes a 16 bit short -
//
// +--------+--------+
// + (1) + (2) +
// +--------+--------+
//
// (1) first 8 bits are value before decimal
// (2) second 8 bits are value after decimal
//
// Volume ranges from -1.0 (gain but no sound), 0 (no sound and no gain) to
// 1 (full gain and sound)
//---------------------------------------------------------------------------
bool wxQTMediaBackend::SetVolume(double dVolume)
{
short sVolume = (dVolume >= .9999 ? 1 << 8 :
(short) (dVolume * 255));
m_lib.SetMovieVolume(m_movie, sVolume);
return true;
}
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// wxQTMediaBackend::Move // wxQTMediaBackend::Move
// //