📄 vlccontrol2.cpp
字号:
/***************************************************************************** * vlccontrol2.cpp: ActiveX control for VLC ***************************************************************************** * Copyright (C) 2006 the VideoLAN team * * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net> * Jean-Paul Saman <jpsaman _at_ m2x _dot_ nl> * * 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 "vlccontrol2.h"#include "vlccontrol.h"#include "utils.h"#include <shlwapi.h>#include <wininet.h>#include <tchar.h>using namespace std;VLCAudio::~VLCAudio(){ if( _p_typeinfo ) _p_typeinfo->Release();};HRESULT VLCAudio::loadTypeInfo(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_IVLCAudio, &_p_typeinfo); if( FAILED(hr) ) { _p_typeinfo = NULL; } p_typelib->Release(); } } return hr;};STDMETHODIMP VLCAudio::GetTypeInfoCount(UINT* pctInfo){ if( NULL == pctInfo ) return E_INVALIDARG; if( SUCCEEDED(loadTypeInfo()) ) *pctInfo = 1; else *pctInfo = 0; return NOERROR;};STDMETHODIMP VLCAudio::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo){ if( NULL == ppTInfo ) return E_INVALIDARG; if( SUCCEEDED(loadTypeInfo()) ) { _p_typeinfo->AddRef(); *ppTInfo = _p_typeinfo; return NOERROR; } *ppTInfo = NULL; return E_NOTIMPL;};STDMETHODIMP VLCAudio::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispID){ if( SUCCEEDED(loadTypeInfo()) ) { return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID); } return E_NOTIMPL;};STDMETHODIMP VLCAudio::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr){ if( SUCCEEDED(loadTypeInfo()) ) { return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); } return E_NOTIMPL;};STDMETHODIMP VLCAudio::get_mute(VARIANT_BOOL* mute){ if( NULL == mute ) return E_POINTER; libvlc_instance_t* p_libvlc; HRESULT hr = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(hr) ) { libvlc_exception_t ex; libvlc_exception_init(&ex); *mute = libvlc_audio_get_mute(p_libvlc, &ex) ? VARIANT_TRUE : VARIANT_FALSE; if( libvlc_exception_raised(&ex) ) { _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } return NOERROR; } return hr;};STDMETHODIMP VLCAudio::put_mute(VARIANT_BOOL mute){ libvlc_instance_t* p_libvlc; HRESULT hr = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(hr) ) { libvlc_exception_t ex; libvlc_exception_init(&ex); libvlc_audio_set_mute(p_libvlc, VARIANT_FALSE != mute, &ex); if( libvlc_exception_raised(&ex) ) { _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } return NOERROR; } return hr;};STDMETHODIMP VLCAudio::get_volume(long* volume){ if( NULL == volume ) return E_POINTER; libvlc_instance_t* p_libvlc; HRESULT hr = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(hr) ) { libvlc_exception_t ex; libvlc_exception_init(&ex); *volume = libvlc_audio_get_volume(p_libvlc, &ex); if( libvlc_exception_raised(&ex) ) { _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } return NOERROR; } return hr;};STDMETHODIMP VLCAudio::put_volume(long volume){ libvlc_instance_t* p_libvlc; HRESULT hr = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(hr) ) { libvlc_exception_t ex; libvlc_exception_init(&ex); libvlc_audio_set_volume(p_libvlc, volume, &ex); if( libvlc_exception_raised(&ex) ) { _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } return NOERROR; } return hr;};STDMETHODIMP VLCAudio::get_track(long* track){ if( NULL == track ) return E_POINTER; libvlc_instance_t* p_libvlc; HRESULT hr = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(hr) ) { libvlc_exception_t ex; libvlc_exception_init(&ex); libvlc_media_player_t *p_md; p_md = libvlc_playlist_get_media_player(p_libvlc, &ex); *track = libvlc_audio_get_track(p_md, &ex); libvlc_media_player_release(p_md); if( libvlc_exception_raised(&ex) ) { _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } return NOERROR; } return hr;};STDMETHODIMP VLCAudio::put_track(long track){ libvlc_instance_t* p_libvlc; HRESULT hr = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(hr) ) { libvlc_exception_t ex; libvlc_exception_init(&ex); libvlc_media_player_t *p_md; p_md = libvlc_playlist_get_media_player(p_libvlc, &ex); libvlc_audio_set_track(p_md, track, &ex); libvlc_media_player_release(p_md); if( libvlc_exception_raised(&ex) ) { _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } return NOERROR; } return hr;};STDMETHODIMP VLCAudio::get_channel(long *channel){ if( NULL == channel ) return E_POINTER; libvlc_instance_t* p_libvlc; HRESULT hr = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(hr) ) { libvlc_exception_t ex; libvlc_exception_init(&ex); *channel = libvlc_audio_get_channel(p_libvlc, &ex); if( libvlc_exception_raised(&ex) ) { _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } return NOERROR; } return hr;};STDMETHODIMP VLCAudio::put_channel(long channel){ libvlc_instance_t* p_libvlc; HRESULT hr = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(hr) ) { libvlc_exception_t ex; libvlc_exception_init(&ex); libvlc_audio_set_channel(p_libvlc, channel, &ex); if( libvlc_exception_raised(&ex) ) { _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } return NOERROR; } return hr;};STDMETHODIMP VLCAudio::toggleMute(){ libvlc_instance_t* p_libvlc; HRESULT hr = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(hr) ) { libvlc_exception_t ex; libvlc_exception_init(&ex); libvlc_audio_toggle_mute(p_libvlc, &ex); if( libvlc_exception_raised(&ex) ) { _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } return NOERROR; } return hr;};/*******************************************************************************/VLCInput::~VLCInput(){ if( _p_typeinfo ) _p_typeinfo->Release();};HRESULT VLCInput::loadTypeInfo(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_IVLCInput, &_p_typeinfo); if( FAILED(hr) ) { _p_typeinfo = NULL; } p_typelib->Release(); } } return hr;};STDMETHODIMP VLCInput::GetTypeInfoCount(UINT* pctInfo){ if( NULL == pctInfo ) return E_INVALIDARG; if( SUCCEEDED(loadTypeInfo()) ) *pctInfo = 1; else *pctInfo = 0; return NOERROR;};STDMETHODIMP VLCInput::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo){ if( NULL == ppTInfo ) return E_INVALIDARG; if( SUCCEEDED(loadTypeInfo()) ) { _p_typeinfo->AddRef(); *ppTInfo = _p_typeinfo; return NOERROR; } *ppTInfo = NULL; return E_NOTIMPL;};STDMETHODIMP VLCInput::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispID){ if( SUCCEEDED(loadTypeInfo()) ) { return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID); } return E_NOTIMPL;};STDMETHODIMP VLCInput::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr){ if( SUCCEEDED(loadTypeInfo()) ) { return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); } return E_NOTIMPL;};STDMETHODIMP VLCInput::get_length(double* length){ if( NULL == length ) return E_POINTER; *length = 0; libvlc_instance_t* p_libvlc; HRESULT hr = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(hr) ) { 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) ) { *length = (double)libvlc_media_player_get_length(p_md, &ex); libvlc_media_player_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; } } _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } return hr;};STDMETHODIMP VLCInput::get_position(double* position){ if( NULL == position ) return E_POINTER; *position = 0.0f; libvlc_instance_t* p_libvlc; HRESULT hr = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(hr) ) { 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_IVLCInput, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } return hr;};STDMETHODIMP VLCInput::put_position(double position){ libvlc_instance_t* p_libvlc; HRESULT hr = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(hr) ) { 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_IVLCInput, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } return hr;};STDMETHODIMP VLCInput::get_time(double* time)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -