#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)
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);
};
//===========================================================================
//---------------------------------------------------------------------------
// Usual debugging macros
//---------------------------------------------------------------------------
-#ifdef __WXDEBUG__
+#if wxDEBUG_LEVEL
#define MAX_ERROR_TEXT_LEN 160
// Get the error string for Active Movie
#endif
m_bestSize(wxDefaultSize)
{
+ m_evthandler = NULL;
}
//---------------------------------------------------------------------------
if (GetMP())
GetMP()->Release();
- m_ctrl->PopEventHandler(true);
+ if (m_evthandler)
+ {
+ m_ctrl->RemoveEventHandler(m_evthandler);
+ delete m_evthandler;
+ }
}
}
{
// 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
#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
}
//---------------------------------------------------------------------------
-// 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;
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<long>(2000*log10(dVolume + (1 - dVolume)*0.00001));
+
+ HRESULT hr = GetAM()->put_Volume(lVolume);
if(FAILED(hr))
{
wxAMLOG(hr);