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"
39 _p_typeinfo->Release();
42 HRESULT VLCAudio::loadTypeInfo(void)
45 if( NULL == _p_typeinfo )
49 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
52 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCAudio, &_p_typeinfo);
63 STDMETHODIMP VLCAudio::GetTypeInfoCount(UINT* pctInfo)
68 if( SUCCEEDED(loadTypeInfo()) )
76 STDMETHODIMP VLCAudio::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
81 if( SUCCEEDED(loadTypeInfo()) )
83 _p_typeinfo->AddRef();
84 *ppTInfo = _p_typeinfo;
91 STDMETHODIMP VLCAudio::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
92 UINT cNames, LCID lcid, DISPID* rgDispID)
94 if( SUCCEEDED(loadTypeInfo()) )
96 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
101 STDMETHODIMP VLCAudio::Invoke(DISPID dispIdMember, REFIID riid,
102 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
103 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
105 if( SUCCEEDED(loadTypeInfo()) )
107 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
108 pVarResult, pExcepInfo, puArgErr);
113 STDMETHODIMP VLCAudio::get_mute(VARIANT_BOOL* mute)
118 libvlc_instance_t* p_libvlc;
119 HRESULT hr = _p_instance->getVLC(&p_libvlc);
122 libvlc_exception_t ex;
123 libvlc_exception_init(&ex);
125 *mute = libvlc_audio_get_mute(p_libvlc, &ex) ?
126 VARIANT_TRUE : VARIANT_FALSE;
127 if( libvlc_exception_raised(&ex) )
129 _p_instance->setErrorInfo(IID_IVLCAudio,
130 libvlc_exception_get_message(&ex));
131 libvlc_exception_clear(&ex);
139 STDMETHODIMP VLCAudio::put_mute(VARIANT_BOOL mute)
141 libvlc_instance_t* p_libvlc;
142 HRESULT hr = _p_instance->getVLC(&p_libvlc);
145 libvlc_exception_t ex;
146 libvlc_exception_init(&ex);
148 libvlc_audio_set_mute(p_libvlc, VARIANT_FALSE != mute, &ex);
149 if( libvlc_exception_raised(&ex) )
151 _p_instance->setErrorInfo(IID_IVLCAudio,
152 libvlc_exception_get_message(&ex));
153 libvlc_exception_clear(&ex);
161 STDMETHODIMP VLCAudio::get_volume(long* volume)
166 libvlc_instance_t* p_libvlc;
167 HRESULT hr = _p_instance->getVLC(&p_libvlc);
170 libvlc_exception_t ex;
171 libvlc_exception_init(&ex);
173 *volume = libvlc_audio_get_volume(p_libvlc, &ex);
174 if( libvlc_exception_raised(&ex) )
176 _p_instance->setErrorInfo(IID_IVLCAudio,
177 libvlc_exception_get_message(&ex));
178 libvlc_exception_clear(&ex);
186 STDMETHODIMP VLCAudio::put_volume(long volume)
188 libvlc_instance_t* p_libvlc;
189 HRESULT hr = _p_instance->getVLC(&p_libvlc);
192 libvlc_exception_t ex;
193 libvlc_exception_init(&ex);
195 libvlc_audio_set_volume(p_libvlc, volume, &ex);
196 if( libvlc_exception_raised(&ex) )
198 _p_instance->setErrorInfo(IID_IVLCAudio,
199 libvlc_exception_get_message(&ex));
200 libvlc_exception_clear(&ex);
208 STDMETHODIMP VLCAudio::get_track(long* track)
213 libvlc_instance_t* p_libvlc;
214 HRESULT hr = _p_instance->getVLC(&p_libvlc);
217 libvlc_exception_t ex;
218 libvlc_exception_init(&ex);
220 libvlc_media_player_t *p_md;
221 p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
222 *track = libvlc_audio_get_track(p_md, &ex);
223 libvlc_media_player_release(p_md);
224 if( libvlc_exception_raised(&ex) )
226 _p_instance->setErrorInfo(IID_IVLCAudio,
227 libvlc_exception_get_message(&ex));
228 libvlc_exception_clear(&ex);
236 STDMETHODIMP VLCAudio::put_track(long track)
238 libvlc_instance_t* p_libvlc;
239 HRESULT hr = _p_instance->getVLC(&p_libvlc);
242 libvlc_exception_t ex;
243 libvlc_exception_init(&ex);
245 libvlc_media_player_t *p_md;
246 p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
247 libvlc_audio_set_track(p_md, track, &ex);
248 libvlc_media_player_release(p_md);
249 if( libvlc_exception_raised(&ex) )
251 _p_instance->setErrorInfo(IID_IVLCAudio,
252 libvlc_exception_get_message(&ex));
253 libvlc_exception_clear(&ex);
261 STDMETHODIMP VLCAudio::get_channel(long *channel)
263 if( NULL == channel )
266 libvlc_instance_t* p_libvlc;
267 HRESULT hr = _p_instance->getVLC(&p_libvlc);
270 libvlc_exception_t ex;
271 libvlc_exception_init(&ex);
273 *channel = libvlc_audio_get_channel(p_libvlc, &ex);
274 if( libvlc_exception_raised(&ex) )
276 _p_instance->setErrorInfo(IID_IVLCAudio,
277 libvlc_exception_get_message(&ex));
278 libvlc_exception_clear(&ex);
286 STDMETHODIMP VLCAudio::put_channel(long channel)
288 libvlc_instance_t* p_libvlc;
289 HRESULT hr = _p_instance->getVLC(&p_libvlc);
292 libvlc_exception_t ex;
293 libvlc_exception_init(&ex);
295 libvlc_audio_set_channel(p_libvlc, channel, &ex);
296 if( libvlc_exception_raised(&ex) )
298 _p_instance->setErrorInfo(IID_IVLCAudio,
299 libvlc_exception_get_message(&ex));
300 libvlc_exception_clear(&ex);
308 STDMETHODIMP VLCAudio::toggleMute()
310 libvlc_instance_t* p_libvlc;
311 HRESULT hr = _p_instance->getVLC(&p_libvlc);
314 libvlc_exception_t ex;
315 libvlc_exception_init(&ex);
317 libvlc_audio_toggle_mute(p_libvlc, &ex);
318 if( libvlc_exception_raised(&ex) )
320 _p_instance->setErrorInfo(IID_IVLCAudio,
321 libvlc_exception_get_message(&ex));
322 libvlc_exception_clear(&ex);
330 /*******************************************************************************/
332 VLCInput::~VLCInput()
335 _p_typeinfo->Release();
338 HRESULT VLCInput::loadTypeInfo(void)
340 HRESULT hr = NOERROR;
341 if( NULL == _p_typeinfo )
345 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
348 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCInput, &_p_typeinfo);
353 p_typelib->Release();
359 STDMETHODIMP VLCInput::GetTypeInfoCount(UINT* pctInfo)
361 if( NULL == pctInfo )
364 if( SUCCEEDED(loadTypeInfo()) )
372 STDMETHODIMP VLCInput::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
374 if( NULL == ppTInfo )
377 if( SUCCEEDED(loadTypeInfo()) )
379 _p_typeinfo->AddRef();
380 *ppTInfo = _p_typeinfo;
387 STDMETHODIMP VLCInput::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
388 UINT cNames, LCID lcid, DISPID* rgDispID)
390 if( SUCCEEDED(loadTypeInfo()) )
392 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
397 STDMETHODIMP VLCInput::Invoke(DISPID dispIdMember, REFIID riid,
398 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
399 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
401 if( SUCCEEDED(loadTypeInfo()) )
403 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
404 pVarResult, pExcepInfo, puArgErr);
409 STDMETHODIMP VLCInput::get_length(double* length)
415 libvlc_instance_t* p_libvlc;
416 HRESULT hr = _p_instance->getVLC(&p_libvlc);
419 libvlc_exception_t ex;
420 libvlc_exception_init(&ex);
422 libvlc_media_player_t *p_md;
423 p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
424 if( ! libvlc_exception_raised(&ex) )
426 *length = (double)libvlc_media_player_get_length(p_md, &ex);
427 libvlc_media_player_release(p_md);
428 if( ! libvlc_exception_raised(&ex) )
433 _p_instance->setErrorInfo(IID_IVLCInput,
434 libvlc_exception_get_message(&ex));
435 libvlc_exception_clear(&ex);
441 STDMETHODIMP VLCInput::get_position(double* position)
443 if( NULL == position )
447 libvlc_instance_t* p_libvlc;
448 HRESULT hr = _p_instance->getVLC(&p_libvlc);
451 libvlc_exception_t ex;
452 libvlc_exception_init(&ex);
454 libvlc_media_player_t *p_md;
455 p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
456 if( ! libvlc_exception_raised(&ex) )
458 *position = libvlc_media_player_get_position(p_md, &ex);
459 libvlc_media_player_release(p_md);
460 if( ! libvlc_exception_raised(&ex) )
465 _p_instance->setErrorInfo(IID_IVLCInput,
466 libvlc_exception_get_message(&ex));
467 libvlc_exception_clear(&ex);
473 STDMETHODIMP VLCInput::put_position(double position)
475 libvlc_instance_t* p_libvlc;
476 HRESULT hr = _p_instance->getVLC(&p_libvlc);
479 libvlc_exception_t ex;
480 libvlc_exception_init(&ex);
482 libvlc_media_player_t *p_md;
483 p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
484 if( ! libvlc_exception_raised(&ex) )
486 libvlc_media_player_set_position(p_md, position, &ex);
487 libvlc_media_player_release(p_md);
488 if( ! libvlc_exception_raised(&ex) )
493 _p_instance->setErrorInfo(IID_IVLCInput,
494 libvlc_exception_get_message(&ex));
495 libvlc_exception_clear(&ex);
501 STDMETHODIMP VLCInput::get_time(double* time)
506 libvlc_instance_t* p_libvlc;
507 HRESULT hr = _p_instance->getVLC(&p_libvlc);
510 libvlc_exception_t ex;
511 libvlc_exception_init(&ex);
513 libvlc_media_player_t *p_md;
514 p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
515 if( ! libvlc_exception_raised(&ex) )
517 *time = (double)libvlc_media_player_get_time(p_md, &ex);
518 libvlc_media_player_release(p_md);
519 if( ! libvlc_exception_raised(&ex) )
524 _p_instance->setErrorInfo(IID_IVLCInput,
525 libvlc_exception_get_message(&ex));
526 libvlc_exception_clear(&ex);
532 STDMETHODIMP VLCInput::put_time(double time)
534 libvlc_instance_t* p_libvlc;
535 HRESULT hr = _p_instance->getVLC(&p_libvlc);
538 libvlc_exception_t ex;
539 libvlc_exception_init(&ex);
541 libvlc_media_player_t *p_md;
542 p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
543 if( ! libvlc_exception_raised(&ex) )
545 libvlc_media_player_set_time(p_md, (int64_t)time, &ex);
546 libvlc_media_player_release(p_md);
547 if( ! libvlc_exception_raised(&ex) )
552 _p_instance->setErrorInfo(IID_IVLCInput,
553 libvlc_exception_get_message(&ex));
554 libvlc_exception_clear(&ex);
560 STDMETHODIMP VLCInput::get_state(long* state)
565 libvlc_instance_t* p_libvlc;
566 HRESULT hr = _p_instance->getVLC(&p_libvlc);
569 libvlc_exception_t ex;
570 libvlc_exception_init(&ex);
572 libvlc_media_player_t *p_md;
573 p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
574 if( ! libvlc_exception_raised(&ex) )
576 *state = libvlc_media_player_get_state(p_md, &ex);
577 libvlc_media_player_release(p_md);
578 if( ! libvlc_exception_raised(&ex) )
583 libvlc_exception_clear(&ex);
584 // don't fail, just return the idle state
591 STDMETHODIMP VLCInput::get_rate(double* rate)
596 libvlc_instance_t* p_libvlc;
597 HRESULT hr = _p_instance->getVLC(&p_libvlc);
600 libvlc_exception_t ex;
601 libvlc_exception_init(&ex);
603 libvlc_media_player_t *p_md;
604 p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
605 if( ! libvlc_exception_raised(&ex) )
607 *rate = libvlc_media_player_get_rate(p_md, &ex);
608 libvlc_media_player_release(p_md);
609 if( ! libvlc_exception_raised(&ex) )
614 _p_instance->setErrorInfo(IID_IVLCInput,
615 libvlc_exception_get_message(&ex));
616 libvlc_exception_clear(&ex);
622 STDMETHODIMP VLCInput::put_rate(double rate)
624 libvlc_instance_t* p_libvlc;
625 HRESULT hr = _p_instance->getVLC(&p_libvlc);
628 libvlc_exception_t ex;
629 libvlc_exception_init(&ex);
631 libvlc_media_player_t *p_md;
632 p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
633 if( ! libvlc_exception_raised(&ex) )
635 libvlc_media_player_set_rate(p_md, rate, &ex);
636 libvlc_media_player_release(p_md);
637 if( ! libvlc_exception_raised(&ex) )
642 _p_instance->setErrorInfo(IID_IVLCInput,
643 libvlc_exception_get_message(&ex));
644 libvlc_exception_clear(&ex);
650 STDMETHODIMP VLCInput::get_fps(double* fps)
656 libvlc_instance_t* p_libvlc;
657 HRESULT hr = _p_instance->getVLC(&p_libvlc);
660 libvlc_exception_t ex;
661 libvlc_exception_init(&ex);
663 libvlc_media_player_t *p_md;
664 p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
665 if( ! libvlc_exception_raised(&ex) )
667 *fps = libvlc_media_player_get_fps(p_md, &ex);
668 libvlc_media_player_release(p_md);
669 if( ! libvlc_exception_raised(&ex) )
674 _p_instance->setErrorInfo(IID_IVLCInput,
675 libvlc_exception_get_message(&ex));
676 libvlc_exception_clear(&ex);
682 STDMETHODIMP VLCInput::get_hasVout(VARIANT_BOOL* hasVout)
684 if( NULL == hasVout )
687 libvlc_instance_t* p_libvlc;
688 HRESULT hr = _p_instance->getVLC(&p_libvlc);
691 libvlc_exception_t ex;
692 libvlc_exception_init(&ex);
694 libvlc_media_player_t *p_md;
695 p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
696 if( ! libvlc_exception_raised(&ex) )
698 *hasVout = libvlc_media_player_has_vout(p_md, &ex) ?
699 VARIANT_TRUE : VARIANT_FALSE;
700 libvlc_media_player_release(p_md);
701 if( ! libvlc_exception_raised(&ex) )
706 _p_instance->setErrorInfo(IID_IVLCInput,
707 libvlc_exception_get_message(&ex));
708 libvlc_exception_clear(&ex);
714 /*******************************************************************************/
718 delete _p_vlcmessages;
720 libvlc_log_close(_p_log, NULL);
723 _p_typeinfo->Release();
726 HRESULT VLCLog::loadTypeInfo(void)
728 HRESULT hr = NOERROR;
729 if( NULL == _p_typeinfo )
733 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
736 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCLog, &_p_typeinfo);
741 p_typelib->Release();
747 STDMETHODIMP VLCLog::GetTypeInfoCount(UINT* pctInfo)
749 if( NULL == pctInfo )
752 if( SUCCEEDED(loadTypeInfo()) )
760 STDMETHODIMP VLCLog::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
762 if( NULL == ppTInfo )
765 if( SUCCEEDED(loadTypeInfo()) )
767 _p_typeinfo->AddRef();
768 *ppTInfo = _p_typeinfo;
775 STDMETHODIMP VLCLog::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
776 UINT cNames, LCID lcid, DISPID* rgDispID)
778 if( SUCCEEDED(loadTypeInfo()) )
780 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
785 STDMETHODIMP VLCLog::Invoke(DISPID dispIdMember, REFIID riid,
786 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
787 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
789 if( SUCCEEDED(loadTypeInfo()) )
791 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
792 pVarResult, pExcepInfo, puArgErr);
797 STDMETHODIMP VLCLog::get_messages(IVLCMessages** obj)
802 *obj = _p_vlcmessages;
803 if( NULL != _p_vlcmessages )
805 _p_vlcmessages->AddRef();
808 return E_OUTOFMEMORY;
811 STDMETHODIMP VLCLog::get_verbosity(long* level)
818 libvlc_instance_t* p_libvlc;
819 HRESULT hr = _p_instance->getVLC(&p_libvlc);
822 libvlc_exception_t ex;
823 libvlc_exception_init(&ex);
825 *level = libvlc_get_log_verbosity(p_libvlc, &ex);
826 if( libvlc_exception_raised(&ex) )
828 _p_instance->setErrorInfo(IID_IVLCLog,
829 libvlc_exception_get_message(&ex));
830 libvlc_exception_clear(&ex);
838 /* log is not enabled, return -1 */
844 STDMETHODIMP VLCLog::put_verbosity(long verbosity)
846 libvlc_exception_t ex;
847 libvlc_exception_init(&ex);
849 libvlc_instance_t* p_libvlc;
850 HRESULT hr = _p_instance->getVLC(&p_libvlc);
857 _p_log = libvlc_log_open(p_libvlc, &ex);
858 if( libvlc_exception_raised(&ex) )
860 _p_instance->setErrorInfo(IID_IVLCLog,
861 libvlc_exception_get_message(&ex));
862 libvlc_exception_clear(&ex);
866 libvlc_set_log_verbosity(p_libvlc, (unsigned)verbosity, &ex);
867 if( libvlc_exception_raised(&ex) )
869 _p_instance->setErrorInfo(IID_IVLCLog,
870 libvlc_exception_get_message(&ex));
871 libvlc_exception_clear(&ex);
877 /* close log when verbosity is set to -1 */
878 libvlc_log_close(_p_log, &ex);
880 if( libvlc_exception_raised(&ex) )
882 _p_instance->setErrorInfo(IID_IVLCLog,
883 libvlc_exception_get_message(&ex));
884 libvlc_exception_clear(&ex);
892 /*******************************************************************************/
894 /* STL forward iterator used by VLCEnumIterator class to implement IEnumVARIANT */
896 class VLCMessageSTLIterator
901 VLCMessageSTLIterator(IVLCMessageIterator* iter) : iter(iter), msg(NULL)
907 VLCMessageSTLIterator(const VLCMessageSTLIterator& other)
917 virtual ~VLCMessageSTLIterator()
926 // we only need prefix ++ operator
927 VLCMessageSTLIterator& operator++()
929 VARIANT_BOOL hasNext = VARIANT_FALSE;
932 iter->get_hasNext(&hasNext);
939 if( VARIANT_TRUE == hasNext ) {
946 VARIANT operator*() const
952 if( SUCCEEDED(msg->QueryInterface(IID_IDispatch,
953 (LPVOID*)&V_DISPATCH(&v))) )
955 V_VT(&v) = VT_DISPATCH;
961 bool operator==(const VLCMessageSTLIterator& other) const
963 return msg == other.msg;
966 bool operator!=(const VLCMessageSTLIterator& other) const
968 return msg != other.msg;
972 IVLCMessageIterator* iter;
976 ////////////////////////////////////////////////////////////////////////////////////////////////////////////
978 VLCMessages::~VLCMessages()
981 _p_typeinfo->Release();
984 HRESULT VLCMessages::loadTypeInfo(void)
986 HRESULT hr = NOERROR;
987 if( NULL == _p_typeinfo )
991 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
994 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessages, &_p_typeinfo);
999 p_typelib->Release();
1005 STDMETHODIMP VLCMessages::GetTypeInfoCount(UINT* pctInfo)
1007 if( NULL == pctInfo )
1008 return E_INVALIDARG;
1010 if( SUCCEEDED(loadTypeInfo()) )
1018 STDMETHODIMP VLCMessages::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1020 if( NULL == ppTInfo )
1021 return E_INVALIDARG;
1023 if( SUCCEEDED(loadTypeInfo()) )
1025 _p_typeinfo->AddRef();
1026 *ppTInfo = _p_typeinfo;
1033 STDMETHODIMP VLCMessages::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1034 UINT cNames, LCID lcid, DISPID* rgDispID)
1036 if( SUCCEEDED(loadTypeInfo()) )
1038 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1043 STDMETHODIMP VLCMessages::Invoke(DISPID dispIdMember, REFIID riid,
1044 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1045 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1047 if( SUCCEEDED(loadTypeInfo()) )
1049 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1050 pVarResult, pExcepInfo, puArgErr);
1055 STDMETHODIMP VLCMessages::get__NewEnum(LPUNKNOWN* _NewEnum)
1057 if( NULL == _NewEnum )
1060 IVLCMessageIterator* iter = NULL;
1063 *_NewEnum= new VLCEnumIterator<IID_IEnumVARIANT,
1066 VLCMessageSTLIterator>
1067 (VLCMessageSTLIterator(iter), VLCMessageSTLIterator(NULL));
1069 return *_NewEnum ? S_OK : E_OUTOFMEMORY;
1072 STDMETHODIMP VLCMessages::clear()
1074 libvlc_log_t *p_log = _p_vlclog->_p_log;
1077 libvlc_exception_t ex;
1078 libvlc_exception_init(&ex);
1080 libvlc_log_clear(p_log, &ex);
1081 if( libvlc_exception_raised(&ex) )
1083 _p_instance->setErrorInfo(IID_IVLCMessages,
1084 libvlc_exception_get_message(&ex));
1085 libvlc_exception_clear(&ex);
1092 STDMETHODIMP VLCMessages::get_count(long* count)
1097 libvlc_log_t *p_log = _p_vlclog->_p_log;
1100 libvlc_exception_t ex;
1101 libvlc_exception_init(&ex);
1103 *count = libvlc_log_count(p_log, &ex);
1104 if( libvlc_exception_raised(&ex) )
1106 _p_instance->setErrorInfo(IID_IVLCMessages,
1107 libvlc_exception_get_message(&ex));
1108 libvlc_exception_clear(&ex);
1117 STDMETHODIMP VLCMessages::iterator(IVLCMessageIterator** iter)
1122 *iter = new VLCMessageIterator(_p_instance, _p_vlclog);
1124 return *iter ? S_OK : E_OUTOFMEMORY;
1127 /*******************************************************************************/
1129 VLCMessageIterator::VLCMessageIterator(VLCPlugin *p_instance, VLCLog* p_vlclog ) :
1130 _p_instance(p_instance),
1135 if( p_vlclog->_p_log )
1137 _p_iter = libvlc_log_get_iterator(p_vlclog->_p_log, NULL);
1143 VLCMessageIterator::~VLCMessageIterator()
1146 libvlc_log_iterator_free(_p_iter, NULL);
1149 _p_typeinfo->Release();
1152 HRESULT VLCMessageIterator::loadTypeInfo(void)
1154 HRESULT hr = NOERROR;
1155 if( NULL == _p_typeinfo )
1157 ITypeLib *p_typelib;
1159 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1162 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessageIterator, &_p_typeinfo);
1167 p_typelib->Release();
1173 STDMETHODIMP VLCMessageIterator::GetTypeInfoCount(UINT* pctInfo)
1175 if( NULL == pctInfo )
1176 return E_INVALIDARG;
1178 if( SUCCEEDED(loadTypeInfo()) )
1186 STDMETHODIMP VLCMessageIterator::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1188 if( NULL == ppTInfo )
1189 return E_INVALIDARG;
1191 if( SUCCEEDED(loadTypeInfo()) )
1193 _p_typeinfo->AddRef();
1194 *ppTInfo = _p_typeinfo;
1201 STDMETHODIMP VLCMessageIterator::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1202 UINT cNames, LCID lcid, DISPID* rgDispID)
1204 if( SUCCEEDED(loadTypeInfo()) )
1206 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1211 STDMETHODIMP VLCMessageIterator::Invoke(DISPID dispIdMember, REFIID riid,
1212 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1213 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1215 if( SUCCEEDED(loadTypeInfo()) )
1217 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1218 pVarResult, pExcepInfo, puArgErr);
1223 STDMETHODIMP VLCMessageIterator::get_hasNext(VARIANT_BOOL* hasNext)
1225 if( NULL == hasNext )
1228 if( _p_iter && _p_vlclog->_p_log )
1230 libvlc_exception_t ex;
1231 libvlc_exception_init(&ex);
1233 *hasNext = libvlc_log_iterator_has_next(_p_iter, &ex) ?
1234 VARIANT_TRUE : VARIANT_FALSE;
1235 if( libvlc_exception_raised(&ex) )
1237 _p_instance->setErrorInfo(IID_IVLCMessageIterator,
1238 libvlc_exception_get_message(&ex));
1239 libvlc_exception_clear(&ex);
1245 *hasNext = VARIANT_FALSE;
1250 STDMETHODIMP VLCMessageIterator::next(IVLCMessage** message)
1252 if( NULL == message )
1255 if( _p_iter && _p_vlclog->_p_log )
1257 struct libvlc_log_message_t buffer;
1259 buffer.sizeof_msg = sizeof(buffer);
1261 libvlc_exception_t ex;
1262 libvlc_exception_init(&ex);
1264 libvlc_log_iterator_next(_p_iter, &buffer, &ex);
1265 if( libvlc_exception_raised(&ex) )
1267 _p_instance->setErrorInfo(IID_IVLCMessageIterator,
1268 libvlc_exception_get_message(&ex));
1269 libvlc_exception_clear(&ex);
1272 *message = new VLCMessage(_p_instance, buffer);
1273 return *message ? NOERROR : E_OUTOFMEMORY;
1278 /*******************************************************************************/
1280 VLCMessage::~VLCMessage()
1283 _p_typeinfo->Release();
1286 HRESULT VLCMessage::loadTypeInfo(void)
1288 HRESULT hr = NOERROR;
1289 if( NULL == _p_typeinfo )
1291 ITypeLib *p_typelib;
1293 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1296 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessage, &_p_typeinfo);
1301 p_typelib->Release();
1307 STDMETHODIMP VLCMessage::GetTypeInfoCount(UINT* pctInfo)
1309 if( NULL == pctInfo )
1310 return E_INVALIDARG;
1312 if( SUCCEEDED(loadTypeInfo()) )
1320 STDMETHODIMP VLCMessage::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1322 if( NULL == ppTInfo )
1323 return E_INVALIDARG;
1325 if( SUCCEEDED(loadTypeInfo()) )
1327 _p_typeinfo->AddRef();
1328 *ppTInfo = _p_typeinfo;
1335 STDMETHODIMP VLCMessage::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1336 UINT cNames, LCID lcid, DISPID* rgDispID)
1338 if( SUCCEEDED(loadTypeInfo()) )
1340 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1345 STDMETHODIMP VLCMessage::Invoke(DISPID dispIdMember, REFIID riid,
1346 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1347 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1349 if( SUCCEEDED(loadTypeInfo()) )
1351 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1352 pVarResult, pExcepInfo, puArgErr);
1357 inline const char *msgSeverity(int sev)
1372 STDMETHODIMP VLCMessage::get__Value(VARIANT* _Value)
1374 if( NULL == _Value )
1379 snprintf(buffer, sizeof(buffer), "%s %s %s: %s",
1380 _msg.psz_type, _msg.psz_name, msgSeverity(_msg.i_severity), _msg.psz_message);
1382 V_VT(_Value) = VT_BSTR;
1383 V_BSTR(_Value) = BSTRFromCStr(CP_UTF8, buffer);
1388 STDMETHODIMP VLCMessage::get_severity(long* level)
1393 *level = _msg.i_severity;
1398 STDMETHODIMP VLCMessage::get_type(BSTR* type)
1403 *type = BSTRFromCStr(CP_UTF8, _msg.psz_type);
1408 STDMETHODIMP VLCMessage::get_name(BSTR* name)
1413 *name = BSTRFromCStr(CP_UTF8, _msg.psz_name);
1418 STDMETHODIMP VLCMessage::get_header(BSTR* header)
1420 if( NULL == header )
1423 *header = BSTRFromCStr(CP_UTF8, _msg.psz_header);
1428 STDMETHODIMP VLCMessage::get_message(BSTR* message)
1430 if( NULL == message )
1433 *message = BSTRFromCStr(CP_UTF8, _msg.psz_message);
1438 /*******************************************************************************/
1440 VLCPlaylistItems::~VLCPlaylistItems()
1443 _p_typeinfo->Release();
1446 HRESULT VLCPlaylistItems::loadTypeInfo(void)
1448 HRESULT hr = NOERROR;
1449 if( NULL == _p_typeinfo )
1451 ITypeLib *p_typelib;
1453 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1456 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCPlaylistItems, &_p_typeinfo);
1461 p_typelib->Release();
1467 STDMETHODIMP VLCPlaylistItems::GetTypeInfoCount(UINT* pctInfo)
1469 if( NULL == pctInfo )
1470 return E_INVALIDARG;
1472 if( SUCCEEDED(loadTypeInfo()) )
1480 STDMETHODIMP VLCPlaylistItems::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1482 if( NULL == ppTInfo )
1483 return E_INVALIDARG;
1485 if( SUCCEEDED(loadTypeInfo()) )
1487 _p_typeinfo->AddRef();
1488 *ppTInfo = _p_typeinfo;
1495 STDMETHODIMP VLCPlaylistItems::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1496 UINT cNames, LCID lcid, DISPID* rgDispID)
1498 if( SUCCEEDED(loadTypeInfo()) )
1500 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1505 STDMETHODIMP VLCPlaylistItems::Invoke(DISPID dispIdMember, REFIID riid,
1506 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1507 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1509 if( SUCCEEDED(loadTypeInfo()) )
1511 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1512 pVarResult, pExcepInfo, puArgErr);
1517 STDMETHODIMP VLCPlaylistItems::get_count(long* count)
1522 libvlc_instance_t* p_libvlc;
1523 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1526 libvlc_exception_t ex;
1527 libvlc_exception_init(&ex);
1529 libvlc_playlist_lock(p_libvlc);
1530 *count = libvlc_playlist_items_count(p_libvlc, &ex);
1531 libvlc_playlist_unlock(p_libvlc);
1532 if( libvlc_exception_raised(&ex) )
1534 _p_instance->setErrorInfo(IID_IVLCPlaylistItems,
1535 libvlc_exception_get_message(&ex));
1536 libvlc_exception_clear(&ex);
1544 STDMETHODIMP VLCPlaylistItems::clear()
1546 libvlc_instance_t* p_libvlc;
1547 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1550 libvlc_exception_t ex;
1551 libvlc_exception_init(&ex);
1553 libvlc_playlist_clear(p_libvlc, &ex);
1554 if( libvlc_exception_raised(&ex) )
1556 _p_instance->setErrorInfo(IID_IVLCPlaylistItems,
1557 libvlc_exception_get_message(&ex));
1558 libvlc_exception_clear(&ex);
1566 STDMETHODIMP VLCPlaylistItems::remove(long item)
1568 libvlc_instance_t* p_libvlc;
1569 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1572 libvlc_exception_t ex;
1573 libvlc_exception_init(&ex);
1575 libvlc_playlist_delete_item(p_libvlc, item, &ex);
1576 if( libvlc_exception_raised(&ex) )
1578 _p_instance->setErrorInfo(IID_IVLCPlaylistItems,
1579 libvlc_exception_get_message(&ex));
1580 libvlc_exception_clear(&ex);
1588 /*******************************************************************************/
1590 VLCPlaylist::~VLCPlaylist()
1592 delete _p_vlcplaylistitems;
1594 _p_typeinfo->Release();
1597 HRESULT VLCPlaylist::loadTypeInfo(void)
1599 HRESULT hr = NOERROR;
1600 if( NULL == _p_typeinfo )
1602 ITypeLib *p_typelib;
1604 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1607 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCPlaylist, &_p_typeinfo);
1612 p_typelib->Release();
1618 STDMETHODIMP VLCPlaylist::GetTypeInfoCount(UINT* pctInfo)
1620 if( NULL == pctInfo )
1621 return E_INVALIDARG;
1623 if( SUCCEEDED(loadTypeInfo()) )
1631 STDMETHODIMP VLCPlaylist::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1633 if( NULL == ppTInfo )
1634 return E_INVALIDARG;
1636 if( SUCCEEDED(loadTypeInfo()) )
1638 _p_typeinfo->AddRef();
1639 *ppTInfo = _p_typeinfo;
1646 STDMETHODIMP VLCPlaylist::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1647 UINT cNames, LCID lcid, DISPID* rgDispID)
1649 if( SUCCEEDED(loadTypeInfo()) )
1651 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1656 STDMETHODIMP VLCPlaylist::Invoke(DISPID dispIdMember, REFIID riid,
1657 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1658 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1660 if( SUCCEEDED(loadTypeInfo()) )
1662 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1663 pVarResult, pExcepInfo, puArgErr);
1668 STDMETHODIMP VLCPlaylist::get_itemCount(long* count)
1674 libvlc_instance_t* p_libvlc;
1675 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1678 libvlc_exception_t ex;
1679 libvlc_exception_init(&ex);
1681 libvlc_playlist_lock(p_libvlc);
1682 *count = libvlc_playlist_items_count(p_libvlc, &ex);
1683 libvlc_playlist_unlock(p_libvlc);
1684 if( libvlc_exception_raised(&ex) )
1686 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1687 libvlc_exception_get_message(&ex));
1688 libvlc_exception_clear(&ex);
1696 STDMETHODIMP VLCPlaylist::get_isPlaying(VARIANT_BOOL* isPlaying)
1698 if( NULL == isPlaying )
1701 libvlc_instance_t* p_libvlc;
1702 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1705 libvlc_exception_t ex;
1706 libvlc_exception_init(&ex);
1708 *isPlaying = libvlc_playlist_isplaying(p_libvlc, &ex) ?
1709 VARIANT_TRUE: VARIANT_FALSE;
1710 if( libvlc_exception_raised(&ex) )
1712 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1713 libvlc_exception_get_message(&ex));
1714 libvlc_exception_clear(&ex);
1722 STDMETHODIMP VLCPlaylist::add(BSTR uri, VARIANT name, VARIANT options, long* item)
1727 if( 0 == SysStringLen(uri) )
1728 return E_INVALIDARG;
1730 libvlc_instance_t* p_libvlc;
1731 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1734 libvlc_exception_t ex;
1735 libvlc_exception_init(&ex);
1737 char *psz_uri = NULL;
1738 if( SysStringLen(_p_instance->getBaseURL()) > 0 )
1741 ** if the MRL a relative URL, we should end up with an absolute URL
1743 LPWSTR abs_url = CombineURL(_p_instance->getBaseURL(), uri);
1744 if( NULL != abs_url )
1746 psz_uri = CStrFromWSTR(CP_UTF8, abs_url, wcslen(abs_url));
1747 CoTaskMemFree(abs_url);
1751 psz_uri = CStrFromBSTR(CP_UTF8, uri);
1757 ** baseURL is empty, assume MRL is absolute
1759 psz_uri = CStrFromBSTR(CP_UTF8, uri);
1762 if( NULL == psz_uri )
1764 return E_OUTOFMEMORY;
1768 char **ppsz_options;
1770 hr = VLCControl::CreateTargetOptions(CP_UTF8, &options, &ppsz_options, &i_options);
1773 CoTaskMemFree(psz_uri);
1777 char *psz_name = NULL;
1779 VariantInit(&v_name);
1780 if( SUCCEEDED(VariantChangeType(&v_name, &name, 0, VT_BSTR)) )
1782 if( SysStringLen(V_BSTR(&v_name)) > 0 )
1783 psz_name = CStrFromBSTR(CP_UTF8, V_BSTR(&v_name));
1785 VariantClear(&v_name);
1788 *item = libvlc_playlist_add_extended(p_libvlc,
1792 const_cast<const char **>(ppsz_options),
1795 VLCControl::FreeTargetOptions(ppsz_options, i_options);
1796 CoTaskMemFree(psz_uri);
1798 CoTaskMemFree(psz_name);
1799 if( libvlc_exception_raised(&ex) )
1801 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1802 libvlc_exception_get_message(&ex));
1803 libvlc_exception_clear(&ex);
1811 STDMETHODIMP VLCPlaylist::play()
1813 libvlc_instance_t* p_libvlc;
1814 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1817 libvlc_exception_t ex;
1818 libvlc_exception_init(&ex);
1820 libvlc_playlist_play(p_libvlc, -1, 0, NULL, &ex);
1821 if( libvlc_exception_raised(&ex) )
1823 libvlc_exception_clear(&ex);
1831 STDMETHODIMP VLCPlaylist::playItem(long item)
1833 libvlc_instance_t* p_libvlc;
1834 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1837 libvlc_exception_t ex;
1838 libvlc_exception_init(&ex);
1840 libvlc_playlist_play(p_libvlc, item, 0, NULL, &ex);
1841 if( libvlc_exception_raised(&ex) )
1843 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1844 libvlc_exception_get_message(&ex));
1845 libvlc_exception_clear(&ex);
1853 STDMETHODIMP VLCPlaylist::togglePause()
1855 libvlc_instance_t* p_libvlc;
1856 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1859 libvlc_exception_t ex;
1860 libvlc_exception_init(&ex);
1862 libvlc_playlist_pause(p_libvlc, &ex);
1863 if( libvlc_exception_raised(&ex) )
1865 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1866 libvlc_exception_get_message(&ex));
1867 libvlc_exception_clear(&ex);
1875 STDMETHODIMP VLCPlaylist::stop()
1877 libvlc_instance_t* p_libvlc;
1878 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1881 libvlc_exception_t ex;
1882 libvlc_exception_init(&ex);
1884 libvlc_playlist_stop(p_libvlc, &ex);
1885 if( libvlc_exception_raised(&ex) )
1887 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1888 libvlc_exception_get_message(&ex));
1889 libvlc_exception_clear(&ex);
1897 STDMETHODIMP VLCPlaylist::next()
1899 libvlc_instance_t* p_libvlc;
1900 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1903 libvlc_exception_t ex;
1904 libvlc_exception_init(&ex);
1906 libvlc_playlist_next(p_libvlc, &ex);
1907 if( libvlc_exception_raised(&ex) )
1909 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1910 libvlc_exception_get_message(&ex));
1911 libvlc_exception_clear(&ex);
1919 STDMETHODIMP VLCPlaylist::prev()
1921 libvlc_instance_t* p_libvlc;
1922 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1925 libvlc_exception_t ex;
1926 libvlc_exception_init(&ex);
1928 libvlc_playlist_prev(p_libvlc, &ex);
1929 if( libvlc_exception_raised(&ex) )
1931 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1932 libvlc_exception_get_message(&ex));
1933 libvlc_exception_clear(&ex);
1941 STDMETHODIMP VLCPlaylist::clear()
1943 libvlc_instance_t* p_libvlc;
1944 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1947 libvlc_exception_t ex;
1948 libvlc_exception_init(&ex);
1950 libvlc_playlist_clear(p_libvlc, &ex);
1951 if( libvlc_exception_raised(&ex) )
1953 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1954 libvlc_exception_get_message(&ex));
1955 libvlc_exception_clear(&ex);
1963 STDMETHODIMP VLCPlaylist::removeItem(long item)
1965 libvlc_instance_t* p_libvlc;
1966 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1969 libvlc_exception_t ex;
1970 libvlc_exception_init(&ex);
1972 libvlc_playlist_delete_item(p_libvlc, item, &ex);
1973 if( libvlc_exception_raised(&ex) )
1975 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1976 libvlc_exception_get_message(&ex));
1977 libvlc_exception_clear(&ex);
1985 STDMETHODIMP VLCPlaylist::get_items(IVLCPlaylistItems** obj)
1990 *obj = _p_vlcplaylistitems;
1991 if( NULL != _p_vlcplaylistitems )
1993 _p_vlcplaylistitems->AddRef();
1996 return E_OUTOFMEMORY;
1999 /*******************************************************************************/
2001 VLCVideo::~VLCVideo()
2004 _p_typeinfo->Release();
2007 HRESULT VLCVideo::loadTypeInfo(void)
2009 HRESULT hr = NOERROR;
2010 if( NULL == _p_typeinfo )
2012 ITypeLib *p_typelib;
2014 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
2017 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCVideo, &_p_typeinfo);
2022 p_typelib->Release();
2028 STDMETHODIMP VLCVideo::GetTypeInfoCount(UINT* pctInfo)
2030 if( NULL == pctInfo )
2031 return E_INVALIDARG;
2033 if( SUCCEEDED(loadTypeInfo()) )
2041 STDMETHODIMP VLCVideo::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
2043 if( NULL == ppTInfo )
2044 return E_INVALIDARG;
2046 if( SUCCEEDED(loadTypeInfo()) )
2048 _p_typeinfo->AddRef();
2049 *ppTInfo = _p_typeinfo;
2056 STDMETHODIMP VLCVideo::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
2057 UINT cNames, LCID lcid, DISPID* rgDispID)
2059 if( SUCCEEDED(loadTypeInfo()) )
2061 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
2066 STDMETHODIMP VLCVideo::Invoke(DISPID dispIdMember, REFIID riid,
2067 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
2068 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
2070 if( SUCCEEDED(loadTypeInfo()) )
2072 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
2073 pVarResult, pExcepInfo, puArgErr);
2078 STDMETHODIMP VLCVideo::get_fullscreen(VARIANT_BOOL* fullscreen)
2080 if( NULL == fullscreen )
2083 libvlc_instance_t* p_libvlc;
2084 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2087 libvlc_exception_t ex;
2088 libvlc_exception_init(&ex);
2090 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2091 if( ! libvlc_exception_raised(&ex) )
2093 *fullscreen = libvlc_get_fullscreen(p_md, &ex) ? VARIANT_TRUE : VARIANT_FALSE;
2094 libvlc_media_player_release(p_md);
2095 if( ! libvlc_exception_raised(&ex) )
2100 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2101 libvlc_exception_clear(&ex);
2107 STDMETHODIMP VLCVideo::put_fullscreen(VARIANT_BOOL fullscreen)
2109 libvlc_instance_t* p_libvlc;
2110 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2113 libvlc_exception_t ex;
2114 libvlc_exception_init(&ex);
2116 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2117 if( ! libvlc_exception_raised(&ex) )
2119 libvlc_set_fullscreen(p_md, VARIANT_FALSE != fullscreen, &ex);
2120 libvlc_media_player_release(p_md);
2121 if( ! libvlc_exception_raised(&ex) )
2126 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2127 libvlc_exception_clear(&ex);
2133 STDMETHODIMP VLCVideo::get_width(long* width)
2138 libvlc_instance_t* p_libvlc;
2139 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2142 libvlc_exception_t ex;
2143 libvlc_exception_init(&ex);
2145 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2146 if( ! libvlc_exception_raised(&ex) )
2148 *width = libvlc_video_get_width(p_md, &ex);
2149 libvlc_media_player_release(p_md);
2150 if( ! libvlc_exception_raised(&ex) )
2155 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2156 libvlc_exception_clear(&ex);
2162 STDMETHODIMP VLCVideo::get_height(long* height)
2164 if( NULL == height )
2167 libvlc_instance_t* p_libvlc;
2168 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2171 libvlc_exception_t ex;
2172 libvlc_exception_init(&ex);
2174 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2175 if( ! libvlc_exception_raised(&ex) )
2177 *height = libvlc_video_get_height(p_md, &ex);
2178 libvlc_media_player_release(p_md);
2179 if( ! libvlc_exception_raised(&ex) )
2184 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2185 libvlc_exception_clear(&ex);
2191 STDMETHODIMP VLCVideo::get_aspectRatio(BSTR* aspect)
2193 if( NULL == aspect )
2196 libvlc_instance_t* p_libvlc;
2197 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2200 libvlc_exception_t ex;
2201 libvlc_exception_init(&ex);
2203 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2204 if( ! libvlc_exception_raised(&ex) )
2206 char *psz_aspect = libvlc_video_get_aspect_ratio(p_md, &ex);
2208 libvlc_media_player_release(p_md);
2209 if( ! libvlc_exception_raised(&ex) )
2211 if( NULL == psz_aspect )
2212 return E_OUTOFMEMORY;
2214 *aspect = BSTRFromCStr(CP_UTF8, psz_aspect);
2217 return (NULL == *aspect) ? E_OUTOFMEMORY : NOERROR;
2222 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2223 libvlc_exception_clear(&ex);
2229 STDMETHODIMP VLCVideo::put_aspectRatio(BSTR aspect)
2231 if( NULL == aspect )
2234 if( 0 == SysStringLen(aspect) )
2235 return E_INVALIDARG;
2237 libvlc_instance_t* p_libvlc;
2238 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2241 libvlc_exception_t ex;
2242 libvlc_exception_init(&ex);
2244 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2245 if( ! libvlc_exception_raised(&ex) )
2247 char *psz_aspect = CStrFromBSTR(CP_UTF8, aspect);
2248 if( NULL == psz_aspect )
2250 return E_OUTOFMEMORY;
2253 libvlc_video_set_aspect_ratio(p_md, psz_aspect, &ex);
2255 CoTaskMemFree(psz_aspect);
2256 libvlc_media_player_release(p_md);
2257 if( libvlc_exception_raised(&ex) )
2259 _p_instance->setErrorInfo(IID_IVLCVideo,
2260 libvlc_exception_get_message(&ex));
2261 libvlc_exception_clear(&ex);
2270 STDMETHODIMP VLCVideo::get_subtitle(long* spu)
2275 libvlc_instance_t* p_libvlc;
2276 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2279 libvlc_exception_t ex;
2280 libvlc_exception_init(&ex);
2282 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2283 if( ! libvlc_exception_raised(&ex) )
2285 *spu = libvlc_video_get_spu(p_md, &ex);
2286 libvlc_media_player_release(p_md);
2287 if( ! libvlc_exception_raised(&ex) )
2292 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2293 libvlc_exception_clear(&ex);
2299 STDMETHODIMP VLCVideo::put_subtitle(long spu)
2301 libvlc_instance_t* p_libvlc;
2302 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2305 libvlc_exception_t ex;
2306 libvlc_exception_init(&ex);
2308 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2309 libvlc_video_set_spu(p_md, spu, &ex);
2310 libvlc_media_player_release(p_md);
2311 if( libvlc_exception_raised(&ex) )
2313 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2314 libvlc_exception_clear(&ex);
2322 STDMETHODIMP VLCVideo::get_crop(BSTR* geometry)
2324 if( NULL == geometry )
2327 libvlc_instance_t* p_libvlc;
2328 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2331 libvlc_exception_t ex;
2332 libvlc_exception_init(&ex);
2334 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2335 if( ! libvlc_exception_raised(&ex) )
2337 char *psz_geometry = libvlc_video_get_crop_geometry(p_md, &ex);
2339 libvlc_media_player_release(p_md);
2340 if( ! libvlc_exception_raised(&ex) )
2342 if( NULL == psz_geometry )
2343 return E_OUTOFMEMORY;
2345 *geometry = BSTRFromCStr(CP_UTF8, psz_geometry);
2346 free( psz_geometry );
2347 psz_geometry = NULL;
2348 return (NULL == geometry) ? E_OUTOFMEMORY : NOERROR;
2350 free( psz_geometry );
2351 psz_geometry = NULL;
2353 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2354 libvlc_exception_clear(&ex);
2360 STDMETHODIMP VLCVideo::put_crop(BSTR geometry)
2362 if( NULL == geometry )
2365 if( 0 == SysStringLen(geometry) )
2366 return E_INVALIDARG;
2368 libvlc_instance_t* p_libvlc;
2369 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2372 libvlc_exception_t ex;
2373 libvlc_exception_init(&ex);
2375 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2376 if( ! libvlc_exception_raised(&ex) )
2378 char *psz_geometry = CStrFromBSTR(CP_UTF8, geometry);
2379 if( NULL == psz_geometry )
2381 return E_OUTOFMEMORY;
2384 libvlc_video_set_crop_geometry(p_md, psz_geometry, &ex);
2386 CoTaskMemFree(psz_geometry);
2387 libvlc_media_player_release(p_md);
2388 if( libvlc_exception_raised(&ex) )
2390 _p_instance->setErrorInfo(IID_IVLCVideo,
2391 libvlc_exception_get_message(&ex));
2392 libvlc_exception_clear(&ex);
2401 STDMETHODIMP VLCVideo::get_teletext(long* page)
2406 libvlc_instance_t* p_libvlc;
2407 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2410 libvlc_exception_t ex;
2411 libvlc_exception_init(&ex);
2413 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2414 if( ! libvlc_exception_raised(&ex) )
2416 *page = libvlc_video_get_teletext(p_md, &ex);
2417 libvlc_media_player_release(p_md);
2418 if( ! libvlc_exception_raised(&ex) )
2423 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2424 libvlc_exception_clear(&ex);
2430 STDMETHODIMP VLCVideo::put_teletext(long page)
2432 libvlc_instance_t* p_libvlc;
2433 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2436 libvlc_exception_t ex;
2437 libvlc_exception_init(&ex);
2439 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2440 libvlc_video_set_teletext(p_md, page, &ex);
2441 libvlc_media_player_release(p_md);
2442 if( libvlc_exception_raised(&ex) )
2444 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2445 libvlc_exception_clear(&ex);
2453 STDMETHODIMP VLCVideo::takeSnapshot(LPPICTUREDISP* picture)
2455 if( NULL == picture )
2458 libvlc_instance_t* p_libvlc;
2459 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2462 libvlc_exception_t ex;
2463 libvlc_exception_init(&ex);
2465 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2466 if( ! libvlc_exception_raised(&ex) )
2468 static int uniqueId = 0;
2469 TCHAR path[MAX_PATH+1];
2471 int pathlen = GetTempPath(MAX_PATH-24, path);
2472 if( (0 == pathlen) || (pathlen > (MAX_PATH-24)) )
2475 /* check temp directory path by openning it */
2477 HANDLE dirHandle = CreateFile(path,
2479 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
2482 FILE_FLAG_BACKUP_SEMANTICS, NULL);
2483 if( INVALID_HANDLE_VALUE == dirHandle )
2485 _p_instance->setErrorInfo(IID_IVLCVideo,
2486 "Invalid temporary directory for snapshot images, check values of TMP, TEMP envars.");
2491 BY_HANDLE_FILE_INFORMATION bhfi;
2492 BOOL res = GetFileInformationByHandle(dirHandle, &bhfi);
2493 CloseHandle(dirHandle);
2494 if( !res || !(bhfi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
2496 _p_instance->setErrorInfo(IID_IVLCVideo,
2497 "Invalid temporary directory for snapshot images, check values of TMP, TEMP envars.");
2503 TCHAR filepath[MAX_PATH+1];
2505 _stprintf(filepath, TEXT("%sAXVLC%lXS%lX.bmp"),
2506 path, GetCurrentProcessId(), ++uniqueId);
2509 /* reuse path storage for UTF8 string */
2510 char *psz_filepath = (char *)path;
2511 WCHAR* wpath = filepath;
2513 char *psz_filepath = path;
2514 /* first convert to unicode using current code page */
2515 WCHAR wpath[MAX_PATH+1];
2516 if( 0 == MultiByteToWideChar(CP_ACP, 0, filepath, -1, wpath, sizeof(wpath)/sizeof(WCHAR)) )
2519 /* convert to UTF8 */
2520 pathlen = WideCharToMultiByte(CP_UTF8, 0, wpath, -1, psz_filepath, sizeof(path), NULL, NULL);
2521 // fail if path is 0 or too short (i.e pathlen is the same as storage size)
2522 if( (0 == pathlen) || (sizeof(path) == pathlen) )
2525 /* take snapshot into file */
2526 libvlc_video_take_snapshot(p_md, psz_filepath, 0, 0, &ex);
2527 libvlc_media_player_release(p_md);
2528 if( ! libvlc_exception_raised(&ex) )
2531 /* open snapshot file */
2532 HANDLE snapPic = LoadImage(NULL, filepath, IMAGE_BITMAP,0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
2537 snapDesc.cbSizeofstruct = sizeof(PICTDESC);
2538 snapDesc.picType = PICTYPE_BITMAP;
2539 snapDesc.bmp.hbitmap = (HBITMAP)snapPic;
2540 snapDesc.bmp.hpal = NULL;
2542 hr = OleCreatePictureIndirect(&snapDesc, IID_IPictureDisp, TRUE, (LPVOID*)picture);
2546 DeleteObject(snapPic);
2549 DeleteFile(filepath);
2553 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2554 libvlc_exception_clear(&ex);
2560 STDMETHODIMP VLCVideo::toggleFullscreen()
2562 libvlc_instance_t* p_libvlc;
2563 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2566 libvlc_exception_t ex;
2567 libvlc_exception_init(&ex);
2569 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2570 if( ! libvlc_exception_raised(&ex) )
2572 libvlc_toggle_fullscreen(p_md, &ex);
2573 libvlc_media_player_release(p_md);
2574 if( ! libvlc_exception_raised(&ex) )
2579 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2580 libvlc_exception_clear(&ex);
2586 STDMETHODIMP VLCVideo::toggleTeletext()
2588 libvlc_instance_t* p_libvlc;
2589 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2592 libvlc_exception_t ex;
2593 libvlc_exception_init(&ex);
2595 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2596 if( ! libvlc_exception_raised(&ex) )
2598 libvlc_toggle_teletext(p_md, &ex);
2599 libvlc_media_player_release(p_md);
2600 if( ! libvlc_exception_raised(&ex) )
2605 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2606 libvlc_exception_clear(&ex);
2612 /*******************************************************************************/
2614 VLCControl2::VLCControl2(VLCPlugin *p_instance) :
2615 _p_instance(p_instance),
2619 _p_vlcplaylist(NULL),
2622 _p_vlcaudio = new VLCAudio(p_instance);
2623 _p_vlcinput = new VLCInput(p_instance);
2624 _p_vlclog = new VLCLog(p_instance);
2625 _p_vlcplaylist = new VLCPlaylist(p_instance);
2626 _p_vlcvideo = new VLCVideo(p_instance);
2629 VLCControl2::~VLCControl2()
2632 delete _p_vlcplaylist;
2637 _p_typeinfo->Release();
2640 HRESULT VLCControl2::loadTypeInfo(void)
2642 HRESULT hr = NOERROR;
2643 if( NULL == _p_typeinfo )
2645 ITypeLib *p_typelib;
2647 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
2650 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCControl2, &_p_typeinfo);
2655 p_typelib->Release();
2661 STDMETHODIMP VLCControl2::GetTypeInfoCount(UINT* pctInfo)
2663 if( NULL == pctInfo )
2664 return E_INVALIDARG;
2666 if( SUCCEEDED(loadTypeInfo()) )
2674 STDMETHODIMP VLCControl2::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
2676 if( NULL == ppTInfo )
2677 return E_INVALIDARG;
2679 if( SUCCEEDED(loadTypeInfo()) )
2681 _p_typeinfo->AddRef();
2682 *ppTInfo = _p_typeinfo;
2689 STDMETHODIMP VLCControl2::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
2690 UINT cNames, LCID lcid, DISPID* rgDispID)
2692 if( SUCCEEDED(loadTypeInfo()) )
2694 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
2699 STDMETHODIMP VLCControl2::Invoke(DISPID dispIdMember, REFIID riid,
2700 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
2701 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
2703 if( SUCCEEDED(loadTypeInfo()) )
2705 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
2706 pVarResult, pExcepInfo, puArgErr);
2711 STDMETHODIMP VLCControl2::get_AutoLoop(VARIANT_BOOL *autoloop)
2713 if( NULL == autoloop )
2716 *autoloop = _p_instance->getAutoLoop() ? VARIANT_TRUE: VARIANT_FALSE;
2720 STDMETHODIMP VLCControl2::put_AutoLoop(VARIANT_BOOL autoloop)
2722 _p_instance->setAutoLoop((VARIANT_FALSE != autoloop) ? TRUE: FALSE);
2726 STDMETHODIMP VLCControl2::get_AutoPlay(VARIANT_BOOL *autoplay)
2728 if( NULL == autoplay )
2731 *autoplay = _p_instance->getAutoPlay() ? VARIANT_TRUE: VARIANT_FALSE;
2735 STDMETHODIMP VLCControl2::put_AutoPlay(VARIANT_BOOL autoplay)
2737 _p_instance->setAutoPlay((VARIANT_FALSE != autoplay) ? TRUE: FALSE);
2741 STDMETHODIMP VLCControl2::get_BaseURL(BSTR *url)
2746 *url = SysAllocStringLen(_p_instance->getBaseURL(),
2747 SysStringLen(_p_instance->getBaseURL()));
2751 STDMETHODIMP VLCControl2::put_BaseURL(BSTR mrl)
2753 _p_instance->setBaseURL(mrl);
2758 STDMETHODIMP VLCControl2::get_MRL(BSTR *mrl)
2763 *mrl = SysAllocStringLen(_p_instance->getMRL(),
2764 SysStringLen(_p_instance->getMRL()));
2768 STDMETHODIMP VLCControl2::put_MRL(BSTR mrl)
2770 _p_instance->setMRL(mrl);
2776 STDMETHODIMP VLCControl2::get_Toolbar(VARIANT_BOOL *visible)
2778 if( NULL == visible )
2782 * Note to developpers
2784 * Returning the _b_toolbar is closer to the method specification.
2785 * But returning True when toolbar is not implemented so not displayed
2786 * could be bad for ActiveX users which rely on this value to show their
2787 * own toolbar if not provided by the ActiveX.
2789 * This is the reason why FALSE is returned, until toolbar get implemented.
2792 /* DISABLED for now */
2793 // *visible = _p_instance->getShowToolbar() ? VARIANT_TRUE: VARIANT_FALSE;
2795 *visible = VARIANT_FALSE;
2800 STDMETHODIMP VLCControl2::put_Toolbar(VARIANT_BOOL visible)
2802 _p_instance->setShowToolbar((VARIANT_FALSE != visible) ? TRUE: FALSE);
2807 STDMETHODIMP VLCControl2::get_StartTime(long *seconds)
2809 if( NULL == seconds )
2812 *seconds = _p_instance->getStartTime();
2817 STDMETHODIMP VLCControl2::put_StartTime(long seconds)
2819 _p_instance->setStartTime(seconds);
2824 STDMETHODIMP VLCControl2::get_VersionInfo(BSTR *version)
2826 if( NULL == version )
2829 const char *versionStr = libvlc_get_version();
2830 if( NULL != versionStr )
2832 *version = BSTRFromCStr(CP_UTF8, versionStr);
2834 return (NULL == *version) ? E_OUTOFMEMORY : NOERROR;
2840 STDMETHODIMP VLCControl2::get_Visible(VARIANT_BOOL *isVisible)
2842 if( NULL == isVisible )
2845 *isVisible = _p_instance->getVisible() ? VARIANT_TRUE : VARIANT_FALSE;
2850 STDMETHODIMP VLCControl2::put_Visible(VARIANT_BOOL isVisible)
2852 _p_instance->setVisible(isVisible != VARIANT_FALSE);
2857 STDMETHODIMP VLCControl2::get_Volume(long *volume)
2859 if( NULL == volume )
2862 *volume = _p_instance->getVolume();
2866 STDMETHODIMP VLCControl2::put_Volume(long volume)
2868 _p_instance->setVolume(volume);
2872 STDMETHODIMP VLCControl2::get_BackColor(OLE_COLOR *backcolor)
2874 if( NULL == backcolor )
2877 *backcolor = _p_instance->getBackColor();
2881 STDMETHODIMP VLCControl2::put_BackColor(OLE_COLOR backcolor)
2883 _p_instance->setBackColor(backcolor);
2887 STDMETHODIMP VLCControl2::get_audio(IVLCAudio** obj)
2893 if( NULL != _p_vlcaudio )
2895 _p_vlcaudio->AddRef();
2898 return E_OUTOFMEMORY;
2901 STDMETHODIMP VLCControl2::get_input(IVLCInput** obj)
2907 if( NULL != _p_vlcinput )
2909 _p_vlcinput->AddRef();
2912 return E_OUTOFMEMORY;
2915 STDMETHODIMP VLCControl2::get_log(IVLCLog** obj)
2921 if( NULL != _p_vlclog )
2923 _p_vlclog->AddRef();
2926 return E_OUTOFMEMORY;
2929 STDMETHODIMP VLCControl2::get_playlist(IVLCPlaylist** obj)
2934 *obj = _p_vlcplaylist;
2935 if( NULL != _p_vlcplaylist )
2937 _p_vlcplaylist->AddRef();
2940 return E_OUTOFMEMORY;
2943 STDMETHODIMP VLCControl2::get_video(IVLCVideo** obj)
2949 if( NULL != _p_vlcvideo )
2951 _p_vlcvideo->AddRef();
2954 return E_OUTOFMEMORY;