From 6f8c67e71020cb3b7779b1267dda8702423e7c42 Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Sat, 21 May 2005 16:45:20 +0000 Subject: [PATCH] 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 --- include/wx/mediactrl.h | 10 ++- src/common/mediactrlcmn.cpp | 16 ++++ src/msw/mediactrl.cpp | 151 ++++++++++++++++++++++++++++++++++++ 3 files changed, 175 insertions(+), 2 deletions(-) diff --git a/include/wx/mediactrl.h b/include/wx/mediactrl.h index f8458d3d25..9646aeed81 100644 --- a/include/wx/mediactrl.h +++ b/include/wx/mediactrl.h @@ -190,6 +190,9 @@ public: double GetPlaybackRate(); //All but MCI & GStreamer bool SetPlaybackRate(double dRate); //All but MCI & GStreamer + double GetVolume(); //DirectShow only + bool SetVolume(double dVolume); //DirectShow only + protected: static wxClassInfo* NextBackend(); @@ -270,8 +273,11 @@ public: virtual wxMediaState GetState() { return wxMEDIASTATE_STOPPED; } - virtual void RESERVED1() {} - virtual void RESERVED2() {} + virtual double GetVolume() + { return 0.0; } + virtual bool SetVolume(double WXUNUSED(dVolume)) + { return false; } + virtual void RESERVED3() {} virtual void RESERVED4() {} virtual void RESERVED5() {} diff --git a/src/common/mediactrlcmn.cpp b/src/common/mediactrlcmn.cpp index c72a70ede3..aeadd68451 100644 --- a/src/common/mediactrlcmn.cpp +++ b/src/common/mediactrlcmn.cpp @@ -311,6 +311,8 @@ bool wxMediaCtrl::Load(const wxURI& location) // wxMediaCtrl::Length --> GetDuration // wxMediaCtrl::GetState // wxMediaCtrl::DoGetBestSize +// wxMediaCtrl::SetVolume +// wxMediaCtrl::GetVolume // // 1) Check to see whether the backend exists and is loading // 2) Call the backend's version of the method, returning success @@ -402,6 +404,20 @@ wxSize wxMediaCtrl::DoGetBestSize() const 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 // diff --git a/src/msw/mediactrl.cpp b/src/msw/mediactrl.cpp index ce385a136c..2144d317d1 100644 --- a/src/msw/mediactrl.cpp +++ b/src/msw/mediactrl.cpp @@ -27,6 +27,8 @@ #ifdef __BORLANDC__ #pragma hdrstop #endif +#define wxUSE_DIRECTSHOW 0 +#define wxUSE_QUICKTIME 0 //--------------------------------------------------------------------------- // Includes @@ -736,6 +738,9 @@ public: virtual double GetPlaybackRate(); virtual bool SetPlaybackRate(double); + virtual double GetVolume(); + virtual bool SetVolume(double); + void Cleanup(); bool m_bVideo; @@ -808,6 +813,9 @@ public: virtual double GetPlaybackRate(); virtual bool SetPlaybackRate(double dRate); + virtual double GetVolume(); + virtual bool SetVolume(double); + static LRESULT CALLBACK NotifyWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam); @@ -978,6 +986,8 @@ public: wxDL_METHOD_DEFINE(TimeScale, GetMovieTimeScale, (Movie m), (m), 0); wxDL_METHOD_DEFINE(long, GetMovieTime, (Movie m, void* cruft), (m,cruft), 0); 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() @@ -1022,6 +1032,8 @@ bool wxQuickTimeLibrary::Initialize() wxDL_METHOD_LOAD( m_dll, GetMovieTimeScale, bOk ); wxDL_METHOD_LOAD( m_dll, GetMovieTime, 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; @@ -1062,6 +1074,9 @@ public: virtual double GetPlaybackRate(); virtual bool SetPlaybackRate(double dRate); + virtual double GetVolume(); + virtual bool SetVolume(double); + void Cleanup(); void FinishLoad(); @@ -1287,8 +1302,13 @@ bool wxAMMediaBackend::Load(const wxString& fileName) return false; } +#if defined(_WIN32) + ::SetWindowLong(m_hNotifyWnd, GWL_WNDPROC, + (LONG)wxAMMediaBackend::NotifyWndProc); +#else ::SetWindowLongPtr(m_hNotifyWnd, GWLP_WNDPROC, (LONG_PTR)wxAMMediaBackend::NotifyWndProc); +#endif ::SetWindowLong(m_hNotifyWnd, GWL_USERDATA, (LONG) this); @@ -1389,6 +1409,33 @@ wxLongLong wxAMMediaBackend::GetPosition() 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 // @@ -1646,6 +1693,15 @@ typedef struct { DWORD dwSpeed; } 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 // @@ -1782,8 +1838,13 @@ bool wxMCIMediaBackend::Load(const wxString& fileName) return false; } +#if defined(_WIN32) ::SetWindowLong(m_hNotifyWnd, GWL_WNDPROC, (LONG)wxMCIMediaBackend::NotifyWndProc); +#else + ::SetWindowLongPtr(m_hNotifyWnd, GWLP_WNDPROC, + (LONG_PTR)wxMCIMediaBackend::NotifyWndProc); +#endif ::SetWindowLong(m_hNotifyWnd, GWL_USERDATA, (LONG) this); @@ -1934,6 +1995,48 @@ wxLongLong wxMCIMediaBackend::GetPosition() 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 // @@ -2450,6 +2553,54 @@ wxLongLong wxQTMediaBackend::GetPosition() 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 // -- 2.45.2