1 /*****************************************************************************
2 * vlccontrol2.cpp: ActiveX control for VLC
3 *****************************************************************************
4 * Copyright (C) 2006 the VideoLAN team
6 * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>
7 * Jean-Paul Saman <jpsaman _at_ m2x _dot_ nl>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22 *****************************************************************************/
25 #include "vlccontrol2.h"
26 #include "vlccontrol.h"
40 _p_typeinfo->Release();
43 HRESULT VLCAudio::loadTypeInfo(void)
46 if( NULL == _p_typeinfo )
50 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
53 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCAudio, &_p_typeinfo);
64 STDMETHODIMP VLCAudio::GetTypeInfoCount(UINT* pctInfo)
69 if( SUCCEEDED(loadTypeInfo()) )
77 STDMETHODIMP VLCAudio::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
82 if( SUCCEEDED(loadTypeInfo()) )
84 _p_typeinfo->AddRef();
85 *ppTInfo = _p_typeinfo;
92 STDMETHODIMP VLCAudio::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
93 UINT cNames, LCID lcid, DISPID* rgDispID)
95 if( SUCCEEDED(loadTypeInfo()) )
97 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
102 STDMETHODIMP VLCAudio::Invoke(DISPID dispIdMember, REFIID riid,
103 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
104 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
106 if( SUCCEEDED(loadTypeInfo()) )
108 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
109 pVarResult, pExcepInfo, puArgErr);
114 STDMETHODIMP VLCAudio::get_mute(VARIANT_BOOL* mute)
119 libvlc_instance_t* p_libvlc;
120 HRESULT hr = _p_instance->getVLC(&p_libvlc);
123 libvlc_exception_t ex;
124 libvlc_exception_init(&ex);
126 *mute = libvlc_audio_get_mute(p_libvlc, &ex) ?
127 VARIANT_TRUE : VARIANT_FALSE;
128 if( libvlc_exception_raised(&ex) )
130 _p_instance->setErrorInfo(IID_IVLCAudio,
131 libvlc_exception_get_message(&ex));
132 libvlc_exception_clear(&ex);
140 STDMETHODIMP VLCAudio::put_mute(VARIANT_BOOL mute)
142 libvlc_instance_t* p_libvlc;
143 HRESULT hr = _p_instance->getVLC(&p_libvlc);
146 libvlc_exception_t ex;
147 libvlc_exception_init(&ex);
149 libvlc_audio_set_mute(p_libvlc, VARIANT_FALSE != mute, &ex);
150 if( libvlc_exception_raised(&ex) )
152 _p_instance->setErrorInfo(IID_IVLCAudio,
153 libvlc_exception_get_message(&ex));
154 libvlc_exception_clear(&ex);
162 STDMETHODIMP VLCAudio::get_volume(long* volume)
167 libvlc_instance_t* p_libvlc;
168 HRESULT hr = _p_instance->getVLC(&p_libvlc);
171 libvlc_exception_t ex;
172 libvlc_exception_init(&ex);
174 *volume = libvlc_audio_get_volume(p_libvlc, &ex);
175 if( libvlc_exception_raised(&ex) )
177 _p_instance->setErrorInfo(IID_IVLCAudio,
178 libvlc_exception_get_message(&ex));
179 libvlc_exception_clear(&ex);
187 STDMETHODIMP VLCAudio::put_volume(long volume)
189 libvlc_instance_t* p_libvlc;
190 HRESULT hr = _p_instance->getVLC(&p_libvlc);
193 libvlc_exception_t ex;
194 libvlc_exception_init(&ex);
196 libvlc_audio_set_volume(p_libvlc, volume, &ex);
197 if( libvlc_exception_raised(&ex) )
199 _p_instance->setErrorInfo(IID_IVLCAudio,
200 libvlc_exception_get_message(&ex));
201 libvlc_exception_clear(&ex);
209 STDMETHODIMP VLCAudio::get_track(long* track)
214 libvlc_instance_t* p_libvlc;
215 HRESULT hr = _p_instance->getVLC(&p_libvlc);
218 libvlc_exception_t ex;
219 libvlc_exception_init(&ex);
221 libvlc_media_player_t *p_md;
222 p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
223 *track = libvlc_audio_get_track(p_md, &ex);
224 libvlc_media_player_release(p_md);
225 if( libvlc_exception_raised(&ex) )
227 _p_instance->setErrorInfo(IID_IVLCAudio,
228 libvlc_exception_get_message(&ex));
229 libvlc_exception_clear(&ex);
237 STDMETHODIMP VLCAudio::put_track(long track)
239 libvlc_instance_t* p_libvlc;
240 HRESULT hr = _p_instance->getVLC(&p_libvlc);
243 libvlc_exception_t ex;
244 libvlc_exception_init(&ex);
246 libvlc_media_player_t *p_md;
247 p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
248 libvlc_audio_set_track(p_md, track, &ex);
249 libvlc_media_player_release(p_md);
250 if( libvlc_exception_raised(&ex) )
252 _p_instance->setErrorInfo(IID_IVLCAudio,
253 libvlc_exception_get_message(&ex));
254 libvlc_exception_clear(&ex);
262 STDMETHODIMP VLCAudio::get_channel(long *channel)
264 if( NULL == channel )
267 libvlc_instance_t* p_libvlc;
268 HRESULT hr = _p_instance->getVLC(&p_libvlc);
271 libvlc_exception_t ex;
272 libvlc_exception_init(&ex);
274 *channel = libvlc_audio_get_channel(p_libvlc, &ex);
275 if( libvlc_exception_raised(&ex) )
277 _p_instance->setErrorInfo(IID_IVLCAudio,
278 libvlc_exception_get_message(&ex));
279 libvlc_exception_clear(&ex);
287 STDMETHODIMP VLCAudio::put_channel(long channel)
289 libvlc_instance_t* p_libvlc;
290 HRESULT hr = _p_instance->getVLC(&p_libvlc);
293 libvlc_exception_t ex;
294 libvlc_exception_init(&ex);
296 libvlc_audio_set_channel(p_libvlc, channel, &ex);
297 if( libvlc_exception_raised(&ex) )
299 _p_instance->setErrorInfo(IID_IVLCAudio,
300 libvlc_exception_get_message(&ex));
301 libvlc_exception_clear(&ex);
309 STDMETHODIMP VLCAudio::toggleMute()
311 libvlc_instance_t* p_libvlc;
312 HRESULT hr = _p_instance->getVLC(&p_libvlc);
315 libvlc_exception_t ex;
316 libvlc_exception_init(&ex);
318 libvlc_audio_toggle_mute(p_libvlc, &ex);
319 if( libvlc_exception_raised(&ex) )
321 _p_instance->setErrorInfo(IID_IVLCAudio,
322 libvlc_exception_get_message(&ex));
323 libvlc_exception_clear(&ex);
331 /*******************************************************************************/
333 VLCInput::~VLCInput()
336 _p_typeinfo->Release();
339 HRESULT VLCInput::loadTypeInfo(void)
341 HRESULT hr = NOERROR;
342 if( NULL == _p_typeinfo )
346 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
349 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCInput, &_p_typeinfo);
354 p_typelib->Release();
360 STDMETHODIMP VLCInput::GetTypeInfoCount(UINT* pctInfo)
362 if( NULL == pctInfo )
365 if( SUCCEEDED(loadTypeInfo()) )
373 STDMETHODIMP VLCInput::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
375 if( NULL == ppTInfo )
378 if( SUCCEEDED(loadTypeInfo()) )
380 _p_typeinfo->AddRef();
381 *ppTInfo = _p_typeinfo;
388 STDMETHODIMP VLCInput::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
389 UINT cNames, LCID lcid, DISPID* rgDispID)
391 if( SUCCEEDED(loadTypeInfo()) )
393 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
398 STDMETHODIMP VLCInput::Invoke(DISPID dispIdMember, REFIID riid,
399 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
400 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
402 if( SUCCEEDED(loadTypeInfo()) )
404 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
405 pVarResult, pExcepInfo, puArgErr);
410 STDMETHODIMP VLCInput::get_length(double* length)
416 libvlc_instance_t* p_libvlc;
417 HRESULT hr = _p_instance->getVLC(&p_libvlc);
420 libvlc_exception_t ex;
421 libvlc_exception_init(&ex);
423 libvlc_media_player_t *p_md;
424 p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
425 if( ! libvlc_exception_raised(&ex) )
427 *length = (double)libvlc_media_player_get_length(p_md, &ex);
428 libvlc_media_player_release(p_md);
429 if( ! libvlc_exception_raised(&ex) )
434 _p_instance->setErrorInfo(IID_IVLCInput,
435 libvlc_exception_get_message(&ex));
436 libvlc_exception_clear(&ex);
442 STDMETHODIMP VLCInput::get_position(double* position)
444 if( NULL == position )
448 libvlc_instance_t* p_libvlc;
449 HRESULT hr = _p_instance->getVLC(&p_libvlc);
452 libvlc_exception_t ex;
453 libvlc_exception_init(&ex);
455 libvlc_media_player_t *p_md;
456 p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
457 if( ! libvlc_exception_raised(&ex) )
459 *position = libvlc_media_player_get_position(p_md, &ex);
460 libvlc_media_player_release(p_md);
461 if( ! libvlc_exception_raised(&ex) )
466 _p_instance->setErrorInfo(IID_IVLCInput,
467 libvlc_exception_get_message(&ex));
468 libvlc_exception_clear(&ex);
474 STDMETHODIMP VLCInput::put_position(double position)
476 libvlc_instance_t* p_libvlc;
477 HRESULT hr = _p_instance->getVLC(&p_libvlc);
480 libvlc_exception_t ex;
481 libvlc_exception_init(&ex);
483 libvlc_media_player_t *p_md;
484 p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
485 if( ! libvlc_exception_raised(&ex) )
487 libvlc_media_player_set_position(p_md, position, &ex);
488 libvlc_media_player_release(p_md);
489 if( ! libvlc_exception_raised(&ex) )
494 _p_instance->setErrorInfo(IID_IVLCInput,
495 libvlc_exception_get_message(&ex));
496 libvlc_exception_clear(&ex);
502 STDMETHODIMP VLCInput::get_time(double* time)
507 libvlc_instance_t* p_libvlc;
508 HRESULT hr = _p_instance->getVLC(&p_libvlc);
511 libvlc_exception_t ex;
512 libvlc_exception_init(&ex);
514 libvlc_media_player_t *p_md;
515 p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
516 if( ! libvlc_exception_raised(&ex) )
518 *time = (double)libvlc_media_player_get_time(p_md, &ex);
519 libvlc_media_player_release(p_md);
520 if( ! libvlc_exception_raised(&ex) )
525 _p_instance->setErrorInfo(IID_IVLCInput,
526 libvlc_exception_get_message(&ex));
527 libvlc_exception_clear(&ex);
533 STDMETHODIMP VLCInput::put_time(double time)
535 libvlc_instance_t* p_libvlc;
536 HRESULT hr = _p_instance->getVLC(&p_libvlc);
539 libvlc_exception_t ex;
540 libvlc_exception_init(&ex);
542 libvlc_media_player_t *p_md;
543 p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
544 if( ! libvlc_exception_raised(&ex) )
546 libvlc_media_player_set_time(p_md, (int64_t)time, &ex);
547 libvlc_media_player_release(p_md);
548 if( ! libvlc_exception_raised(&ex) )
553 _p_instance->setErrorInfo(IID_IVLCInput,
554 libvlc_exception_get_message(&ex));
555 libvlc_exception_clear(&ex);
561 STDMETHODIMP VLCInput::get_state(long* state)
566 libvlc_instance_t* p_libvlc;
567 HRESULT hr = _p_instance->getVLC(&p_libvlc);
570 libvlc_exception_t ex;
571 libvlc_exception_init(&ex);
573 libvlc_media_player_t *p_md;
574 p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
575 if( ! libvlc_exception_raised(&ex) )
577 *state = libvlc_media_player_get_state(p_md, &ex);
578 libvlc_media_player_release(p_md);
579 if( ! libvlc_exception_raised(&ex) )
584 libvlc_exception_clear(&ex);
585 // don't fail, just return the idle state
592 STDMETHODIMP VLCInput::get_rate(double* rate)
597 libvlc_instance_t* p_libvlc;
598 HRESULT hr = _p_instance->getVLC(&p_libvlc);
601 libvlc_exception_t ex;
602 libvlc_exception_init(&ex);
604 libvlc_media_player_t *p_md;
605 p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
606 if( ! libvlc_exception_raised(&ex) )
608 *rate = libvlc_media_player_get_rate(p_md, &ex);
609 libvlc_media_player_release(p_md);
610 if( ! libvlc_exception_raised(&ex) )
615 _p_instance->setErrorInfo(IID_IVLCInput,
616 libvlc_exception_get_message(&ex));
617 libvlc_exception_clear(&ex);
623 STDMETHODIMP VLCInput::put_rate(double rate)
625 libvlc_instance_t* p_libvlc;
626 HRESULT hr = _p_instance->getVLC(&p_libvlc);
629 libvlc_exception_t ex;
630 libvlc_exception_init(&ex);
632 libvlc_media_player_t *p_md;
633 p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
634 if( ! libvlc_exception_raised(&ex) )
636 libvlc_media_player_set_rate(p_md, rate, &ex);
637 libvlc_media_player_release(p_md);
638 if( ! libvlc_exception_raised(&ex) )
643 _p_instance->setErrorInfo(IID_IVLCInput,
644 libvlc_exception_get_message(&ex));
645 libvlc_exception_clear(&ex);
651 STDMETHODIMP VLCInput::get_fps(double* fps)
657 libvlc_instance_t* p_libvlc;
658 HRESULT hr = _p_instance->getVLC(&p_libvlc);
661 libvlc_exception_t ex;
662 libvlc_exception_init(&ex);
664 libvlc_media_player_t *p_md;
665 p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
666 if( ! libvlc_exception_raised(&ex) )
668 *fps = libvlc_media_player_get_fps(p_md, &ex);
669 libvlc_media_player_release(p_md);
670 if( ! libvlc_exception_raised(&ex) )
675 _p_instance->setErrorInfo(IID_IVLCInput,
676 libvlc_exception_get_message(&ex));
677 libvlc_exception_clear(&ex);
683 STDMETHODIMP VLCInput::get_hasVout(VARIANT_BOOL* hasVout)
685 if( NULL == hasVout )
688 libvlc_instance_t* p_libvlc;
689 HRESULT hr = _p_instance->getVLC(&p_libvlc);
692 libvlc_exception_t ex;
693 libvlc_exception_init(&ex);
695 libvlc_media_player_t *p_md;
696 p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
697 if( ! libvlc_exception_raised(&ex) )
699 *hasVout = libvlc_media_player_has_vout(p_md, &ex) ?
700 VARIANT_TRUE : VARIANT_FALSE;
701 libvlc_media_player_release(p_md);
702 if( ! libvlc_exception_raised(&ex) )
707 _p_instance->setErrorInfo(IID_IVLCInput,
708 libvlc_exception_get_message(&ex));
709 libvlc_exception_clear(&ex);
715 /*******************************************************************************/
719 delete _p_vlcmessages;
721 libvlc_log_close(_p_log, NULL);
724 _p_typeinfo->Release();
727 HRESULT VLCLog::loadTypeInfo(void)
729 HRESULT hr = NOERROR;
730 if( NULL == _p_typeinfo )
734 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
737 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCLog, &_p_typeinfo);
742 p_typelib->Release();
748 STDMETHODIMP VLCLog::GetTypeInfoCount(UINT* pctInfo)
750 if( NULL == pctInfo )
753 if( SUCCEEDED(loadTypeInfo()) )
761 STDMETHODIMP VLCLog::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
763 if( NULL == ppTInfo )
766 if( SUCCEEDED(loadTypeInfo()) )
768 _p_typeinfo->AddRef();
769 *ppTInfo = _p_typeinfo;
776 STDMETHODIMP VLCLog::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
777 UINT cNames, LCID lcid, DISPID* rgDispID)
779 if( SUCCEEDED(loadTypeInfo()) )
781 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
786 STDMETHODIMP VLCLog::Invoke(DISPID dispIdMember, REFIID riid,
787 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
788 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
790 if( SUCCEEDED(loadTypeInfo()) )
792 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
793 pVarResult, pExcepInfo, puArgErr);
798 STDMETHODIMP VLCLog::get_messages(IVLCMessages** obj)
803 *obj = _p_vlcmessages;
804 if( NULL != _p_vlcmessages )
806 _p_vlcmessages->AddRef();
809 return E_OUTOFMEMORY;
812 STDMETHODIMP VLCLog::get_verbosity(long* level)
819 libvlc_instance_t* p_libvlc;
820 HRESULT hr = _p_instance->getVLC(&p_libvlc);
823 libvlc_exception_t ex;
824 libvlc_exception_init(&ex);
826 *level = libvlc_get_log_verbosity(p_libvlc, &ex);
827 if( libvlc_exception_raised(&ex) )
829 _p_instance->setErrorInfo(IID_IVLCLog,
830 libvlc_exception_get_message(&ex));
831 libvlc_exception_clear(&ex);
839 /* log is not enabled, return -1 */
845 STDMETHODIMP VLCLog::put_verbosity(long verbosity)
847 libvlc_exception_t ex;
848 libvlc_exception_init(&ex);
850 libvlc_instance_t* p_libvlc;
851 HRESULT hr = _p_instance->getVLC(&p_libvlc);
858 _p_log = libvlc_log_open(p_libvlc, &ex);
859 if( libvlc_exception_raised(&ex) )
861 _p_instance->setErrorInfo(IID_IVLCLog,
862 libvlc_exception_get_message(&ex));
863 libvlc_exception_clear(&ex);
867 libvlc_set_log_verbosity(p_libvlc, (unsigned)verbosity, &ex);
868 if( libvlc_exception_raised(&ex) )
870 _p_instance->setErrorInfo(IID_IVLCLog,
871 libvlc_exception_get_message(&ex));
872 libvlc_exception_clear(&ex);
878 /* close log when verbosity is set to -1 */
879 libvlc_log_close(_p_log, &ex);
881 if( libvlc_exception_raised(&ex) )
883 _p_instance->setErrorInfo(IID_IVLCLog,
884 libvlc_exception_get_message(&ex));
885 libvlc_exception_clear(&ex);
893 /*******************************************************************************/
895 /* STL forward iterator used by VLCEnumIterator class to implement IEnumVARIANT */
897 class VLCMessageSTLIterator
902 VLCMessageSTLIterator(IVLCMessageIterator* iter) : iter(iter), msg(NULL)
908 VLCMessageSTLIterator(const VLCMessageSTLIterator& other)
918 virtual ~VLCMessageSTLIterator()
927 // we only need prefix ++ operator
928 VLCMessageSTLIterator& operator++()
930 VARIANT_BOOL hasNext = VARIANT_FALSE;
933 iter->get_hasNext(&hasNext);
940 if( VARIANT_TRUE == hasNext ) {
947 VARIANT operator*() const
953 if( SUCCEEDED(msg->QueryInterface(IID_IDispatch,
954 (LPVOID*)&V_DISPATCH(&v))) )
956 V_VT(&v) = VT_DISPATCH;
962 bool operator==(const VLCMessageSTLIterator& other) const
964 return msg == other.msg;
967 bool operator!=(const VLCMessageSTLIterator& other) const
969 return msg != other.msg;
973 IVLCMessageIterator* iter;
977 ////////////////////////////////////////////////////////////////////////////////////////////////////////////
979 VLCMessages::~VLCMessages()
982 _p_typeinfo->Release();
985 HRESULT VLCMessages::loadTypeInfo(void)
987 HRESULT hr = NOERROR;
988 if( NULL == _p_typeinfo )
992 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
995 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessages, &_p_typeinfo);
1000 p_typelib->Release();
1006 STDMETHODIMP VLCMessages::GetTypeInfoCount(UINT* pctInfo)
1008 if( NULL == pctInfo )
1009 return E_INVALIDARG;
1011 if( SUCCEEDED(loadTypeInfo()) )
1019 STDMETHODIMP VLCMessages::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1021 if( NULL == ppTInfo )
1022 return E_INVALIDARG;
1024 if( SUCCEEDED(loadTypeInfo()) )
1026 _p_typeinfo->AddRef();
1027 *ppTInfo = _p_typeinfo;
1034 STDMETHODIMP VLCMessages::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1035 UINT cNames, LCID lcid, DISPID* rgDispID)
1037 if( SUCCEEDED(loadTypeInfo()) )
1039 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1044 STDMETHODIMP VLCMessages::Invoke(DISPID dispIdMember, REFIID riid,
1045 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1046 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1048 if( SUCCEEDED(loadTypeInfo()) )
1050 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1051 pVarResult, pExcepInfo, puArgErr);
1056 STDMETHODIMP VLCMessages::get__NewEnum(LPUNKNOWN* _NewEnum)
1058 if( NULL == _NewEnum )
1061 IVLCMessageIterator* iter = NULL;
1064 *_NewEnum= new VLCEnumIterator<IID_IEnumVARIANT,
1067 VLCMessageSTLIterator>
1068 (VLCMessageSTLIterator(iter), VLCMessageSTLIterator(NULL));
1070 return *_NewEnum ? S_OK : E_OUTOFMEMORY;
1073 STDMETHODIMP VLCMessages::clear()
1075 libvlc_log_t *p_log = _p_vlclog->_p_log;
1078 libvlc_exception_t ex;
1079 libvlc_exception_init(&ex);
1081 libvlc_log_clear(p_log, &ex);
1082 if( libvlc_exception_raised(&ex) )
1084 _p_instance->setErrorInfo(IID_IVLCMessages,
1085 libvlc_exception_get_message(&ex));
1086 libvlc_exception_clear(&ex);
1093 STDMETHODIMP VLCMessages::get_count(long* count)
1098 libvlc_log_t *p_log = _p_vlclog->_p_log;
1101 libvlc_exception_t ex;
1102 libvlc_exception_init(&ex);
1104 *count = libvlc_log_count(p_log, &ex);
1105 if( libvlc_exception_raised(&ex) )
1107 _p_instance->setErrorInfo(IID_IVLCMessages,
1108 libvlc_exception_get_message(&ex));
1109 libvlc_exception_clear(&ex);
1118 STDMETHODIMP VLCMessages::iterator(IVLCMessageIterator** iter)
1123 *iter = new VLCMessageIterator(_p_instance, _p_vlclog);
1125 return *iter ? S_OK : E_OUTOFMEMORY;
1128 /*******************************************************************************/
1130 VLCMessageIterator::VLCMessageIterator(VLCPlugin *p_instance, VLCLog* p_vlclog ) :
1131 _p_instance(p_instance),
1136 if( p_vlclog->_p_log )
1138 _p_iter = libvlc_log_get_iterator(p_vlclog->_p_log, NULL);
1144 VLCMessageIterator::~VLCMessageIterator()
1147 libvlc_log_iterator_free(_p_iter, NULL);
1150 _p_typeinfo->Release();
1153 HRESULT VLCMessageIterator::loadTypeInfo(void)
1155 HRESULT hr = NOERROR;
1156 if( NULL == _p_typeinfo )
1158 ITypeLib *p_typelib;
1160 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1163 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessageIterator, &_p_typeinfo);
1168 p_typelib->Release();
1174 STDMETHODIMP VLCMessageIterator::GetTypeInfoCount(UINT* pctInfo)
1176 if( NULL == pctInfo )
1177 return E_INVALIDARG;
1179 if( SUCCEEDED(loadTypeInfo()) )
1187 STDMETHODIMP VLCMessageIterator::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1189 if( NULL == ppTInfo )
1190 return E_INVALIDARG;
1192 if( SUCCEEDED(loadTypeInfo()) )
1194 _p_typeinfo->AddRef();
1195 *ppTInfo = _p_typeinfo;
1202 STDMETHODIMP VLCMessageIterator::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1203 UINT cNames, LCID lcid, DISPID* rgDispID)
1205 if( SUCCEEDED(loadTypeInfo()) )
1207 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1212 STDMETHODIMP VLCMessageIterator::Invoke(DISPID dispIdMember, REFIID riid,
1213 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1214 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1216 if( SUCCEEDED(loadTypeInfo()) )
1218 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1219 pVarResult, pExcepInfo, puArgErr);
1224 STDMETHODIMP VLCMessageIterator::get_hasNext(VARIANT_BOOL* hasNext)
1226 if( NULL == hasNext )
1229 if( _p_iter && _p_vlclog->_p_log )
1231 libvlc_exception_t ex;
1232 libvlc_exception_init(&ex);
1234 *hasNext = libvlc_log_iterator_has_next(_p_iter, &ex) ?
1235 VARIANT_TRUE : VARIANT_FALSE;
1236 if( libvlc_exception_raised(&ex) )
1238 _p_instance->setErrorInfo(IID_IVLCMessageIterator,
1239 libvlc_exception_get_message(&ex));
1240 libvlc_exception_clear(&ex);
1246 *hasNext = VARIANT_FALSE;
1251 STDMETHODIMP VLCMessageIterator::next(IVLCMessage** message)
1253 if( NULL == message )
1256 if( _p_iter && _p_vlclog->_p_log )
1258 struct libvlc_log_message_t buffer;
1260 buffer.sizeof_msg = sizeof(buffer);
1262 libvlc_exception_t ex;
1263 libvlc_exception_init(&ex);
1265 libvlc_log_iterator_next(_p_iter, &buffer, &ex);
1266 if( libvlc_exception_raised(&ex) )
1268 _p_instance->setErrorInfo(IID_IVLCMessageIterator,
1269 libvlc_exception_get_message(&ex));
1270 libvlc_exception_clear(&ex);
1273 *message = new VLCMessage(_p_instance, buffer);
1274 return *message ? NOERROR : E_OUTOFMEMORY;
1279 /*******************************************************************************/
1281 VLCMessage::~VLCMessage()
1284 _p_typeinfo->Release();
1287 HRESULT VLCMessage::loadTypeInfo(void)
1289 HRESULT hr = NOERROR;
1290 if( NULL == _p_typeinfo )
1292 ITypeLib *p_typelib;
1294 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1297 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessage, &_p_typeinfo);
1302 p_typelib->Release();
1308 STDMETHODIMP VLCMessage::GetTypeInfoCount(UINT* pctInfo)
1310 if( NULL == pctInfo )
1311 return E_INVALIDARG;
1313 if( SUCCEEDED(loadTypeInfo()) )
1321 STDMETHODIMP VLCMessage::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1323 if( NULL == ppTInfo )
1324 return E_INVALIDARG;
1326 if( SUCCEEDED(loadTypeInfo()) )
1328 _p_typeinfo->AddRef();
1329 *ppTInfo = _p_typeinfo;
1336 STDMETHODIMP VLCMessage::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1337 UINT cNames, LCID lcid, DISPID* rgDispID)
1339 if( SUCCEEDED(loadTypeInfo()) )
1341 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1346 STDMETHODIMP VLCMessage::Invoke(DISPID dispIdMember, REFIID riid,
1347 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1348 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1350 if( SUCCEEDED(loadTypeInfo()) )
1352 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1353 pVarResult, pExcepInfo, puArgErr);
1358 inline const char *msgSeverity(int sev)
1373 STDMETHODIMP VLCMessage::get__Value(VARIANT* _Value)
1375 if( NULL == _Value )
1380 snprintf(buffer, sizeof(buffer), "%s %s %s: %s",
1381 _msg.psz_type, _msg.psz_name, msgSeverity(_msg.i_severity), _msg.psz_message);
1383 V_VT(_Value) = VT_BSTR;
1384 V_BSTR(_Value) = BSTRFromCStr(CP_UTF8, buffer);
1389 STDMETHODIMP VLCMessage::get_severity(long* level)
1394 *level = _msg.i_severity;
1399 STDMETHODIMP VLCMessage::get_type(BSTR* type)
1404 *type = BSTRFromCStr(CP_UTF8, _msg.psz_type);
1409 STDMETHODIMP VLCMessage::get_name(BSTR* name)
1414 *name = BSTRFromCStr(CP_UTF8, _msg.psz_name);
1419 STDMETHODIMP VLCMessage::get_header(BSTR* header)
1421 if( NULL == header )
1424 *header = BSTRFromCStr(CP_UTF8, _msg.psz_header);
1429 STDMETHODIMP VLCMessage::get_message(BSTR* message)
1431 if( NULL == message )
1434 *message = BSTRFromCStr(CP_UTF8, _msg.psz_message);
1439 /*******************************************************************************/
1441 VLCPlaylistItems::~VLCPlaylistItems()
1444 _p_typeinfo->Release();
1447 HRESULT VLCPlaylistItems::loadTypeInfo(void)
1449 HRESULT hr = NOERROR;
1450 if( NULL == _p_typeinfo )
1452 ITypeLib *p_typelib;
1454 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1457 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCPlaylistItems, &_p_typeinfo);
1462 p_typelib->Release();
1468 STDMETHODIMP VLCPlaylistItems::GetTypeInfoCount(UINT* pctInfo)
1470 if( NULL == pctInfo )
1471 return E_INVALIDARG;
1473 if( SUCCEEDED(loadTypeInfo()) )
1481 STDMETHODIMP VLCPlaylistItems::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1483 if( NULL == ppTInfo )
1484 return E_INVALIDARG;
1486 if( SUCCEEDED(loadTypeInfo()) )
1488 _p_typeinfo->AddRef();
1489 *ppTInfo = _p_typeinfo;
1496 STDMETHODIMP VLCPlaylistItems::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1497 UINT cNames, LCID lcid, DISPID* rgDispID)
1499 if( SUCCEEDED(loadTypeInfo()) )
1501 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1506 STDMETHODIMP VLCPlaylistItems::Invoke(DISPID dispIdMember, REFIID riid,
1507 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1508 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1510 if( SUCCEEDED(loadTypeInfo()) )
1512 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1513 pVarResult, pExcepInfo, puArgErr);
1518 STDMETHODIMP VLCPlaylistItems::get_count(long* count)
1523 libvlc_instance_t* p_libvlc;
1524 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1527 libvlc_exception_t ex;
1528 libvlc_exception_init(&ex);
1530 libvlc_playlist_lock(p_libvlc);
1531 *count = libvlc_playlist_items_count(p_libvlc, &ex);
1532 libvlc_playlist_unlock(p_libvlc);
1533 if( libvlc_exception_raised(&ex) )
1535 _p_instance->setErrorInfo(IID_IVLCPlaylistItems,
1536 libvlc_exception_get_message(&ex));
1537 libvlc_exception_clear(&ex);
1545 STDMETHODIMP VLCPlaylistItems::clear()
1547 libvlc_instance_t* p_libvlc;
1548 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1551 libvlc_exception_t ex;
1552 libvlc_exception_init(&ex);
1554 libvlc_playlist_clear(p_libvlc, &ex);
1555 if( libvlc_exception_raised(&ex) )
1557 _p_instance->setErrorInfo(IID_IVLCPlaylistItems,
1558 libvlc_exception_get_message(&ex));
1559 libvlc_exception_clear(&ex);
1567 STDMETHODIMP VLCPlaylistItems::remove(long item)
1569 libvlc_instance_t* p_libvlc;
1570 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1573 libvlc_exception_t ex;
1574 libvlc_exception_init(&ex);
1576 libvlc_playlist_delete_item(p_libvlc, item, &ex);
1577 if( libvlc_exception_raised(&ex) )
1579 _p_instance->setErrorInfo(IID_IVLCPlaylistItems,
1580 libvlc_exception_get_message(&ex));
1581 libvlc_exception_clear(&ex);
1589 /*******************************************************************************/
1591 VLCPlaylist::~VLCPlaylist()
1593 delete _p_vlcplaylistitems;
1595 _p_typeinfo->Release();
1598 HRESULT VLCPlaylist::loadTypeInfo(void)
1600 HRESULT hr = NOERROR;
1601 if( NULL == _p_typeinfo )
1603 ITypeLib *p_typelib;
1605 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1608 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCPlaylist, &_p_typeinfo);
1613 p_typelib->Release();
1619 STDMETHODIMP VLCPlaylist::GetTypeInfoCount(UINT* pctInfo)
1621 if( NULL == pctInfo )
1622 return E_INVALIDARG;
1624 if( SUCCEEDED(loadTypeInfo()) )
1632 STDMETHODIMP VLCPlaylist::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1634 if( NULL == ppTInfo )
1635 return E_INVALIDARG;
1637 if( SUCCEEDED(loadTypeInfo()) )
1639 _p_typeinfo->AddRef();
1640 *ppTInfo = _p_typeinfo;
1647 STDMETHODIMP VLCPlaylist::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1648 UINT cNames, LCID lcid, DISPID* rgDispID)
1650 if( SUCCEEDED(loadTypeInfo()) )
1652 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1657 STDMETHODIMP VLCPlaylist::Invoke(DISPID dispIdMember, REFIID riid,
1658 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1659 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1661 if( SUCCEEDED(loadTypeInfo()) )
1663 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1664 pVarResult, pExcepInfo, puArgErr);
1669 STDMETHODIMP VLCPlaylist::get_itemCount(long* count)
1675 libvlc_instance_t* p_libvlc;
1676 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1679 libvlc_exception_t ex;
1680 libvlc_exception_init(&ex);
1682 libvlc_playlist_lock(p_libvlc);
1683 *count = libvlc_playlist_items_count(p_libvlc, &ex);
1684 libvlc_playlist_unlock(p_libvlc);
1685 if( libvlc_exception_raised(&ex) )
1687 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1688 libvlc_exception_get_message(&ex));
1689 libvlc_exception_clear(&ex);
1697 STDMETHODIMP VLCPlaylist::get_isPlaying(VARIANT_BOOL* isPlaying)
1699 if( NULL == isPlaying )
1702 libvlc_instance_t* p_libvlc;
1703 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1706 libvlc_exception_t ex;
1707 libvlc_exception_init(&ex);
1709 *isPlaying = libvlc_playlist_isplaying(p_libvlc, &ex) ?
1710 VARIANT_TRUE: VARIANT_FALSE;
1711 if( libvlc_exception_raised(&ex) )
1713 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1714 libvlc_exception_get_message(&ex));
1715 libvlc_exception_clear(&ex);
1723 STDMETHODIMP VLCPlaylist::add(BSTR uri, VARIANT name, VARIANT options, long* item)
1728 if( 0 == SysStringLen(uri) )
1729 return E_INVALIDARG;
1731 libvlc_instance_t* p_libvlc;
1732 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1735 libvlc_exception_t ex;
1736 libvlc_exception_init(&ex);
1738 char *psz_uri = NULL;
1739 if( SysStringLen(_p_instance->getBaseURL()) > 0 )
1742 ** if the MRL a relative URL, we should end up with an absolute URL
1744 LPWSTR abs_url = CombineURL(_p_instance->getBaseURL(), uri);
1745 if( NULL != abs_url )
1747 psz_uri = CStrFromWSTR(CP_UTF8, abs_url, wcslen(abs_url));
1748 CoTaskMemFree(abs_url);
1752 psz_uri = CStrFromBSTR(CP_UTF8, uri);
1758 ** baseURL is empty, assume MRL is absolute
1760 psz_uri = CStrFromBSTR(CP_UTF8, uri);
1763 if( NULL == psz_uri )
1765 return E_OUTOFMEMORY;
1769 char **ppsz_options;
1771 hr = VLCControl::CreateTargetOptions(CP_UTF8, &options, &ppsz_options, &i_options);
1774 CoTaskMemFree(psz_uri);
1778 char *psz_name = NULL;
1780 VariantInit(&v_name);
1781 if( SUCCEEDED(VariantChangeType(&v_name, &name, 0, VT_BSTR)) )
1783 if( SysStringLen(V_BSTR(&v_name)) > 0 )
1784 psz_name = CStrFromBSTR(CP_UTF8, V_BSTR(&v_name));
1786 VariantClear(&v_name);
1789 *item = libvlc_playlist_add_extended(p_libvlc,
1793 const_cast<const char **>(ppsz_options),
1796 VLCControl::FreeTargetOptions(ppsz_options, i_options);
1797 CoTaskMemFree(psz_uri);
1799 CoTaskMemFree(psz_name);
1800 if( libvlc_exception_raised(&ex) )
1802 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1803 libvlc_exception_get_message(&ex));
1804 libvlc_exception_clear(&ex);
1812 STDMETHODIMP VLCPlaylist::play()
1814 libvlc_instance_t* p_libvlc;
1815 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1818 libvlc_exception_t ex;
1819 libvlc_exception_init(&ex);
1821 libvlc_playlist_play(p_libvlc, -1, 0, NULL, &ex);
1822 if( libvlc_exception_raised(&ex) )
1824 libvlc_exception_clear(&ex);
1832 STDMETHODIMP VLCPlaylist::playItem(long item)
1834 libvlc_instance_t* p_libvlc;
1835 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1838 libvlc_exception_t ex;
1839 libvlc_exception_init(&ex);
1841 libvlc_playlist_play(p_libvlc, item, 0, NULL, &ex);
1842 if( libvlc_exception_raised(&ex) )
1844 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1845 libvlc_exception_get_message(&ex));
1846 libvlc_exception_clear(&ex);
1854 STDMETHODIMP VLCPlaylist::togglePause()
1856 libvlc_instance_t* p_libvlc;
1857 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1860 libvlc_exception_t ex;
1861 libvlc_exception_init(&ex);
1863 libvlc_playlist_pause(p_libvlc, &ex);
1864 if( libvlc_exception_raised(&ex) )
1866 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1867 libvlc_exception_get_message(&ex));
1868 libvlc_exception_clear(&ex);
1876 STDMETHODIMP VLCPlaylist::stop()
1878 libvlc_instance_t* p_libvlc;
1879 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1882 libvlc_exception_t ex;
1883 libvlc_exception_init(&ex);
1885 libvlc_playlist_stop(p_libvlc, &ex);
1886 if( libvlc_exception_raised(&ex) )
1888 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1889 libvlc_exception_get_message(&ex));
1890 libvlc_exception_clear(&ex);
1898 STDMETHODIMP VLCPlaylist::next()
1900 libvlc_instance_t* p_libvlc;
1901 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1904 libvlc_exception_t ex;
1905 libvlc_exception_init(&ex);
1907 libvlc_playlist_next(p_libvlc, &ex);
1908 if( libvlc_exception_raised(&ex) )
1910 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1911 libvlc_exception_get_message(&ex));
1912 libvlc_exception_clear(&ex);
1920 STDMETHODIMP VLCPlaylist::prev()
1922 libvlc_instance_t* p_libvlc;
1923 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1926 libvlc_exception_t ex;
1927 libvlc_exception_init(&ex);
1929 libvlc_playlist_prev(p_libvlc, &ex);
1930 if( libvlc_exception_raised(&ex) )
1932 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1933 libvlc_exception_get_message(&ex));
1934 libvlc_exception_clear(&ex);
1942 STDMETHODIMP VLCPlaylist::clear()
1944 libvlc_instance_t* p_libvlc;
1945 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1948 libvlc_exception_t ex;
1949 libvlc_exception_init(&ex);
1951 libvlc_playlist_clear(p_libvlc, &ex);
1952 if( libvlc_exception_raised(&ex) )
1954 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1955 libvlc_exception_get_message(&ex));
1956 libvlc_exception_clear(&ex);
1964 STDMETHODIMP VLCPlaylist::removeItem(long item)
1966 libvlc_instance_t* p_libvlc;
1967 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1970 libvlc_exception_t ex;
1971 libvlc_exception_init(&ex);
1973 libvlc_playlist_delete_item(p_libvlc, item, &ex);
1974 if( libvlc_exception_raised(&ex) )
1976 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1977 libvlc_exception_get_message(&ex));
1978 libvlc_exception_clear(&ex);
1986 STDMETHODIMP VLCPlaylist::get_items(IVLCPlaylistItems** obj)
1991 *obj = _p_vlcplaylistitems;
1992 if( NULL != _p_vlcplaylistitems )
1994 _p_vlcplaylistitems->AddRef();
1997 return E_OUTOFMEMORY;
2000 /*******************************************************************************/
2002 VLCVideo::~VLCVideo()
2005 _p_typeinfo->Release();
2008 HRESULT VLCVideo::loadTypeInfo(void)
2010 HRESULT hr = NOERROR;
2011 if( NULL == _p_typeinfo )
2013 ITypeLib *p_typelib;
2015 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
2018 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCVideo, &_p_typeinfo);
2023 p_typelib->Release();
2029 STDMETHODIMP VLCVideo::GetTypeInfoCount(UINT* pctInfo)
2031 if( NULL == pctInfo )
2032 return E_INVALIDARG;
2034 if( SUCCEEDED(loadTypeInfo()) )
2042 STDMETHODIMP VLCVideo::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
2044 if( NULL == ppTInfo )
2045 return E_INVALIDARG;
2047 if( SUCCEEDED(loadTypeInfo()) )
2049 _p_typeinfo->AddRef();
2050 *ppTInfo = _p_typeinfo;
2057 STDMETHODIMP VLCVideo::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
2058 UINT cNames, LCID lcid, DISPID* rgDispID)
2060 if( SUCCEEDED(loadTypeInfo()) )
2062 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
2067 STDMETHODIMP VLCVideo::Invoke(DISPID dispIdMember, REFIID riid,
2068 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
2069 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
2071 if( SUCCEEDED(loadTypeInfo()) )
2073 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
2074 pVarResult, pExcepInfo, puArgErr);
2079 STDMETHODIMP VLCVideo::get_fullscreen(VARIANT_BOOL* fullscreen)
2081 if( NULL == fullscreen )
2084 libvlc_instance_t* p_libvlc;
2085 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2088 libvlc_exception_t ex;
2089 libvlc_exception_init(&ex);
2091 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2092 if( ! libvlc_exception_raised(&ex) )
2094 *fullscreen = libvlc_get_fullscreen(p_md, &ex) ? VARIANT_TRUE : VARIANT_FALSE;
2095 libvlc_media_player_release(p_md);
2096 if( ! libvlc_exception_raised(&ex) )
2101 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2102 libvlc_exception_clear(&ex);
2108 STDMETHODIMP VLCVideo::put_fullscreen(VARIANT_BOOL fullscreen)
2110 libvlc_instance_t* p_libvlc;
2111 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2114 libvlc_exception_t ex;
2115 libvlc_exception_init(&ex);
2117 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2118 if( ! libvlc_exception_raised(&ex) )
2120 libvlc_set_fullscreen(p_md, VARIANT_FALSE != fullscreen, &ex);
2121 libvlc_media_player_release(p_md);
2122 if( ! libvlc_exception_raised(&ex) )
2127 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2128 libvlc_exception_clear(&ex);
2134 STDMETHODIMP VLCVideo::get_width(long* width)
2139 libvlc_instance_t* p_libvlc;
2140 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2143 libvlc_exception_t ex;
2144 libvlc_exception_init(&ex);
2146 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2147 if( ! libvlc_exception_raised(&ex) )
2149 *width = libvlc_video_get_width(p_md, &ex);
2150 libvlc_media_player_release(p_md);
2151 if( ! libvlc_exception_raised(&ex) )
2156 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2157 libvlc_exception_clear(&ex);
2163 STDMETHODIMP VLCVideo::get_height(long* height)
2165 if( NULL == height )
2168 libvlc_instance_t* p_libvlc;
2169 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2172 libvlc_exception_t ex;
2173 libvlc_exception_init(&ex);
2175 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2176 if( ! libvlc_exception_raised(&ex) )
2178 *height = libvlc_video_get_height(p_md, &ex);
2179 libvlc_media_player_release(p_md);
2180 if( ! libvlc_exception_raised(&ex) )
2185 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2186 libvlc_exception_clear(&ex);
2192 STDMETHODIMP VLCVideo::get_aspectRatio(BSTR* aspect)
2194 if( NULL == aspect )
2197 libvlc_instance_t* p_libvlc;
2198 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2201 libvlc_exception_t ex;
2202 libvlc_exception_init(&ex);
2204 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2205 if( ! libvlc_exception_raised(&ex) )
2207 char *psz_aspect = libvlc_video_get_aspect_ratio(p_md, &ex);
2209 libvlc_media_player_release(p_md);
2210 if( ! libvlc_exception_raised(&ex) )
2212 if( NULL == psz_aspect )
2213 return E_OUTOFMEMORY;
2215 *aspect = BSTRFromCStr(CP_UTF8, psz_aspect);
2218 return (NULL == *aspect) ? E_OUTOFMEMORY : NOERROR;
2223 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2224 libvlc_exception_clear(&ex);
2230 STDMETHODIMP VLCVideo::put_aspectRatio(BSTR aspect)
2232 if( NULL == aspect )
2235 if( 0 == SysStringLen(aspect) )
2236 return E_INVALIDARG;
2238 libvlc_instance_t* p_libvlc;
2239 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2242 libvlc_exception_t ex;
2243 libvlc_exception_init(&ex);
2245 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2246 if( ! libvlc_exception_raised(&ex) )
2248 char *psz_aspect = CStrFromBSTR(CP_UTF8, aspect);
2249 if( NULL == psz_aspect )
2251 return E_OUTOFMEMORY;
2254 libvlc_video_set_aspect_ratio(p_md, psz_aspect, &ex);
2256 CoTaskMemFree(psz_aspect);
2257 libvlc_media_player_release(p_md);
2258 if( libvlc_exception_raised(&ex) )
2260 _p_instance->setErrorInfo(IID_IVLCVideo,
2261 libvlc_exception_get_message(&ex));
2262 libvlc_exception_clear(&ex);
2271 STDMETHODIMP VLCVideo::get_subtitle(long* spu)
2276 libvlc_instance_t* p_libvlc;
2277 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2280 libvlc_exception_t ex;
2281 libvlc_exception_init(&ex);
2283 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2284 if( ! libvlc_exception_raised(&ex) )
2286 *spu = libvlc_video_get_spu(p_md, &ex);
2287 libvlc_media_player_release(p_md);
2288 if( ! libvlc_exception_raised(&ex) )
2293 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2294 libvlc_exception_clear(&ex);
2300 STDMETHODIMP VLCVideo::put_subtitle(long spu)
2302 libvlc_instance_t* p_libvlc;
2303 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2306 libvlc_exception_t ex;
2307 libvlc_exception_init(&ex);
2309 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2310 libvlc_video_set_spu(p_md, spu, &ex);
2311 libvlc_media_player_release(p_md);
2312 if( libvlc_exception_raised(&ex) )
2314 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2315 libvlc_exception_clear(&ex);
2323 STDMETHODIMP VLCVideo::get_crop(BSTR* geometry)
2325 if( NULL == geometry )
2328 libvlc_instance_t* p_libvlc;
2329 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2332 libvlc_exception_t ex;
2333 libvlc_exception_init(&ex);
2335 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2336 if( ! libvlc_exception_raised(&ex) )
2338 char *psz_geometry = libvlc_video_get_crop_geometry(p_md, &ex);
2340 libvlc_media_player_release(p_md);
2341 if( ! libvlc_exception_raised(&ex) )
2343 if( NULL == psz_geometry )
2344 return E_OUTOFMEMORY;
2346 *geometry = BSTRFromCStr(CP_UTF8, psz_geometry);
2347 free( psz_geometry );
2348 psz_geometry = NULL;
2349 return (NULL == geometry) ? E_OUTOFMEMORY : NOERROR;
2351 free( psz_geometry );
2352 psz_geometry = NULL;
2354 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2355 libvlc_exception_clear(&ex);
2361 STDMETHODIMP VLCVideo::put_crop(BSTR geometry)
2363 if( NULL == geometry )
2366 if( 0 == SysStringLen(geometry) )
2367 return E_INVALIDARG;
2369 libvlc_instance_t* p_libvlc;
2370 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2373 libvlc_exception_t ex;
2374 libvlc_exception_init(&ex);
2376 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2377 if( ! libvlc_exception_raised(&ex) )
2379 char *psz_geometry = CStrFromBSTR(CP_UTF8, geometry);
2380 if( NULL == psz_geometry )
2382 return E_OUTOFMEMORY;
2385 libvlc_video_set_crop_geometry(p_md, psz_geometry, &ex);
2387 CoTaskMemFree(psz_geometry);
2388 libvlc_media_player_release(p_md);
2389 if( libvlc_exception_raised(&ex) )
2391 _p_instance->setErrorInfo(IID_IVLCVideo,
2392 libvlc_exception_get_message(&ex));
2393 libvlc_exception_clear(&ex);
2402 STDMETHODIMP VLCVideo::get_teletext(long* page)
2407 libvlc_instance_t* p_libvlc;
2408 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2411 libvlc_exception_t ex;
2412 libvlc_exception_init(&ex);
2414 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2415 if( ! libvlc_exception_raised(&ex) )
2417 *page = libvlc_video_get_teletext(p_md, &ex);
2418 libvlc_media_player_release(p_md);
2419 if( ! libvlc_exception_raised(&ex) )
2424 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2425 libvlc_exception_clear(&ex);
2431 STDMETHODIMP VLCVideo::put_teletext(long page)
2433 libvlc_instance_t* p_libvlc;
2434 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2437 libvlc_exception_t ex;
2438 libvlc_exception_init(&ex);
2440 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2441 libvlc_video_set_teletext(p_md, page, &ex);
2442 libvlc_media_player_release(p_md);
2443 if( libvlc_exception_raised(&ex) )
2445 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2446 libvlc_exception_clear(&ex);
2454 STDMETHODIMP VLCVideo::takeSnapshot(LPPICTUREDISP* picture)
2456 if( NULL == picture )
2459 libvlc_instance_t* p_libvlc;
2460 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2463 libvlc_exception_t ex;
2464 libvlc_exception_init(&ex);
2466 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2467 if( ! libvlc_exception_raised(&ex) )
2469 static int uniqueId = 0;
2470 TCHAR path[MAX_PATH+1];
2472 int pathlen = GetTempPath(MAX_PATH-24, path);
2473 if( (0 == pathlen) || (pathlen > (MAX_PATH-24)) )
2476 /* check temp directory path by openning it */
2478 HANDLE dirHandle = CreateFile(path,
2480 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
2483 FILE_FLAG_BACKUP_SEMANTICS, NULL);
2484 if( INVALID_HANDLE_VALUE == dirHandle )
2486 _p_instance->setErrorInfo(IID_IVLCVideo,
2487 "Invalid temporary directory for snapshot images, check values of TMP, TEMP envars.");
2492 BY_HANDLE_FILE_INFORMATION bhfi;
2493 BOOL res = GetFileInformationByHandle(dirHandle, &bhfi);
2494 CloseHandle(dirHandle);
2495 if( !res || !(bhfi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
2497 _p_instance->setErrorInfo(IID_IVLCVideo,
2498 "Invalid temporary directory for snapshot images, check values of TMP, TEMP envars.");
2504 TCHAR filepath[MAX_PATH+1];
2506 _stprintf(filepath, TEXT("%sAXVLC%lXS%lX.bmp"),
2507 path, GetCurrentProcessId(), ++uniqueId);
2510 /* reuse path storage for UTF8 string */
2511 char *psz_filepath = (char *)path;
2512 WCHAR* wpath = filepath;
2514 char *psz_filepath = path;
2515 /* first convert to unicode using current code page */
2516 WCHAR wpath[MAX_PATH+1];
2517 if( 0 == MultiByteToWideChar(CP_ACP, 0, filepath, -1, wpath, sizeof(wpath)/sizeof(WCHAR)) )
2520 /* convert to UTF8 */
2521 pathlen = WideCharToMultiByte(CP_UTF8, 0, wpath, -1, psz_filepath, sizeof(path), NULL, NULL);
2522 // fail if path is 0 or too short (i.e pathlen is the same as storage size)
2523 if( (0 == pathlen) || (sizeof(path) == pathlen) )
2526 /* take snapshot into file */
2527 libvlc_video_take_snapshot(p_md, psz_filepath, 0, 0, &ex);
2528 libvlc_media_player_release(p_md);
2529 if( ! libvlc_exception_raised(&ex) )
2532 /* open snapshot file */
2533 HANDLE snapPic = LoadImage(NULL, filepath, IMAGE_BITMAP,0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
2538 snapDesc.cbSizeofstruct = sizeof(PICTDESC);
2539 snapDesc.picType = PICTYPE_BITMAP;
2540 snapDesc.bmp.hbitmap = (HBITMAP)snapPic;
2541 snapDesc.bmp.hpal = NULL;
2543 hr = OleCreatePictureIndirect(&snapDesc, IID_IPictureDisp, TRUE, (LPVOID*)picture);
2547 DeleteObject(snapPic);
2550 DeleteFile(filepath);
2554 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2555 libvlc_exception_clear(&ex);
2561 STDMETHODIMP VLCVideo::toggleFullscreen()
2563 libvlc_instance_t* p_libvlc;
2564 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2567 libvlc_exception_t ex;
2568 libvlc_exception_init(&ex);
2570 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2571 if( ! libvlc_exception_raised(&ex) )
2573 libvlc_toggle_fullscreen(p_md, &ex);
2574 libvlc_media_player_release(p_md);
2575 if( ! libvlc_exception_raised(&ex) )
2580 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2581 libvlc_exception_clear(&ex);
2587 STDMETHODIMP VLCVideo::toggleTeletext()
2589 libvlc_instance_t* p_libvlc;
2590 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2593 libvlc_exception_t ex;
2594 libvlc_exception_init(&ex);
2596 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2597 if( ! libvlc_exception_raised(&ex) )
2599 libvlc_toggle_teletext(p_md, &ex);
2600 libvlc_media_player_release(p_md);
2601 if( ! libvlc_exception_raised(&ex) )
2606 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2607 libvlc_exception_clear(&ex);
2613 /*******************************************************************************/
2615 VLCControl2::VLCControl2(VLCPlugin *p_instance) :
2616 _p_instance(p_instance),
2620 _p_vlcplaylist(NULL),
2623 _p_vlcaudio = new VLCAudio(p_instance);
2624 _p_vlcinput = new VLCInput(p_instance);
2625 _p_vlclog = new VLCLog(p_instance);
2626 _p_vlcplaylist = new VLCPlaylist(p_instance);
2627 _p_vlcvideo = new VLCVideo(p_instance);
2630 VLCControl2::~VLCControl2()
2633 delete _p_vlcplaylist;
2638 _p_typeinfo->Release();
2641 HRESULT VLCControl2::loadTypeInfo(void)
2643 HRESULT hr = NOERROR;
2644 if( NULL == _p_typeinfo )
2646 ITypeLib *p_typelib;
2648 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
2651 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCControl2, &_p_typeinfo);
2656 p_typelib->Release();
2662 STDMETHODIMP VLCControl2::GetTypeInfoCount(UINT* pctInfo)
2664 if( NULL == pctInfo )
2665 return E_INVALIDARG;
2667 if( SUCCEEDED(loadTypeInfo()) )
2675 STDMETHODIMP VLCControl2::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
2677 if( NULL == ppTInfo )
2678 return E_INVALIDARG;
2680 if( SUCCEEDED(loadTypeInfo()) )
2682 _p_typeinfo->AddRef();
2683 *ppTInfo = _p_typeinfo;
2690 STDMETHODIMP VLCControl2::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
2691 UINT cNames, LCID lcid, DISPID* rgDispID)
2693 if( SUCCEEDED(loadTypeInfo()) )
2695 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
2700 STDMETHODIMP VLCControl2::Invoke(DISPID dispIdMember, REFIID riid,
2701 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
2702 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
2704 if( SUCCEEDED(loadTypeInfo()) )
2706 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
2707 pVarResult, pExcepInfo, puArgErr);
2712 STDMETHODIMP VLCControl2::get_AutoLoop(VARIANT_BOOL *autoloop)
2714 if( NULL == autoloop )
2717 *autoloop = _p_instance->getAutoLoop() ? VARIANT_TRUE: VARIANT_FALSE;
2721 STDMETHODIMP VLCControl2::put_AutoLoop(VARIANT_BOOL autoloop)
2723 _p_instance->setAutoLoop((VARIANT_FALSE != autoloop) ? TRUE: FALSE);
2727 STDMETHODIMP VLCControl2::get_AutoPlay(VARIANT_BOOL *autoplay)
2729 if( NULL == autoplay )
2732 *autoplay = _p_instance->getAutoPlay() ? VARIANT_TRUE: VARIANT_FALSE;
2736 STDMETHODIMP VLCControl2::put_AutoPlay(VARIANT_BOOL autoplay)
2738 _p_instance->setAutoPlay((VARIANT_FALSE != autoplay) ? TRUE: FALSE);
2742 STDMETHODIMP VLCControl2::get_BaseURL(BSTR *url)
2747 *url = SysAllocStringLen(_p_instance->getBaseURL(),
2748 SysStringLen(_p_instance->getBaseURL()));
2752 STDMETHODIMP VLCControl2::put_BaseURL(BSTR mrl)
2754 _p_instance->setBaseURL(mrl);
2759 STDMETHODIMP VLCControl2::get_MRL(BSTR *mrl)
2764 *mrl = SysAllocStringLen(_p_instance->getMRL(),
2765 SysStringLen(_p_instance->getMRL()));
2769 STDMETHODIMP VLCControl2::put_MRL(BSTR mrl)
2771 _p_instance->setMRL(mrl);
2777 STDMETHODIMP VLCControl2::get_Toolbar(VARIANT_BOOL *visible)
2779 if( NULL == visible )
2783 * Note to developpers
2785 * Returning the _b_toolbar is closer to the method specification.
2786 * But returning True when toolbar is not implemented so not displayed
2787 * could be bad for ActiveX users which rely on this value to show their
2788 * own toolbar if not provided by the ActiveX.
2790 * This is the reason why FALSE is returned, until toolbar get implemented.
2793 /* DISABLED for now */
2794 // *visible = _p_instance->getShowToolbar() ? VARIANT_TRUE: VARIANT_FALSE;
2796 *visible = VARIANT_FALSE;
2801 STDMETHODIMP VLCControl2::put_Toolbar(VARIANT_BOOL visible)
2803 _p_instance->setShowToolbar((VARIANT_FALSE != visible) ? TRUE: FALSE);
2808 STDMETHODIMP VLCControl2::get_StartTime(long *seconds)
2810 if( NULL == seconds )
2813 *seconds = _p_instance->getStartTime();
2818 STDMETHODIMP VLCControl2::put_StartTime(long seconds)
2820 _p_instance->setStartTime(seconds);
2825 STDMETHODIMP VLCControl2::get_VersionInfo(BSTR *version)
2827 if( NULL == version )
2830 const char *versionStr = libvlc_get_version();
2831 if( NULL != versionStr )
2833 *version = BSTRFromCStr(CP_UTF8, versionStr);
2835 return (NULL == *version) ? E_OUTOFMEMORY : NOERROR;
2841 STDMETHODIMP VLCControl2::get_Visible(VARIANT_BOOL *isVisible)
2843 if( NULL == isVisible )
2846 *isVisible = _p_instance->getVisible() ? VARIANT_TRUE : VARIANT_FALSE;
2851 STDMETHODIMP VLCControl2::put_Visible(VARIANT_BOOL isVisible)
2853 _p_instance->setVisible(isVisible != VARIANT_FALSE);
2858 STDMETHODIMP VLCControl2::get_Volume(long *volume)
2860 if( NULL == volume )
2863 *volume = _p_instance->getVolume();
2867 STDMETHODIMP VLCControl2::put_Volume(long volume)
2869 _p_instance->setVolume(volume);
2873 STDMETHODIMP VLCControl2::get_BackColor(OLE_COLOR *backcolor)
2875 if( NULL == backcolor )
2878 *backcolor = _p_instance->getBackColor();
2882 STDMETHODIMP VLCControl2::put_BackColor(OLE_COLOR backcolor)
2884 _p_instance->setBackColor(backcolor);
2888 STDMETHODIMP VLCControl2::get_audio(IVLCAudio** obj)
2894 if( NULL != _p_vlcaudio )
2896 _p_vlcaudio->AddRef();
2899 return E_OUTOFMEMORY;
2902 STDMETHODIMP VLCControl2::get_input(IVLCInput** obj)
2908 if( NULL != _p_vlcinput )
2910 _p_vlcinput->AddRef();
2913 return E_OUTOFMEMORY;
2916 STDMETHODIMP VLCControl2::get_log(IVLCLog** obj)
2922 if( NULL != _p_vlclog )
2924 _p_vlclog->AddRef();
2927 return E_OUTOFMEMORY;
2930 STDMETHODIMP VLCControl2::get_playlist(IVLCPlaylist** obj)
2935 *obj = _p_vlcplaylist;
2936 if( NULL != _p_vlcplaylist )
2938 _p_vlcplaylist->AddRef();
2941 return E_OUTOFMEMORY;
2944 STDMETHODIMP VLCControl2::get_video(IVLCVideo** obj)
2950 if( NULL != _p_vlcvideo )
2952 _p_vlcvideo->AddRef();
2955 return E_OUTOFMEMORY;