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 libvlc_playlist_lock( p_libvlc );
1710 *isPlaying = libvlc_playlist_isplaying(p_libvlc, &ex) ?
1711 VARIANT_TRUE: VARIANT_FALSE;
1712 if( libvlc_exception_raised(&ex) )
1714 libvlc_playlist_unlock( p_libvlc );
1715 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1716 libvlc_exception_get_message(&ex));
1717 libvlc_exception_clear(&ex);
1720 libvlc_playlist_unlock( p_libvlc );
1726 STDMETHODIMP VLCPlaylist::add(BSTR uri, VARIANT name, VARIANT options, long* item)
1731 if( 0 == SysStringLen(uri) )
1732 return E_INVALIDARG;
1734 libvlc_instance_t* p_libvlc;
1735 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1738 libvlc_exception_t ex;
1739 libvlc_exception_init(&ex);
1741 char *psz_uri = NULL;
1742 if( SysStringLen(_p_instance->getBaseURL()) > 0 )
1745 ** if the MRL a relative URL, we should end up with an absolute URL
1747 LPWSTR abs_url = CombineURL(_p_instance->getBaseURL(), uri);
1748 if( NULL != abs_url )
1750 psz_uri = CStrFromWSTR(CP_UTF8, abs_url, wcslen(abs_url));
1751 CoTaskMemFree(abs_url);
1755 psz_uri = CStrFromBSTR(CP_UTF8, uri);
1761 ** baseURL is empty, assume MRL is absolute
1763 psz_uri = CStrFromBSTR(CP_UTF8, uri);
1766 if( NULL == psz_uri )
1768 return E_OUTOFMEMORY;
1772 char **ppsz_options;
1774 hr = VLCControl::CreateTargetOptions(CP_UTF8, &options, &ppsz_options, &i_options);
1777 CoTaskMemFree(psz_uri);
1781 char *psz_name = NULL;
1783 VariantInit(&v_name);
1784 if( SUCCEEDED(VariantChangeType(&v_name, &name, 0, VT_BSTR)) )
1786 if( SysStringLen(V_BSTR(&v_name)) > 0 )
1787 psz_name = CStrFromBSTR(CP_UTF8, V_BSTR(&v_name));
1789 VariantClear(&v_name);
1792 *item = libvlc_playlist_add_extended(p_libvlc,
1796 const_cast<const char **>(ppsz_options),
1799 VLCControl::FreeTargetOptions(ppsz_options, i_options);
1800 CoTaskMemFree(psz_uri);
1802 CoTaskMemFree(psz_name);
1803 if( libvlc_exception_raised(&ex) )
1805 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1806 libvlc_exception_get_message(&ex));
1807 libvlc_exception_clear(&ex);
1815 STDMETHODIMP VLCPlaylist::play()
1817 libvlc_instance_t* p_libvlc;
1818 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1821 libvlc_exception_t ex;
1822 libvlc_exception_init(&ex);
1824 libvlc_playlist_play(p_libvlc, -1, 0, NULL, &ex);
1825 if( libvlc_exception_raised(&ex) )
1827 libvlc_exception_clear(&ex);
1835 STDMETHODIMP VLCPlaylist::playItem(long item)
1837 libvlc_instance_t* p_libvlc;
1838 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1841 libvlc_exception_t ex;
1842 libvlc_exception_init(&ex);
1844 libvlc_playlist_play(p_libvlc, item, 0, NULL, &ex);
1845 if( libvlc_exception_raised(&ex) )
1847 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1848 libvlc_exception_get_message(&ex));
1849 libvlc_exception_clear(&ex);
1857 STDMETHODIMP VLCPlaylist::togglePause()
1859 libvlc_instance_t* p_libvlc;
1860 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1863 libvlc_exception_t ex;
1864 libvlc_exception_init(&ex);
1866 libvlc_playlist_pause(p_libvlc, &ex);
1867 if( libvlc_exception_raised(&ex) )
1869 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1870 libvlc_exception_get_message(&ex));
1871 libvlc_exception_clear(&ex);
1879 STDMETHODIMP VLCPlaylist::stop()
1881 libvlc_instance_t* p_libvlc;
1882 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1885 libvlc_exception_t ex;
1886 libvlc_exception_init(&ex);
1888 libvlc_playlist_stop(p_libvlc, &ex);
1889 if( libvlc_exception_raised(&ex) )
1891 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1892 libvlc_exception_get_message(&ex));
1893 libvlc_exception_clear(&ex);
1901 STDMETHODIMP VLCPlaylist::next()
1903 libvlc_instance_t* p_libvlc;
1904 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1907 libvlc_exception_t ex;
1908 libvlc_exception_init(&ex);
1910 libvlc_playlist_next(p_libvlc, &ex);
1911 if( libvlc_exception_raised(&ex) )
1913 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1914 libvlc_exception_get_message(&ex));
1915 libvlc_exception_clear(&ex);
1923 STDMETHODIMP VLCPlaylist::prev()
1925 libvlc_instance_t* p_libvlc;
1926 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1929 libvlc_exception_t ex;
1930 libvlc_exception_init(&ex);
1932 libvlc_playlist_prev(p_libvlc, &ex);
1933 if( libvlc_exception_raised(&ex) )
1935 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1936 libvlc_exception_get_message(&ex));
1937 libvlc_exception_clear(&ex);
1945 STDMETHODIMP VLCPlaylist::clear()
1947 libvlc_instance_t* p_libvlc;
1948 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1951 libvlc_exception_t ex;
1952 libvlc_exception_init(&ex);
1954 libvlc_playlist_clear(p_libvlc, &ex);
1955 if( libvlc_exception_raised(&ex) )
1957 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1958 libvlc_exception_get_message(&ex));
1959 libvlc_exception_clear(&ex);
1967 STDMETHODIMP VLCPlaylist::removeItem(long item)
1969 libvlc_instance_t* p_libvlc;
1970 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1973 libvlc_exception_t ex;
1974 libvlc_exception_init(&ex);
1976 libvlc_playlist_delete_item(p_libvlc, item, &ex);
1977 if( libvlc_exception_raised(&ex) )
1979 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1980 libvlc_exception_get_message(&ex));
1981 libvlc_exception_clear(&ex);
1989 STDMETHODIMP VLCPlaylist::get_items(IVLCPlaylistItems** obj)
1994 *obj = _p_vlcplaylistitems;
1995 if( NULL != _p_vlcplaylistitems )
1997 _p_vlcplaylistitems->AddRef();
2000 return E_OUTOFMEMORY;
2003 /*******************************************************************************/
2005 VLCVideo::~VLCVideo()
2008 _p_typeinfo->Release();
2011 HRESULT VLCVideo::loadTypeInfo(void)
2013 HRESULT hr = NOERROR;
2014 if( NULL == _p_typeinfo )
2016 ITypeLib *p_typelib;
2018 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
2021 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCVideo, &_p_typeinfo);
2026 p_typelib->Release();
2032 STDMETHODIMP VLCVideo::GetTypeInfoCount(UINT* pctInfo)
2034 if( NULL == pctInfo )
2035 return E_INVALIDARG;
2037 if( SUCCEEDED(loadTypeInfo()) )
2045 STDMETHODIMP VLCVideo::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
2047 if( NULL == ppTInfo )
2048 return E_INVALIDARG;
2050 if( SUCCEEDED(loadTypeInfo()) )
2052 _p_typeinfo->AddRef();
2053 *ppTInfo = _p_typeinfo;
2060 STDMETHODIMP VLCVideo::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
2061 UINT cNames, LCID lcid, DISPID* rgDispID)
2063 if( SUCCEEDED(loadTypeInfo()) )
2065 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
2070 STDMETHODIMP VLCVideo::Invoke(DISPID dispIdMember, REFIID riid,
2071 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
2072 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
2074 if( SUCCEEDED(loadTypeInfo()) )
2076 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
2077 pVarResult, pExcepInfo, puArgErr);
2082 STDMETHODIMP VLCVideo::get_fullscreen(VARIANT_BOOL* fullscreen)
2084 if( NULL == fullscreen )
2087 libvlc_instance_t* p_libvlc;
2088 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2091 libvlc_exception_t ex;
2092 libvlc_exception_init(&ex);
2094 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2095 if( ! libvlc_exception_raised(&ex) )
2097 *fullscreen = libvlc_get_fullscreen(p_md, &ex) ? VARIANT_TRUE : VARIANT_FALSE;
2098 libvlc_media_player_release(p_md);
2099 if( ! libvlc_exception_raised(&ex) )
2104 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2105 libvlc_exception_clear(&ex);
2111 STDMETHODIMP VLCVideo::put_fullscreen(VARIANT_BOOL fullscreen)
2113 libvlc_instance_t* p_libvlc;
2114 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2117 libvlc_exception_t ex;
2118 libvlc_exception_init(&ex);
2120 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2121 if( ! libvlc_exception_raised(&ex) )
2123 libvlc_set_fullscreen(p_md, VARIANT_FALSE != fullscreen, &ex);
2124 libvlc_media_player_release(p_md);
2125 if( ! libvlc_exception_raised(&ex) )
2130 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2131 libvlc_exception_clear(&ex);
2137 STDMETHODIMP VLCVideo::get_width(long* width)
2142 libvlc_instance_t* p_libvlc;
2143 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2146 libvlc_exception_t ex;
2147 libvlc_exception_init(&ex);
2149 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2150 if( ! libvlc_exception_raised(&ex) )
2152 *width = libvlc_video_get_width(p_md, &ex);
2153 libvlc_media_player_release(p_md);
2154 if( ! libvlc_exception_raised(&ex) )
2159 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2160 libvlc_exception_clear(&ex);
2166 STDMETHODIMP VLCVideo::get_height(long* height)
2168 if( NULL == height )
2171 libvlc_instance_t* p_libvlc;
2172 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2175 libvlc_exception_t ex;
2176 libvlc_exception_init(&ex);
2178 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2179 if( ! libvlc_exception_raised(&ex) )
2181 *height = libvlc_video_get_height(p_md, &ex);
2182 libvlc_media_player_release(p_md);
2183 if( ! libvlc_exception_raised(&ex) )
2188 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2189 libvlc_exception_clear(&ex);
2195 STDMETHODIMP VLCVideo::get_aspectRatio(BSTR* aspect)
2197 if( NULL == aspect )
2200 libvlc_instance_t* p_libvlc;
2201 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2204 libvlc_exception_t ex;
2205 libvlc_exception_init(&ex);
2207 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2208 if( ! libvlc_exception_raised(&ex) )
2210 char *psz_aspect = libvlc_video_get_aspect_ratio(p_md, &ex);
2212 libvlc_media_player_release(p_md);
2213 if( ! libvlc_exception_raised(&ex) )
2215 if( NULL == psz_aspect )
2216 return E_OUTOFMEMORY;
2218 *aspect = BSTRFromCStr(CP_UTF8, psz_aspect);
2221 return (NULL == *aspect) ? E_OUTOFMEMORY : NOERROR;
2226 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2227 libvlc_exception_clear(&ex);
2233 STDMETHODIMP VLCVideo::put_aspectRatio(BSTR aspect)
2235 if( NULL == aspect )
2238 if( 0 == SysStringLen(aspect) )
2239 return E_INVALIDARG;
2241 libvlc_instance_t* p_libvlc;
2242 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2245 libvlc_exception_t ex;
2246 libvlc_exception_init(&ex);
2248 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2249 if( ! libvlc_exception_raised(&ex) )
2251 char *psz_aspect = CStrFromBSTR(CP_UTF8, aspect);
2252 if( NULL == psz_aspect )
2254 return E_OUTOFMEMORY;
2257 libvlc_video_set_aspect_ratio(p_md, psz_aspect, &ex);
2259 CoTaskMemFree(psz_aspect);
2260 libvlc_media_player_release(p_md);
2261 if( libvlc_exception_raised(&ex) )
2263 _p_instance->setErrorInfo(IID_IVLCVideo,
2264 libvlc_exception_get_message(&ex));
2265 libvlc_exception_clear(&ex);
2274 STDMETHODIMP VLCVideo::get_subtitle(long* spu)
2279 libvlc_instance_t* p_libvlc;
2280 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2283 libvlc_exception_t ex;
2284 libvlc_exception_init(&ex);
2286 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2287 if( ! libvlc_exception_raised(&ex) )
2289 *spu = libvlc_video_get_spu(p_md, &ex);
2290 libvlc_media_player_release(p_md);
2291 if( ! libvlc_exception_raised(&ex) )
2296 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2297 libvlc_exception_clear(&ex);
2303 STDMETHODIMP VLCVideo::put_subtitle(long spu)
2305 libvlc_instance_t* p_libvlc;
2306 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2309 libvlc_exception_t ex;
2310 libvlc_exception_init(&ex);
2312 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2313 libvlc_video_set_spu(p_md, spu, &ex);
2314 libvlc_media_player_release(p_md);
2315 if( libvlc_exception_raised(&ex) )
2317 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2318 libvlc_exception_clear(&ex);
2326 STDMETHODIMP VLCVideo::get_crop(BSTR* geometry)
2328 if( NULL == geometry )
2331 libvlc_instance_t* p_libvlc;
2332 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2335 libvlc_exception_t ex;
2336 libvlc_exception_init(&ex);
2338 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2339 if( ! libvlc_exception_raised(&ex) )
2341 char *psz_geometry = libvlc_video_get_crop_geometry(p_md, &ex);
2343 libvlc_media_player_release(p_md);
2344 if( ! libvlc_exception_raised(&ex) )
2346 if( NULL == psz_geometry )
2347 return E_OUTOFMEMORY;
2349 *geometry = BSTRFromCStr(CP_UTF8, psz_geometry);
2350 free( psz_geometry );
2351 psz_geometry = NULL;
2352 return (NULL == geometry) ? E_OUTOFMEMORY : NOERROR;
2354 free( psz_geometry );
2355 psz_geometry = NULL;
2357 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2358 libvlc_exception_clear(&ex);
2364 STDMETHODIMP VLCVideo::put_crop(BSTR geometry)
2366 if( NULL == geometry )
2369 if( 0 == SysStringLen(geometry) )
2370 return E_INVALIDARG;
2372 libvlc_instance_t* p_libvlc;
2373 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2376 libvlc_exception_t ex;
2377 libvlc_exception_init(&ex);
2379 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2380 if( ! libvlc_exception_raised(&ex) )
2382 char *psz_geometry = CStrFromBSTR(CP_UTF8, geometry);
2383 if( NULL == psz_geometry )
2385 return E_OUTOFMEMORY;
2388 libvlc_video_set_crop_geometry(p_md, psz_geometry, &ex);
2390 CoTaskMemFree(psz_geometry);
2391 libvlc_media_player_release(p_md);
2392 if( libvlc_exception_raised(&ex) )
2394 _p_instance->setErrorInfo(IID_IVLCVideo,
2395 libvlc_exception_get_message(&ex));
2396 libvlc_exception_clear(&ex);
2405 STDMETHODIMP VLCVideo::get_teletext(long* page)
2410 libvlc_instance_t* p_libvlc;
2411 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2414 libvlc_exception_t ex;
2415 libvlc_exception_init(&ex);
2417 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2418 if( ! libvlc_exception_raised(&ex) )
2420 *page = libvlc_video_get_teletext(p_md, &ex);
2421 libvlc_media_player_release(p_md);
2422 if( ! libvlc_exception_raised(&ex) )
2427 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2428 libvlc_exception_clear(&ex);
2434 STDMETHODIMP VLCVideo::put_teletext(long page)
2436 libvlc_instance_t* p_libvlc;
2437 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2440 libvlc_exception_t ex;
2441 libvlc_exception_init(&ex);
2443 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2444 libvlc_video_set_teletext(p_md, page, &ex);
2445 libvlc_media_player_release(p_md);
2446 if( libvlc_exception_raised(&ex) )
2448 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2449 libvlc_exception_clear(&ex);
2457 STDMETHODIMP VLCVideo::takeSnapshot(LPPICTUREDISP* picture)
2459 if( NULL == picture )
2462 libvlc_instance_t* p_libvlc;
2463 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2466 libvlc_exception_t ex;
2467 libvlc_exception_init(&ex);
2469 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2470 if( ! libvlc_exception_raised(&ex) )
2472 static int uniqueId = 0;
2473 TCHAR path[MAX_PATH+1];
2475 int pathlen = GetTempPath(MAX_PATH-24, path);
2476 if( (0 == pathlen) || (pathlen > (MAX_PATH-24)) )
2479 /* check temp directory path by openning it */
2481 HANDLE dirHandle = CreateFile(path,
2483 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
2486 FILE_FLAG_BACKUP_SEMANTICS, NULL);
2487 if( INVALID_HANDLE_VALUE == dirHandle )
2489 _p_instance->setErrorInfo(IID_IVLCVideo,
2490 "Invalid temporary directory for snapshot images, check values of TMP, TEMP envars.");
2495 BY_HANDLE_FILE_INFORMATION bhfi;
2496 BOOL res = GetFileInformationByHandle(dirHandle, &bhfi);
2497 CloseHandle(dirHandle);
2498 if( !res || !(bhfi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
2500 _p_instance->setErrorInfo(IID_IVLCVideo,
2501 "Invalid temporary directory for snapshot images, check values of TMP, TEMP envars.");
2507 TCHAR filepath[MAX_PATH+1];
2509 _stprintf(filepath, TEXT("%sAXVLC%lXS%lX.bmp"),
2510 path, GetCurrentProcessId(), ++uniqueId);
2513 /* reuse path storage for UTF8 string */
2514 char *psz_filepath = (char *)path;
2515 WCHAR* wpath = filepath;
2517 char *psz_filepath = path;
2518 /* first convert to unicode using current code page */
2519 WCHAR wpath[MAX_PATH+1];
2520 if( 0 == MultiByteToWideChar(CP_ACP, 0, filepath, -1, wpath, sizeof(wpath)/sizeof(WCHAR)) )
2523 /* convert to UTF8 */
2524 pathlen = WideCharToMultiByte(CP_UTF8, 0, wpath, -1, psz_filepath, sizeof(path), NULL, NULL);
2525 // fail if path is 0 or too short (i.e pathlen is the same as storage size)
2526 if( (0 == pathlen) || (sizeof(path) == pathlen) )
2529 /* take snapshot into file */
2530 libvlc_video_take_snapshot(p_md, psz_filepath, 0, 0, &ex);
2531 libvlc_media_player_release(p_md);
2532 if( ! libvlc_exception_raised(&ex) )
2535 /* open snapshot file */
2536 HANDLE snapPic = LoadImage(NULL, filepath, IMAGE_BITMAP,0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
2541 snapDesc.cbSizeofstruct = sizeof(PICTDESC);
2542 snapDesc.picType = PICTYPE_BITMAP;
2543 snapDesc.bmp.hbitmap = (HBITMAP)snapPic;
2544 snapDesc.bmp.hpal = NULL;
2546 hr = OleCreatePictureIndirect(&snapDesc, IID_IPictureDisp, TRUE, (LPVOID*)picture);
2550 DeleteObject(snapPic);
2553 DeleteFile(filepath);
2557 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2558 libvlc_exception_clear(&ex);
2564 STDMETHODIMP VLCVideo::toggleFullscreen()
2566 libvlc_instance_t* p_libvlc;
2567 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2570 libvlc_exception_t ex;
2571 libvlc_exception_init(&ex);
2573 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2574 if( ! libvlc_exception_raised(&ex) )
2576 libvlc_toggle_fullscreen(p_md, &ex);
2577 libvlc_media_player_release(p_md);
2578 if( ! libvlc_exception_raised(&ex) )
2583 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2584 libvlc_exception_clear(&ex);
2590 STDMETHODIMP VLCVideo::toggleTeletext()
2592 libvlc_instance_t* p_libvlc;
2593 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2596 libvlc_exception_t ex;
2597 libvlc_exception_init(&ex);
2599 libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_libvlc, &ex);
2600 if( ! libvlc_exception_raised(&ex) )
2602 libvlc_toggle_teletext(p_md, &ex);
2603 libvlc_media_player_release(p_md);
2604 if( ! libvlc_exception_raised(&ex) )
2609 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2610 libvlc_exception_clear(&ex);
2616 /*******************************************************************************/
2618 VLCControl2::VLCControl2(VLCPlugin *p_instance) :
2619 _p_instance(p_instance),
2623 _p_vlcplaylist(NULL),
2626 _p_vlcaudio = new VLCAudio(p_instance);
2627 _p_vlcinput = new VLCInput(p_instance);
2628 _p_vlclog = new VLCLog(p_instance);
2629 _p_vlcplaylist = new VLCPlaylist(p_instance);
2630 _p_vlcvideo = new VLCVideo(p_instance);
2633 VLCControl2::~VLCControl2()
2636 delete _p_vlcplaylist;
2641 _p_typeinfo->Release();
2644 HRESULT VLCControl2::loadTypeInfo(void)
2646 HRESULT hr = NOERROR;
2647 if( NULL == _p_typeinfo )
2649 ITypeLib *p_typelib;
2651 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
2654 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCControl2, &_p_typeinfo);
2659 p_typelib->Release();
2665 STDMETHODIMP VLCControl2::GetTypeInfoCount(UINT* pctInfo)
2667 if( NULL == pctInfo )
2668 return E_INVALIDARG;
2670 if( SUCCEEDED(loadTypeInfo()) )
2678 STDMETHODIMP VLCControl2::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
2680 if( NULL == ppTInfo )
2681 return E_INVALIDARG;
2683 if( SUCCEEDED(loadTypeInfo()) )
2685 _p_typeinfo->AddRef();
2686 *ppTInfo = _p_typeinfo;
2693 STDMETHODIMP VLCControl2::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
2694 UINT cNames, LCID lcid, DISPID* rgDispID)
2696 if( SUCCEEDED(loadTypeInfo()) )
2698 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
2703 STDMETHODIMP VLCControl2::Invoke(DISPID dispIdMember, REFIID riid,
2704 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
2705 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
2707 if( SUCCEEDED(loadTypeInfo()) )
2709 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
2710 pVarResult, pExcepInfo, puArgErr);
2715 STDMETHODIMP VLCControl2::get_AutoLoop(VARIANT_BOOL *autoloop)
2717 if( NULL == autoloop )
2720 *autoloop = _p_instance->getAutoLoop() ? VARIANT_TRUE: VARIANT_FALSE;
2724 STDMETHODIMP VLCControl2::put_AutoLoop(VARIANT_BOOL autoloop)
2726 _p_instance->setAutoLoop((VARIANT_FALSE != autoloop) ? TRUE: FALSE);
2730 STDMETHODIMP VLCControl2::get_AutoPlay(VARIANT_BOOL *autoplay)
2732 if( NULL == autoplay )
2735 *autoplay = _p_instance->getAutoPlay() ? VARIANT_TRUE: VARIANT_FALSE;
2739 STDMETHODIMP VLCControl2::put_AutoPlay(VARIANT_BOOL autoplay)
2741 _p_instance->setAutoPlay((VARIANT_FALSE != autoplay) ? TRUE: FALSE);
2745 STDMETHODIMP VLCControl2::get_BaseURL(BSTR *url)
2750 *url = SysAllocStringLen(_p_instance->getBaseURL(),
2751 SysStringLen(_p_instance->getBaseURL()));
2755 STDMETHODIMP VLCControl2::put_BaseURL(BSTR mrl)
2757 _p_instance->setBaseURL(mrl);
2762 STDMETHODIMP VLCControl2::get_MRL(BSTR *mrl)
2767 *mrl = SysAllocStringLen(_p_instance->getMRL(),
2768 SysStringLen(_p_instance->getMRL()));
2772 STDMETHODIMP VLCControl2::put_MRL(BSTR mrl)
2774 _p_instance->setMRL(mrl);
2780 STDMETHODIMP VLCControl2::get_Toolbar(VARIANT_BOOL *visible)
2782 if( NULL == visible )
2786 * Note to developpers
2788 * Returning the _b_toolbar is closer to the method specification.
2789 * But returning True when toolbar is not implemented so not displayed
2790 * could be bad for ActiveX users which rely on this value to show their
2791 * own toolbar if not provided by the ActiveX.
2793 * This is the reason why FALSE is returned, until toolbar get implemented.
2796 /* DISABLED for now */
2797 // *visible = _p_instance->getShowToolbar() ? VARIANT_TRUE: VARIANT_FALSE;
2799 *visible = VARIANT_FALSE;
2804 STDMETHODIMP VLCControl2::put_Toolbar(VARIANT_BOOL visible)
2806 _p_instance->setShowToolbar((VARIANT_FALSE != visible) ? TRUE: FALSE);
2811 STDMETHODIMP VLCControl2::get_StartTime(long *seconds)
2813 if( NULL == seconds )
2816 *seconds = _p_instance->getStartTime();
2821 STDMETHODIMP VLCControl2::put_StartTime(long seconds)
2823 _p_instance->setStartTime(seconds);
2828 STDMETHODIMP VLCControl2::get_VersionInfo(BSTR *version)
2830 if( NULL == version )
2833 const char *versionStr = libvlc_get_version();
2834 if( NULL != versionStr )
2836 *version = BSTRFromCStr(CP_UTF8, versionStr);
2838 return (NULL == *version) ? E_OUTOFMEMORY : NOERROR;
2844 STDMETHODIMP VLCControl2::get_Visible(VARIANT_BOOL *isVisible)
2846 if( NULL == isVisible )
2849 *isVisible = _p_instance->getVisible() ? VARIANT_TRUE : VARIANT_FALSE;
2854 STDMETHODIMP VLCControl2::put_Visible(VARIANT_BOOL isVisible)
2856 _p_instance->setVisible(isVisible != VARIANT_FALSE);
2861 STDMETHODIMP VLCControl2::get_Volume(long *volume)
2863 if( NULL == volume )
2866 *volume = _p_instance->getVolume();
2870 STDMETHODIMP VLCControl2::put_Volume(long volume)
2872 _p_instance->setVolume(volume);
2876 STDMETHODIMP VLCControl2::get_BackColor(OLE_COLOR *backcolor)
2878 if( NULL == backcolor )
2881 *backcolor = _p_instance->getBackColor();
2885 STDMETHODIMP VLCControl2::put_BackColor(OLE_COLOR backcolor)
2887 _p_instance->setBackColor(backcolor);
2891 STDMETHODIMP VLCControl2::get_audio(IVLCAudio** obj)
2897 if( NULL != _p_vlcaudio )
2899 _p_vlcaudio->AddRef();
2902 return E_OUTOFMEMORY;
2905 STDMETHODIMP VLCControl2::get_input(IVLCInput** obj)
2911 if( NULL != _p_vlcinput )
2913 _p_vlcinput->AddRef();
2916 return E_OUTOFMEMORY;
2919 STDMETHODIMP VLCControl2::get_log(IVLCLog** obj)
2925 if( NULL != _p_vlclog )
2927 _p_vlclog->AddRef();
2930 return E_OUTOFMEMORY;
2933 STDMETHODIMP VLCControl2::get_playlist(IVLCPlaylist** obj)
2938 *obj = _p_vlcplaylist;
2939 if( NULL != _p_vlcplaylist )
2941 _p_vlcplaylist->AddRef();
2944 return E_OUTOFMEMORY;
2947 STDMETHODIMP VLCControl2::get_video(IVLCVideo** obj)
2953 if( NULL != _p_vlcvideo )
2955 _p_vlcvideo->AddRef();
2958 return E_OUTOFMEMORY;