|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
// CWMPEventDispatch.cpp : Implementation of the event dispatcher
//
#include "CWMPEventDispatch.h"
#include "CWMPHost.h"
extern HWND g_hBlackFadingWindow; extern CComPtr<IWMPPlayer> g_spWMPPlayer; extern CWMPHost* g_pFrame; extern double g_timeAtFadeStart; extern bool g_bFadeIn;
bool g_bFadeWindowTriggered = false;
bool IsFullScreen(); bool SetFullScreen( bool bWantToBeFullscreen ); bool IsVideoPlaying(); void PlayVideo( bool bPlay ); bool ShowFadeWindow( bool bShow ); void LogPlayerEvent( EventType_t e, float pos ); void LogPlayerEvent( EventType_t e );
HRESULT CWMPEventDispatch::Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR* pDispParams, VARIANT FAR* pVarResult, EXCEPINFO FAR* pExcepInfo, unsigned int FAR* puArgErr ) { if (!pDispParams) return E_POINTER;
if (pDispParams->cNamedArgs != 0) return DISP_E_NONAMEDARGS;
HRESULT hr = DISP_E_MEMBERNOTFOUND;
switch (dispIdMember) { case DISPID_WMPCOREEVENT_OPENSTATECHANGE: OpenStateChange(pDispParams->rgvarg[0].lVal /* NewState */ ); break;
case DISPID_WMPCOREEVENT_PLAYSTATECHANGE: PlayStateChange(pDispParams->rgvarg[0].lVal /* NewState */); break;
case DISPID_WMPCOREEVENT_AUDIOLANGUAGECHANGE: AudioLanguageChange(pDispParams->rgvarg[0].lVal /* LangID */); break;
case DISPID_WMPCOREEVENT_STATUSCHANGE: StatusChange(); break;
case DISPID_WMPCOREEVENT_SCRIPTCOMMAND: ScriptCommand(pDispParams->rgvarg[1].bstrVal /* scType */, pDispParams->rgvarg[0].bstrVal /* Param */ ); break;
case DISPID_WMPCOREEVENT_NEWSTREAM: NewStream(); break;
case DISPID_WMPCOREEVENT_DISCONNECT: Disconnect(pDispParams->rgvarg[0].lVal /* Result */ ); break;
case DISPID_WMPCOREEVENT_BUFFERING: Buffering(pDispParams->rgvarg[0].boolVal /* Start */); break;
case DISPID_WMPCOREEVENT_ERROR: Error(); break;
case DISPID_WMPCOREEVENT_WARNING: Warning(pDispParams->rgvarg[1].lVal /* WarningType */, pDispParams->rgvarg[0].lVal /* Param */, pDispParams->rgvarg[2].bstrVal /* Description */); break;
case DISPID_WMPCOREEVENT_ENDOFSTREAM: EndOfStream(pDispParams->rgvarg[0].lVal /* Result */ ); break;
case DISPID_WMPCOREEVENT_POSITIONCHANGE: PositionChange(pDispParams->rgvarg[1].dblVal /* oldPosition */, pDispParams->rgvarg[0].dblVal /* newPosition */); break;
case DISPID_WMPCOREEVENT_MARKERHIT: MarkerHit(pDispParams->rgvarg[0].lVal /* MarkerNum */); break;
case DISPID_WMPCOREEVENT_DURATIONUNITCHANGE: DurationUnitChange(pDispParams->rgvarg[0].lVal /* NewDurationUnit */); break;
case DISPID_WMPCOREEVENT_CDROMMEDIACHANGE: CdromMediaChange(pDispParams->rgvarg[0].lVal /* CdromNum */); break;
case DISPID_WMPCOREEVENT_PLAYLISTCHANGE: PlaylistChange(pDispParams->rgvarg[1].pdispVal /* Playlist */, (WMPPlaylistChangeEventType) pDispParams->rgvarg[0].lVal /* change */); break; case DISPID_WMPCOREEVENT_CURRENTPLAYLISTCHANGE: CurrentPlaylistChange((WMPPlaylistChangeEventType) pDispParams->rgvarg[0].lVal /* change */); break;
case DISPID_WMPCOREEVENT_CURRENTPLAYLISTITEMAVAILABLE: CurrentPlaylistItemAvailable(pDispParams->rgvarg[0].bstrVal /* bstrItemName */); break;
case DISPID_WMPCOREEVENT_MEDIACHANGE: MediaChange(pDispParams->rgvarg[0].pdispVal /* Item */); break;
case DISPID_WMPCOREEVENT_CURRENTMEDIAITEMAVAILABLE: CurrentMediaItemAvailable(pDispParams->rgvarg[0].bstrVal /* bstrItemName */); break;
case DISPID_WMPCOREEVENT_CURRENTITEMCHANGE: CurrentItemChange(pDispParams->rgvarg[0].pdispVal /* pdispMedia */); break;
case DISPID_WMPCOREEVENT_MEDIACOLLECTIONCHANGE: MediaCollectionChange(); break; case DISPID_WMPCOREEVENT_MEDIACOLLECTIONATTRIBUTESTRINGADDED: MediaCollectionAttributeStringAdded(pDispParams->rgvarg[1].bstrVal /* bstrAttribName */, pDispParams->rgvarg[0].bstrVal /* bstrAttribVal */ ); break;
case DISPID_WMPCOREEVENT_MEDIACOLLECTIONATTRIBUTESTRINGREMOVED: MediaCollectionAttributeStringRemoved(pDispParams->rgvarg[1].bstrVal /* bstrAttribName */, pDispParams->rgvarg[0].bstrVal /* bstrAttribVal */ ); break;
case DISPID_WMPCOREEVENT_MEDIACOLLECTIONATTRIBUTESTRINGCHANGED: MediaCollectionAttributeStringChanged(pDispParams->rgvarg[2].bstrVal /* bstrAttribName */, pDispParams->rgvarg[1].bstrVal /* bstrOldAttribVal */, pDispParams->rgvarg[0].bstrVal /* bstrNewAttribVal */); break;
case DISPID_WMPCOREEVENT_PLAYLISTCOLLECTIONCHANGE: PlaylistCollectionChange(); break;
case DISPID_WMPCOREEVENT_PLAYLISTCOLLECTIONPLAYLISTADDED: PlaylistCollectionPlaylistAdded(pDispParams->rgvarg[0].bstrVal /* bstrPlaylistName */ ); break;
case DISPID_WMPCOREEVENT_PLAYLISTCOLLECTIONPLAYLISTREMOVED: PlaylistCollectionPlaylistRemoved(pDispParams->rgvarg[0].bstrVal /* bstrPlaylistName */ ); break;
case DISPID_WMPCOREEVENT_PLAYLISTCOLLECTIONPLAYLISTSETASDELETED: PlaylistCollectionPlaylistSetAsDeleted(pDispParams->rgvarg[1].bstrVal /* bstrPlaylistName */, pDispParams->rgvarg[0].boolVal /* varfIsDeleted */); break;
case DISPID_WMPCOREEVENT_MODECHANGE: ModeChange(pDispParams->rgvarg[1].bstrVal /* ModeName */, pDispParams->rgvarg[0].boolVal /* NewValue */); break;
case DISPID_WMPCOREEVENT_MEDIAERROR: MediaError(pDispParams->rgvarg[0].pdispVal /* pMediaObject */); break;
case DISPID_WMPCOREEVENT_OPENPLAYLISTSWITCH: OpenPlaylistSwitch(pDispParams->rgvarg[0].pdispVal /* pItem */); break;
case DISPID_WMPCOREEVENT_DOMAINCHANGE: DomainChange(pDispParams->rgvarg[0].bstrVal /* strDomain */); break;
case DISPID_WMPOCXEVENT_SWITCHEDTOPLAYERAPPLICATION: SwitchedToPlayerApplication(); break;
case DISPID_WMPOCXEVENT_SWITCHEDTOCONTROL: SwitchedToControl(); break;
case DISPID_WMPOCXEVENT_PLAYERDOCKEDSTATECHANGE: PlayerDockedStateChange(); break;
case DISPID_WMPOCXEVENT_PLAYERRECONNECT: PlayerReconnect(); break;
case DISPID_WMPOCXEVENT_CLICK: Click(pDispParams->rgvarg[3].iVal /* nButton */, pDispParams->rgvarg[2].iVal /* nShiftState */, pDispParams->rgvarg[1].lVal /* fX */, pDispParams->rgvarg[0].lVal /* fY */); break;
case DISPID_WMPOCXEVENT_DOUBLECLICK: DoubleClick(pDispParams->rgvarg[3].iVal /* nButton */, pDispParams->rgvarg[2].iVal /* nShiftState */, pDispParams->rgvarg[1].lVal /* fX */, pDispParams->rgvarg[0].lVal /* fY */); break;
case DISPID_WMPOCXEVENT_KEYDOWN: KeyDown(pDispParams->rgvarg[1].iVal /* nKeyCode */, pDispParams->rgvarg[0].iVal /* nShiftState */); break;
case DISPID_WMPOCXEVENT_KEYPRESS: KeyPress(pDispParams->rgvarg[0].iVal /* nKeyAscii */); break;
case DISPID_WMPOCXEVENT_KEYUP: KeyUp(pDispParams->rgvarg[1].iVal /* nKeyCode */, pDispParams->rgvarg[0].iVal /* nShiftState */); break;
case DISPID_WMPOCXEVENT_MOUSEDOWN: MouseDown(pDispParams->rgvarg[3].iVal /* nButton */, pDispParams->rgvarg[2].iVal /* nShiftState */, pDispParams->rgvarg[1].lVal /* fX */, pDispParams->rgvarg[0].lVal /* fY */); break;
case DISPID_WMPOCXEVENT_MOUSEMOVE: MouseMove(pDispParams->rgvarg[3].iVal /* nButton */, pDispParams->rgvarg[2].iVal /* nShiftState */, pDispParams->rgvarg[1].lVal /* fX */, pDispParams->rgvarg[0].lVal /* fY */); break;
case DISPID_WMPOCXEVENT_MOUSEUP: MouseUp(pDispParams->rgvarg[3].iVal /* nButton */, pDispParams->rgvarg[2].iVal /* nShiftState */, pDispParams->rgvarg[1].lVal /* fX */, pDispParams->rgvarg[0].lVal /* fY */); break; }
return( hr ); }
// Sent when the control changes OpenState
void CWMPEventDispatch::OpenStateChange(long NewState) { return; }
// Sent when the control changes PlayState
void CWMPEventDispatch::PlayStateChange(long NewState) { WMPPlayState playstate; if ( g_spWMPPlayer->get_playState( &playstate ) == S_OK ) { switch ( playstate ) { case wmppsPlaying: { static bool s_first = true; if ( s_first ) { s_first = false;
LogPlayerEvent( ET_MEDIABEGIN );
SetFullScreen( true ); ShowFadeWindow( false ); } else { LogPlayerEvent( ET_PLAY ); } break; }
case wmppsPaused: LogPlayerEvent( ET_PAUSE ); break;
case wmppsStopped: LogPlayerEvent( ET_STOP ); break;
case wmppsMediaEnded: LogPlayerEvent( ET_MEDIAEND );
if ( IsFullScreen() && !g_bFadeWindowTriggered ) { g_bFadeWindowTriggered = true; ShowFadeWindow( true ); } break; } } }
// Sent when the audio language changes
void CWMPEventDispatch::AudioLanguageChange(long LangID) { return; }
// Sent when the status string changes
void CWMPEventDispatch::StatusChange() { }
// Sent when a synchronized command or URL is received
void CWMPEventDispatch::ScriptCommand(BSTR scType,BSTR Param) { return; }
// Sent when a new stream is encountered (obsolete)
void CWMPEventDispatch::NewStream() { return; }
// Sent when the control is disconnected from the server (obsolete)
void CWMPEventDispatch:: Disconnect(long Result ) { return; }
// Sent when the control begins or ends buffering
void CWMPEventDispatch:: Buffering(VARIANT_BOOL Start) { return; }
// Sent when the control has an error condition
void CWMPEventDispatch::Error() { return; }
// Sent when the control has an warning condition (obsolete)
void CWMPEventDispatch::Warning(long WarningType, long Param, BSTR Description) { return; }
// Sent when the media has reached end of stream
void CWMPEventDispatch::EndOfStream(long Result) { return; }
// Indicates that the current position of the movie has changed
void CWMPEventDispatch::PositionChange(double oldPosition,double newPosition) { LogPlayerEvent( ET_SCRUBFROM, ( float )oldPosition ); LogPlayerEvent( ET_SCRUBTO, ( float )newPosition ); }
// Sent when a marker is reached
void CWMPEventDispatch::MarkerHit(long MarkerNum ) { return; }
// Indicates that the unit used to express duration and position has changed
void CWMPEventDispatch::DurationUnitChange(long NewDurationUnit) { return; }
// Indicates that the CD ROM media has changed
void CWMPEventDispatch::CdromMediaChange(long CdromNum) { return; }
// Sent when a playlist changes
void CWMPEventDispatch::PlaylistChange(IDispatch * Playlist,WMPPlaylistChangeEventType change) { return; }
// Sent when the current playlist changes
void CWMPEventDispatch::CurrentPlaylistChange(WMPPlaylistChangeEventType change ) { return; }
// Sent when a current playlist item becomes available
void CWMPEventDispatch::CurrentPlaylistItemAvailable(BSTR bstrItemName) { return; }
// Sent when a media object changes
void CWMPEventDispatch::MediaChange(IDispatch * Item) { return; }
// Sent when a current media item becomes available
void CWMPEventDispatch::CurrentMediaItemAvailable(BSTR bstrItemName) { return; }
// Sent when the item selection on the current playlist changes
void CWMPEventDispatch::CurrentItemChange(IDispatch *pdispMedia) { return; }
// Sent when the media collection needs to be requeried
void CWMPEventDispatch::MediaCollectionChange() { return; }
// Sent when an attribute string is added in the media collection
void CWMPEventDispatch::MediaCollectionAttributeStringAdded(BSTR bstrAttribName, BSTR bstrAttribVal) { return; }
// Sent when an attribute string is removed from the media collection
void CWMPEventDispatch::MediaCollectionAttributeStringRemoved(BSTR bstrAttribName, BSTR bstrAttribVal) { return; }
// Sent when an attribute string is changed in the media collection
void CWMPEventDispatch::MediaCollectionAttributeStringChanged(BSTR bstrAttribName, BSTR bstrOldAttribVal, BSTR bstrNewAttribVal) { return; }
// Sent when playlist collection needs to be requeried
void CWMPEventDispatch::PlaylistCollectionChange() { return; }
// Sent when a playlist is added to the playlist collection
void CWMPEventDispatch::PlaylistCollectionPlaylistAdded(BSTR bstrPlaylistName) { return; }
// Sent when a playlist is removed from the playlist collection
void CWMPEventDispatch::PlaylistCollectionPlaylistRemoved(BSTR bstrPlaylistName) { return; }
// Sent when a playlist has been set or reset as deleted
void CWMPEventDispatch::PlaylistCollectionPlaylistSetAsDeleted(BSTR bstrPlaylistName, VARIANT_BOOL varfIsDeleted) { return; }
// Playlist playback mode has changed
void CWMPEventDispatch::ModeChange(BSTR ModeName, VARIANT_BOOL NewValue) { return; }
// Sent when the media object has an error condition
void CWMPEventDispatch::MediaError(IDispatch * pMediaObject) { while ( ShowCursor( TRUE ) < 0 ) ;
ShowWindow( g_hBlackFadingWindow, SW_HIDE ); if ( g_pFrame ) { g_pFrame->ShowWindow( SW_HIDE ); }
CComPtr< IWMPMedia > spWMPMedia; if ( pMediaObject ) { pMediaObject->QueryInterface( &spWMPMedia ); } if ( spWMPMedia ) { BSTR bstr; spWMPMedia->get_sourceURL( &bstr ); char str[ 1024 ]; sprintf( str, "Unable to open media: %s\n", CW2T( bstr ) ); MessageBox( NULL, str, "Media Error", MB_OK | MB_ICONERROR ); } else { MessageBox( NULL, "Media Error", "Media Error", MB_OK | MB_ICONERROR ); }
g_pFrame->PostMessage( WM_CLOSE ); }
// Current playlist switch with no open state change
void CWMPEventDispatch::OpenPlaylistSwitch(IDispatch *pItem) { return; }
// Sent when the current DVD domain changes
void CWMPEventDispatch::DomainChange(BSTR strDomain) { return; }
// Sent when display switches to player application
void CWMPEventDispatch::SwitchedToPlayerApplication() { }
// Sent when display switches to control
void CWMPEventDispatch::SwitchedToControl() { }
// Sent when the player docks or undocks
void CWMPEventDispatch::PlayerDockedStateChange() { }
// Sent when the OCX reconnects to the player
void CWMPEventDispatch::PlayerReconnect() { }
// Occurs when a user clicks the mouse
void CWMPEventDispatch::Click( short nButton, short nShiftState, long fX, long fY ) { if ( IsFullScreen() ) { SetFullScreen( false ); } }
// Occurs when a user double-clicks the mouse
void CWMPEventDispatch::DoubleClick( short nButton, short nShiftState, long fX, long fY ) { // the controls are just drawn into the main window, wheras the video has its own window
// this check allows us to only fullscreen on doubleclick within the video area
POINT pt = { fX, fY }; HWND hWnd = g_pFrame->ChildWindowFromPoint( pt ); if ( ChildWindowFromPoint( hWnd, pt ) != hWnd ) { SetFullScreen( !IsFullScreen() ); } }
// Occurs when a key is pressed
void CWMPEventDispatch::KeyDown( short nKeyCode, short nShiftState ) { #if 1
if ( !g_pFrame ) return;
BOOL rval; if ( nShiftState & 4 ) // 4 is the alt keymask
{ g_pFrame->OnSysKeyDown( WM_KEYDOWN, nKeyCode, 0, rval ); } else { g_pFrame->OnKeyDown( WM_KEYDOWN, nKeyCode, 0, rval ); } #endif
}
// Occurs when a key is pressed and released
void CWMPEventDispatch::KeyPress( short nKeyAscii ) { return; }
// Occurs when a key is released
void CWMPEventDispatch::KeyUp( short nKeyCode, short nShiftState ) { return; }
// Occurs when a mouse button is pressed
void CWMPEventDispatch::MouseDown( short nButton, short nShiftState, long fX, long fY ) { }
// Occurs when a mouse pointer is moved
void CWMPEventDispatch::MouseMove( short nButton, short nShiftState, long fX, long fY ) { return; }
// Occurs when a mouse button is released
void CWMPEventDispatch::MouseUp( short nButton, short nShiftState, long fX, long fY ) { }
|