///////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2009 Carlo McWhirter. All Rights Reserved.
// Copyright (c) 2009 Hyteq Systems. All Rights Reserved.
//
// http://www.hyteq.com
//
// Hyteq Systems Educational License
//
// This file is part of WM3DSpectrum, also known as 3D Spectrum Analyzer for
// Windows Media Player. This file, the project that this file is part of, and
// the resulting compiled program files are intended to be used for educational
// purposes only. Use of this file or this project for any non-educational or
// non-observatory purpose is strictly prohibited without the express written
// consent of all of the copyright holders listed above.
//
// This file may only be modified and later redistributed by one or more of the
// copyright holders listed above. Suggestions for bug fixes, enhancements,
// and other modifications must be sent directly to one of the copyright holders.
//
// This file may be modified without being redistributed by any recipient of
// this file provided the modifications are NOT intentionaly or unintentionaly
// directed toward malicious or illegal purposes, but, instead, toward educational
// purposes only.
//
// THIS SOFTWARE IS PROVIDED 'AS-IS', WITHOUT ANY EXPRESS OR IMPLIED
// WARRANTY. IN NO EVENT WILL THE AUTHORS BE HELD LIABLE FOR ANY DAMAGES
// ARISING FROM THE USE OF THIS SOFTWARE.
//
// This notice may not be removed from this file or altered in any manner.
//
///////////////////////////////////////////////////////////////////////////////
#ifndef __WM3DSPECTRUM_H_
#define __WM3DSPECTRUM_H_
#include "resource.h"
#include "effects.h"
#include "WM3DSpectrum_h.h"
#include "RendererInterface.h"
#include "WindowedRenderer.h"
#include "NonWindowedRenderer.h"
#include "LinearInterpolator.h"
#include "SmoothInterpolator.h"
#include "GridRenderer.h"
/////////////////////////////////////////////////////////////////////////////
// CWM3DSpectrum
class ATL_NO_VTABLE CWM3DSpectrum :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CWM3DSpectrum, &CLSID_WM3DSpectrum>,
public IDispatchImpl<IWM3DSpectrum, &IID_IWM3DSpectrum, &LIBID_WM3DSPECTRUMLib>,
public IWMPEvents,
public IWMPEffects2
{
private:
COLORREF m_clrForeground; // foreground color
LONG m_nPreset; // current preset
HRESULT WzToColor(const WCHAR *pwszColor, COLORREF *pcrColor);
HRESULT ColorToWz( BSTR* pbstrColor, COLORREF crColor);
DWORD SwapBytes(DWORD dwRet);
public:
CWM3DSpectrum();
~CWM3DSpectrum();
DECLARE_REGISTRY_RESOURCEID(IDR_WM3DSPECTRUM)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CWM3DSpectrum)
COM_INTERFACE_ENTRY(IWM3DSpectrum)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IWMPEvents)
COM_INTERFACE_ENTRY(IWMPEffects)
COM_INTERFACE_ENTRY(IWMPEffects2)
END_COM_MAP()
public:
// CComCoClass Overrides
HRESULT FinalConstruct();
void FinalRelease();
// IWM3DSpectrum
STDMETHOD(get_foregroundColor)(/*[out, retval]*/ BSTR *pVal);
STDMETHOD(put_foregroundColor)(/*[in]*/ BSTR newVal);
// IWMPEffects
STDMETHOD(Render)(TimedLevel *pLevels, HDC hdc, RECT *rc);
STDMETHOD(MediaInfo)(LONG lChannelCount, LONG lSampleRate, BSTR bstrTitle);
STDMETHOD(GetCapabilities)(DWORD * pdwCapabilities);
STDMETHOD(GoFullscreen)(BOOL fFullScreen) { return E_NOTIMPL; };
STDMETHOD(RenderFullScreen)(TimedLevel *pLevels) { return E_NOTIMPL; };
STDMETHOD(DisplayPropertyPage)(HWND hwndOwner);
STDMETHOD(GetTitle)(BSTR *bstrTitle);
STDMETHOD(GetPresetTitle)(LONG nPreset, BSTR *bstrPresetTitle);
STDMETHOD(GetPresetCount)(LONG *pnPresetCount);
STDMETHOD(SetCurrentPreset)(LONG nPreset);
STDMETHOD(GetCurrentPreset)(LONG *pnPreset);
// IWMPEffects2
STDMETHOD(SetCore)(IWMPCore * pCore);
STDMETHOD(Create)(HWND hwndParent);
STDMETHOD(Destroy)();
STDMETHOD(NotifyNewMedia)(IWMPMedia *pMedia);
STDMETHOD(OnWindowMessage)(UINT msg, WPARAM WParam, LPARAM LParam, LRESULT *plResultParam );
STDMETHOD(RenderWindowed)(TimedLevel *pLevels, BOOL fRequiredRender );
// IWMPEvents methods
void STDMETHODCALLTYPE OpenStateChange( long NewState );
void STDMETHODCALLTYPE PlayStateChange( long NewState );
void STDMETHODCALLTYPE AudioLanguageChange( long LangID );
void STDMETHODCALLTYPE StatusChange();
void STDMETHODCALLTYPE ScriptCommand( BSTR scType, BSTR Param );
void STDMETHODCALLTYPE NewStream();
void STDMETHODCALLTYPE Disconnect( long Result );
void STDMETHODCALLTYPE Buffering( VARIANT_BOOL Start );
void STDMETHODCALLTYPE Error();
void STDMETHODCALLTYPE Warning( long WarningType, long Param, BSTR Description );
void STDMETHODCALLTYPE EndOfStream( long Result );
void STDMETHODCALLTYPE PositionChange( double oldPosition, double newPosition);
void STDMETHODCALLTYPE MarkerHit( long MarkerNum );
void STDMETHODCALLTYPE DurationUnitChange( long NewDurationUnit );
void STDMETHODCALLTYPE CdromMediaChange( long CdromNum );
void STDMETHODCALLTYPE PlaylistChange( IDispatch * Playlist, WMPPlaylistChangeEventType change );
void STDMETHODCALLTYPE CurrentPlaylistChange( WMPPlaylistChangeEventType change );
void STDMETHODCALLTYPE CurrentPlaylistItemAvailable( BSTR bstrItemName );
void STDMETHODCALLTYPE MediaChange( IDispatch * Item );
void STDMETHODCALLTYPE CurrentMediaItemAvailable( BSTR bstrItemName );
void STDMETHODCALLTYPE CurrentItemChange( IDispatch *pdispMedia);
void STDMETHODCALLTYPE MediaCollectionChange();
void STDMETHODCALLTYPE MediaCollectionAttributeStringAdded( BSTR bstrAttribName, BSTR bstrAttribVal );
void STDMETHODCALLTYPE MediaCollectionAttributeStringRemoved( BSTR bstrAttribName, BSTR bstrAttribVal );
void STDMETHODCALLTYPE MediaCollectionAttributeStringChanged( BSTR bstrAttribName, BSTR bstrOldAttribVal, BSTR bstrNewAttribVal);
void STDMETHODCALLTYPE PlaylistCollectionChange();
void STDMETHODCALLTYPE PlaylistCollectionPlaylistAdded( BSTR bstrPlaylistName);
void STDMETHODCALLTYPE PlaylistCollectionPlaylistRemoved( BSTR bstrPlaylistName);
void STDMETHODCALLTYPE PlaylistCollectionPlaylistSetAsDeleted( BSTR bstrPlaylistName, VARIANT_BOOL varfIsDeleted);
void STDMETHODCALLTYPE ModeChange( BSTR ModeName, VARIANT_BOOL NewValue);
void STDMETHODCALLTYPE MediaError( IDispatch * pMediaObject);
void STDMETHODCALLTYPE OpenPlaylistSwitch( IDispatch *pItem );
void STDMETHODCALLTYPE DomainChange( BSTR strDomain);
void STDMETHODCALLTYPE SwitchedToPlayerApplication();
void STDMETHODCALLTYPE SwitchedToControl();
void STDMETHODCALLTYPE PlayerDockedStateChange();
void STDMETHODCALLTYPE PlayerReconnect();
void STDMETHODCALLTYPE Click( short nButton, short nShiftState, long fX, long fY );
void STDMETHODCALLTYPE DoubleClick( short nButton, short nShiftState, long fX, long fY );
void STDMETHODCALLTYPE KeyDown( short nKeyCode, short nShiftState );
void STDMETHODCALLTYPE KeyPress( short nKeyAscii );
void STDMETHODCALLTYPE KeyUp( short nKeyCode, short nShiftState );
void STDMETHODCALLTYPE MouseDown( short nButton, short nShiftState, long fX, long fY );
void STDMETHODCALLTYPE MouseMove( short nButton, short nShiftState, long fX, long fY );
void STDMETHODCALLTYPE MouseUp( short nButton, short nShiftState, long fX, long fY );
TCHAR m_szPluginText[MAX_PATH];
private:
void ReleaseCore();
HWND m_hwndParent;
CComPtr<IWMPCore> m_spCore;
CComPtr<IConnectionPoint> m_spConnectionPoint;
DWORD m_dwAdviseCookie;
RENDERCONTEXT m_RenderContext;
CWindowedRenderer m_WindowedRenderer;
CNonWindowedRenderer m_NonWindowedRenderer;
CLinearInterpolator m_LinearInterpolator;
CSmoothInterpolator m_SmoothInterpolator;
std::vector<IRenderable*> m_vecWindowedRenderables;
std::vector<IRenderable*> m_vecNonWindowedRenderables;
CGridRenderer m_GridRenerer;
};
#endif //__WM3DSPECTRUM_H_