X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e38b61ed7b9d5c447dcde704dda94e525b0bcb97..059d234d4176165d975048eaa5436ef40af7d037:/src/msw/mediactrl_am.cpp diff --git a/src/msw/mediactrl_am.cpp b/src/msw/mediactrl_am.cpp index be49d39044..66db8cf30a 100644 --- a/src/msw/mediactrl_am.cpp +++ b/src/msw/mediactrl_am.cpp @@ -1478,11 +1478,13 @@ public: #endif wxSize m_bestSize; // Cached size -#ifdef __WXDEBUG__ // Stuff for getting useful debugging strings + // Stuff for getting useful debugging strings +#if wxDEBUG_LEVEL wxDynamicLibrary m_dllQuartz; LPAMGETERRORTEXT m_lpAMGetErrorText; wxString GetErrorString(HRESULT hrdsv); -#endif // __WXDEBUG__ +#endif // wxDEBUG_LEVEL + wxEvtHandler* m_evthandler; friend class wxAMMediaEvtHandler; DECLARE_DYNAMIC_CLASS(wxAMMediaBackend) @@ -1508,7 +1510,7 @@ private: bool m_bLoadEventSent; // Whether or not FinishLoaded was already called // prevents it being called multiple times - DECLARE_NO_COPY_CLASS(wxAMMediaEvtHandler) + wxDECLARE_NO_COPY_CLASS(wxAMMediaEvtHandler); }; //=========================================================================== @@ -1526,7 +1528,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxAMMediaBackend, wxMediaBackend) //--------------------------------------------------------------------------- // Usual debugging macros //--------------------------------------------------------------------------- -#ifdef __WXDEBUG__ +#if wxDEBUG_LEVEL #define MAX_ERROR_TEXT_LEN 160 // Get the error string for Active Movie @@ -1573,6 +1575,7 @@ wxAMMediaBackend::wxAMMediaBackend() #endif m_bestSize(wxDefaultSize) { + m_evthandler = NULL; } //--------------------------------------------------------------------------- @@ -1591,7 +1594,11 @@ wxAMMediaBackend::~wxAMMediaBackend() if (GetMP()) GetMP()->Release(); - m_ctrl->PopEventHandler(true); + if (m_evthandler) + { + m_ctrl->RemoveEventHandler(m_evthandler); + delete m_evthandler; + } } } @@ -1608,13 +1615,13 @@ bool wxAMMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent, { // First get the AMGetErrorText procedure in debug // mode for more meaningful messages -#ifdef __WXDEBUG__ - if ( m_dllQuartz.Load(_T("quartz.dll"), wxDL_VERBATIM) ) +#if wxDEBUG_LEVEL + if ( m_dllQuartz.Load(wxT("quartz.dll"), wxDL_VERBATIM) ) { m_lpAMGetErrorText = (LPAMGETERRORTEXT) m_dllQuartz.GetSymbolAorW(wxT("AMGetErrorText")); } -#endif // __WXDEBUG__ +#endif // wxDEBUG_LEVEL @@ -1683,7 +1690,8 @@ bool wxAMMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent, #endif ); // Connect for events - m_ctrl->PushEventHandler(new wxAMMediaEvtHandler(this)); + m_evthandler = new wxAMMediaEvtHandler(this); + m_ctrl->PushEventHandler(m_evthandler); // // Here we set up wx-specific stuff for the default @@ -1949,12 +1957,12 @@ wxLongLong wxAMMediaBackend::GetPosition() } //--------------------------------------------------------------------------- -// wxAMMediaBackend::GetVolume +// wxAMMediaBackend::GetVolume and SetVolume() // -// Gets the volume through the IActiveMovie interface - -// value ranges from 0 (MAX volume) to -10000 (minimum volume). -// -100 per decibel (Logorithmic in 0.01db per step). +// Notice that for the IActiveMovie interface value ranges from 0 (MAX volume) +// to -10000 (minimum volume) and the scale is logarithmic in 0.01db per step. //--------------------------------------------------------------------------- + double wxAMMediaBackend::GetVolume() { long lVolume; @@ -1965,37 +1973,20 @@ double wxAMMediaBackend::GetVolume() return 0.0; } - // Volume conversion from Greg Hazel - double dVolume = (double)lVolume / 125; + double dVolume = lVolume / 2000.; // volume is now in [-5..0] range + dVolume = pow(10.0, dVolume); // [10^-5, 1] + dVolume -= 0.00001; // [0, 1-10^-5] + dVolume /= 1 - 0.00001; // [0, 1] - // convert to 0 to 1 - dVolume = pow(10.0, dVolume/20.0); - // handle -INF - dVolume *= 1 + pow(10.0, -5.0); - dVolume -= pow(10.0, -5.0); return dVolume; } -//--------------------------------------------------------------------------- -// wxAMMediaBackend::SetVolume -// -// Sets the volume through the IActiveMovie interface - -// value ranges from 0 (MAX volume) to -10000 (minimum volume). -// -100 per decibel (Logorithmic in 0.01db per step). -//--------------------------------------------------------------------------- bool wxAMMediaBackend::SetVolume(double dVolume) { - // Volume conversion from Greg Hazel - long lVolume; - // handle -INF - dVolume *= 1 - pow(10.0, -5.0); - dVolume += pow(10.0, -5.0); - // convert to -100db to 0db - dVolume = 20 * log10(dVolume); - // scale to -10000 to 0 - lVolume = (long)(125 * dVolume); - - HRESULT hr = GetAM()->put_Volume( lVolume ); + // inverse the transformation above + long lVolume = static_cast(2000*log10(dVolume + (1 - dVolume)*0.00001)); + + HRESULT hr = GetAM()->put_Volume(lVolume); if(FAILED(hr)) { wxAMLOG(hr);