📄 vlccontrol.cpp
字号:
/***************************************************************************** * vlccontrol.cpp: ActiveX control for VLC ***************************************************************************** * Copyright (C) 2005 the VideoLAN team * * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net> * Jean-Paul Saman <jpsaman@videolan.org> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/#include "plugin.h"#include "vlccontrol.h"#include "utils.h"using namespace std;VLCControl::~VLCControl(){ if( _p_typeinfo ) _p_typeinfo->Release();};HRESULT VLCControl::getTypeInfo(void){ HRESULT hr = NOERROR; if( NULL == _p_typeinfo ) { ITypeLib *p_typelib; hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib); if( SUCCEEDED(hr) ) { hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCControl, &_p_typeinfo); if( FAILED(hr) ) { _p_typeinfo = NULL; } p_typelib->Release(); } } return hr;};STDMETHODIMP VLCControl::GetTypeInfoCount(UINT* pctInfo){ if( NULL == pctInfo ) return E_INVALIDARG; if( SUCCEEDED(getTypeInfo()) ) *pctInfo = 1; else *pctInfo = 0; return NOERROR;};STDMETHODIMP VLCControl::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo){ if( NULL == ppTInfo ) return E_INVALIDARG; if( SUCCEEDED(getTypeInfo()) ) { _p_typeinfo->AddRef(); *ppTInfo = _p_typeinfo; return NOERROR; } *ppTInfo = NULL; return E_NOTIMPL;};STDMETHODIMP VLCControl::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispID){ if( SUCCEEDED(getTypeInfo()) ) { return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID); } return E_NOTIMPL;};STDMETHODIMP VLCControl::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr){ if( SUCCEEDED(getTypeInfo()) ) { return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); } return E_NOTIMPL;};STDMETHODIMP VLCControl::get_Visible(VARIANT_BOOL *isVisible){ if( NULL == isVisible ) return E_POINTER; *isVisible = _p_instance->getVisible() ? VARIANT_TRUE : VARIANT_FALSE; return NOERROR;};STDMETHODIMP VLCControl::put_Visible(VARIANT_BOOL isVisible){ _p_instance->setVisible(isVisible != VARIANT_FALSE); return NOERROR;};STDMETHODIMP VLCControl::play(void){ libvlc_instance_t* p_libvlc; HRESULT result = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(result) ) { libvlc_exception_t ex; libvlc_exception_init(&ex); libvlc_playlist_play(p_libvlc, -1, 0, NULL, &ex); if( libvlc_exception_raised(&ex) ) { _p_instance->setErrorInfo(IID_IVLCControl, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } _p_instance->fireOnPlayEvent(); return NOERROR; } return result;};STDMETHODIMP VLCControl::pause(void){ libvlc_instance_t* p_libvlc; HRESULT result = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(result) ) { libvlc_exception_t ex; libvlc_exception_init(&ex); libvlc_playlist_pause(p_libvlc, &ex); if( libvlc_exception_raised(&ex) ) { _p_instance->setErrorInfo(IID_IVLCControl, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } _p_instance->fireOnPauseEvent(); return NOERROR; } return result;};STDMETHODIMP VLCControl::stop(void){ libvlc_instance_t* p_libvlc; HRESULT result = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(result) ) { libvlc_exception_t ex; libvlc_exception_init(&ex); libvlc_playlist_stop(p_libvlc, &ex); if( libvlc_exception_raised(&ex) ) { _p_instance->setErrorInfo(IID_IVLCControl, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } return NOERROR; } _p_instance->fireOnStopEvent(); return result;};STDMETHODIMP VLCControl::get_Playing(VARIANT_BOOL *isPlaying){ if( NULL == isPlaying ) return E_POINTER; HRESULT result = NOERROR; if( _p_instance->isRunning() ) { libvlc_instance_t *p_libvlc; result = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(result) ) { if( libvlc_playlist_isplaying(p_libvlc, NULL) ) *isPlaying = VARIANT_TRUE; else *isPlaying = VARIANT_FALSE; return NOERROR; } } *isPlaying = VARIANT_FALSE; return result;};STDMETHODIMP VLCControl::get_Position(float *position){ if( NULL == position ) return E_POINTER; *position = 0.0f; libvlc_instance_t* p_libvlc; HRESULT result = E_UNEXPECTED; result = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(result) ) { libvlc_exception_t ex; libvlc_exception_init(&ex); libvlc_media_player_t *p_md; p_md = libvlc_playlist_get_media_player(p_libvlc, &ex); if( !libvlc_exception_raised(&ex) ) { *position = libvlc_media_player_get_position(p_md, &ex); libvlc_media_player_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; } } _p_instance->setErrorInfo(IID_IVLCControl, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } return result;};STDMETHODIMP VLCControl::put_Position(float position){ HRESULT result = E_UNEXPECTED; libvlc_instance_t* p_libvlc; result = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(result) ) { libvlc_exception_t ex; libvlc_exception_init(&ex); libvlc_media_player_t *p_md; p_md = libvlc_playlist_get_media_player(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { libvlc_media_player_set_position(p_md, position, &ex); libvlc_media_player_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; } } _p_instance->setErrorInfo(IID_IVLCControl, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } return result;};STDMETHODIMP VLCControl::get_Time(int *seconds){ if( NULL == seconds ) return E_POINTER; *seconds = 0; libvlc_instance_t* p_libvlc; HRESULT result = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(result) ) { libvlc_exception_t ex; libvlc_exception_init(&ex); libvlc_media_player_t *p_md; p_md = libvlc_playlist_get_media_player(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { *seconds = libvlc_media_player_get_time(p_md, &ex); libvlc_media_player_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; } } _p_instance->setErrorInfo(IID_IVLCControl, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } return result;};STDMETHODIMP VLCControl::put_Time(int seconds){ /* setTime function of the plugin sets the time. */ _p_instance->setTime(seconds); return NOERROR;};STDMETHODIMP VLCControl::shuttle(int seconds){ libvlc_instance_t* p_libvlc; HRESULT result = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(result) ) { libvlc_exception_t ex; libvlc_exception_init(&ex); libvlc_media_player_t *p_md; p_md = libvlc_playlist_get_media_player(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { if( seconds < 0 ) seconds = 0; libvlc_media_player_set_time(p_md, (int64_t)seconds, &ex); libvlc_media_player_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; } } _p_instance->setErrorInfo(IID_IVLCControl, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } return result;};STDMETHODIMP VLCControl::fullscreen(void){ HRESULT result = E_UNEXPECTED; if( _p_instance->isRunning() ) { libvlc_instance_t *p_libvlc; result = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(result) ) { if( libvlc_playlist_isplaying(p_libvlc, NULL) ) { libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, NULL); if( p_md )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -