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 along
20 * with this program; if not, write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22 *****************************************************************************/
25 #include "vlccontrol2.h"
26 #include "vlccontrol.h"
37 HRESULT _exception_bridge(VLCPlugin *p,REFIID riid, libvlc_exception_t *ex)
39 if( libvlc_exception_raised(ex) )
41 p->setErrorInfo(riid,libvlc_errmsg());
42 libvlc_exception_clear(ex);
48 #define EMIT_EXCEPTION_BRIDGE( classname ) \
49 HRESULT classname::exception_bridge( libvlc_exception_t *ex ) \
50 { return _exception_bridge( _p_instance, IID_I##classname, ex ); }
52 EMIT_EXCEPTION_BRIDGE( VLCAudio )
53 EMIT_EXCEPTION_BRIDGE( VLCInput )
54 EMIT_EXCEPTION_BRIDGE( VLCMarquee )
55 EMIT_EXCEPTION_BRIDGE( VLCMessageIterator )
56 EMIT_EXCEPTION_BRIDGE( VLCMessages )
57 EMIT_EXCEPTION_BRIDGE( VLCLog )
58 EMIT_EXCEPTION_BRIDGE( VLCPlaylistItems )
59 EMIT_EXCEPTION_BRIDGE( VLCPlaylist )
60 EMIT_EXCEPTION_BRIDGE( VLCVideo )
61 EMIT_EXCEPTION_BRIDGE( VLCSubtitle )
63 #undef EMIT_EXCEPTION_BRIDGE
69 _p_typeinfo->Release();
72 HRESULT VLCAudio::loadTypeInfo(void)
75 if( NULL == _p_typeinfo )
79 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
82 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCAudio, &_p_typeinfo);
93 STDMETHODIMP VLCAudio::GetTypeInfoCount(UINT* pctInfo)
98 if( SUCCEEDED(loadTypeInfo()) )
106 STDMETHODIMP VLCAudio::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
108 if( NULL == ppTInfo )
111 if( SUCCEEDED(loadTypeInfo()) )
113 _p_typeinfo->AddRef();
114 *ppTInfo = _p_typeinfo;
121 STDMETHODIMP VLCAudio::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
122 UINT cNames, LCID lcid, DISPID* rgDispID)
124 if( SUCCEEDED(loadTypeInfo()) )
126 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
131 STDMETHODIMP VLCAudio::Invoke(DISPID dispIdMember, REFIID riid,
132 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
133 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
135 if( SUCCEEDED(loadTypeInfo()) )
137 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
138 pVarResult, pExcepInfo, puArgErr);
143 STDMETHODIMP VLCAudio::get_mute(VARIANT_BOOL* mute)
148 libvlc_instance_t* p_libvlc;
149 HRESULT hr = _p_instance->getVLC(&p_libvlc);
152 libvlc_exception_t ex;
153 libvlc_exception_init(&ex);
155 *mute = libvlc_audio_get_mute(p_libvlc, &ex) ?
156 VARIANT_TRUE : VARIANT_FALSE;
157 hr = exception_bridge(&ex);
162 STDMETHODIMP VLCAudio::put_mute(VARIANT_BOOL mute)
164 libvlc_instance_t* p_libvlc;
165 HRESULT hr = _p_instance->getVLC(&p_libvlc);
168 libvlc_exception_t ex;
169 libvlc_exception_init(&ex);
171 libvlc_audio_set_mute(p_libvlc, VARIANT_FALSE != mute, &ex);
172 hr = exception_bridge(&ex);
177 STDMETHODIMP VLCAudio::get_volume(long* volume)
182 libvlc_instance_t* p_libvlc;
183 HRESULT hr = _p_instance->getVLC(&p_libvlc);
186 libvlc_exception_t ex;
187 libvlc_exception_init(&ex);
189 *volume = libvlc_audio_get_volume(p_libvlc, &ex);
190 hr = exception_bridge(&ex);
195 STDMETHODIMP VLCAudio::put_volume(long volume)
197 libvlc_instance_t* p_libvlc;
198 HRESULT hr = _p_instance->getVLC(&p_libvlc);
201 libvlc_exception_t ex;
202 libvlc_exception_init(&ex);
204 libvlc_audio_set_volume(p_libvlc, volume, &ex);
205 hr = exception_bridge(&ex);
210 STDMETHODIMP VLCAudio::get_track(long* track)
215 libvlc_media_player_t* p_md;
216 HRESULT hr = _p_instance->getMD(&p_md);
219 libvlc_exception_t ex;
220 libvlc_exception_init(&ex);
222 *track = libvlc_audio_get_track(p_md, &ex);
223 hr = exception_bridge(&ex);
228 STDMETHODIMP VLCAudio::put_track(long track)
230 libvlc_media_player_t *p_md;
231 HRESULT hr = _p_instance->getMD(&p_md);
234 libvlc_exception_t ex;
235 libvlc_exception_init(&ex);
237 libvlc_audio_set_track(p_md, track, &ex);
238 hr = exception_bridge(&ex);
243 STDMETHODIMP VLCAudio::get_count(long* trackNumber)
245 if( NULL == trackNumber )
248 libvlc_media_player_t* p_md;
249 HRESULT hr = _p_instance->getMD(&p_md);
252 libvlc_exception_t ex;
253 libvlc_exception_init(&ex);
254 // get the number of audio track available and return it
255 *trackNumber = libvlc_audio_get_track_count(p_md, &ex);
256 hr = exception_bridge(&ex);
262 STDMETHODIMP VLCAudio::description(long trackID, BSTR* name)
267 libvlc_media_player_t* p_md;
268 libvlc_exception_t ex;
269 libvlc_exception_init(&ex);
271 HRESULT hr = _p_instance->getMD(&p_md);
275 const char *psz_name;
276 libvlc_track_description_t *p_trackDesc;
278 // get tracks description
279 p_trackDesc = libvlc_audio_get_track_description(p_md, &ex);
280 hr = exception_bridge(&ex);
284 //get the number of available track
285 i_limit = libvlc_audio_get_track_count(p_md, &ex);
286 hr = exception_bridge(&ex);
290 // check if the number given is a good one
291 if ( ( trackID > ( i_limit -1 ) ) || ( trackID < 0 ) )
294 // get the good trackDesc
295 for( i = 0 ; i < trackID ; i++ )
297 p_trackDesc = p_trackDesc->p_next;
299 // get the track name
300 psz_name = p_trackDesc->psz_name;
303 if( psz_name != NULL )
305 *name = BSTRFromCStr(CP_UTF8, psz_name);
306 return (NULL == *name) ? E_OUTOFMEMORY : NOERROR;
314 STDMETHODIMP VLCAudio::get_channel(long *channel)
316 if( NULL == channel )
319 libvlc_instance_t* p_libvlc;
320 HRESULT hr = _p_instance->getVLC(&p_libvlc);
323 libvlc_exception_t ex;
324 libvlc_exception_init(&ex);
326 *channel = libvlc_audio_get_channel(p_libvlc, &ex);
327 hr = exception_bridge(&ex);
332 STDMETHODIMP VLCAudio::put_channel(long channel)
334 libvlc_instance_t* p_libvlc;
335 HRESULT hr = _p_instance->getVLC(&p_libvlc);
338 libvlc_exception_t ex;
339 libvlc_exception_init(&ex);
341 libvlc_audio_set_channel(p_libvlc, channel, &ex);
342 hr = exception_bridge(&ex);
347 STDMETHODIMP VLCAudio::toggleMute()
349 libvlc_instance_t* p_libvlc;
350 HRESULT hr = _p_instance->getVLC(&p_libvlc);
353 libvlc_exception_t ex;
354 libvlc_exception_init(&ex);
356 libvlc_audio_toggle_mute(p_libvlc, &ex);
357 hr = exception_bridge(&ex);
362 /*******************************************************************************/
364 VLCInput::~VLCInput()
367 _p_typeinfo->Release();
370 HRESULT VLCInput::loadTypeInfo(void)
372 HRESULT hr = NOERROR;
373 if( NULL == _p_typeinfo )
377 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
380 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCInput, &_p_typeinfo);
385 p_typelib->Release();
391 STDMETHODIMP VLCInput::GetTypeInfoCount(UINT* pctInfo)
393 if( NULL == pctInfo )
396 if( SUCCEEDED(loadTypeInfo()) )
404 STDMETHODIMP VLCInput::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
406 if( NULL == ppTInfo )
409 if( SUCCEEDED(loadTypeInfo()) )
411 _p_typeinfo->AddRef();
412 *ppTInfo = _p_typeinfo;
419 STDMETHODIMP VLCInput::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
420 UINT cNames, LCID lcid, DISPID* rgDispID)
422 if( SUCCEEDED(loadTypeInfo()) )
424 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
429 STDMETHODIMP VLCInput::Invoke(DISPID dispIdMember, REFIID riid,
430 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
431 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
433 if( SUCCEEDED(loadTypeInfo()) )
435 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
436 pVarResult, pExcepInfo, puArgErr);
441 STDMETHODIMP VLCInput::get_length(double* length)
447 libvlc_media_player_t *p_md;
448 HRESULT hr = _p_instance->getMD(&p_md);
451 libvlc_exception_t ex;
452 libvlc_exception_init(&ex);
454 *length = (double)libvlc_media_player_get_length(p_md, &ex);
455 hr = exception_bridge(&ex);
460 STDMETHODIMP VLCInput::get_position(double* position)
462 if( NULL == position )
466 libvlc_media_player_t *p_md;
467 HRESULT hr = _p_instance->getMD(&p_md);
470 libvlc_exception_t ex;
471 libvlc_exception_init(&ex);
473 *position = libvlc_media_player_get_position(p_md, &ex);
474 hr = exception_bridge(&ex);
479 STDMETHODIMP VLCInput::put_position(double position)
481 libvlc_media_player_t *p_md;
482 HRESULT hr = _p_instance->getMD(&p_md);
485 libvlc_exception_t ex;
486 libvlc_exception_init(&ex);
488 libvlc_media_player_set_position(p_md, position, &ex);
489 hr = exception_bridge(&ex);
494 STDMETHODIMP VLCInput::get_time(double* time)
499 libvlc_media_player_t *p_md;
500 HRESULT hr = _p_instance->getMD(&p_md);
503 libvlc_exception_t ex;
504 libvlc_exception_init(&ex);
506 *time = (double)libvlc_media_player_get_time(p_md, &ex);
507 hr = exception_bridge(&ex);
512 STDMETHODIMP VLCInput::put_time(double time)
514 libvlc_media_player_t *p_md;
515 HRESULT hr = _p_instance->getMD(&p_md);
518 libvlc_exception_t ex;
519 libvlc_exception_init(&ex);
521 libvlc_media_player_set_time(p_md, (int64_t)time, &ex);
522 hr = exception_bridge(&ex);
527 STDMETHODIMP VLCInput::get_state(long* state)
532 libvlc_media_player_t *p_md;
533 HRESULT hr = _p_instance->getMD(&p_md);
536 libvlc_exception_t ex;
537 libvlc_exception_init(&ex);
539 *state = libvlc_media_player_get_state(p_md, &ex);
540 if( libvlc_exception_raised(&ex) )
542 // don't fail, just return the idle state
544 libvlc_exception_clear(&ex);
550 STDMETHODIMP VLCInput::get_rate(double* rate)
555 libvlc_media_player_t *p_md;
556 HRESULT hr = _p_instance->getMD(&p_md);
559 libvlc_exception_t ex;
560 libvlc_exception_init(&ex);
562 *rate = libvlc_media_player_get_rate(p_md, &ex);
563 hr = exception_bridge(&ex);
568 STDMETHODIMP VLCInput::put_rate(double rate)
570 libvlc_media_player_t *p_md;
571 HRESULT hr = _p_instance->getMD(&p_md);
574 libvlc_exception_t ex;
575 libvlc_exception_init(&ex);
577 libvlc_media_player_set_rate(p_md, rate, &ex);
578 hr = exception_bridge(&ex);
583 STDMETHODIMP VLCInput::get_fps(double* fps)
589 libvlc_media_player_t *p_md;
590 HRESULT hr = _p_instance->getMD(&p_md);
593 libvlc_exception_t ex;
594 libvlc_exception_init(&ex);
596 *fps = libvlc_media_player_get_fps(p_md, &ex);
597 hr = exception_bridge(&ex);
602 STDMETHODIMP VLCInput::get_hasVout(VARIANT_BOOL* hasVout)
604 if( NULL == hasVout )
607 libvlc_media_player_t *p_md;
608 HRESULT hr = _p_instance->getMD(&p_md);
611 libvlc_exception_t ex;
612 libvlc_exception_init(&ex);
614 *hasVout = libvlc_media_player_has_vout(p_md, &ex) ?
615 VARIANT_TRUE : VARIANT_FALSE;
616 hr = exception_bridge(&ex);
621 /*******************************************************************************/
625 delete _p_vlcmessages;
627 libvlc_log_close(_p_log);
630 _p_typeinfo->Release();
633 HRESULT VLCLog::loadTypeInfo(void)
635 HRESULT hr = NOERROR;
636 if( NULL == _p_typeinfo )
640 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
643 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCLog, &_p_typeinfo);
648 p_typelib->Release();
654 STDMETHODIMP VLCLog::GetTypeInfoCount(UINT* pctInfo)
656 if( NULL == pctInfo )
659 if( SUCCEEDED(loadTypeInfo()) )
667 STDMETHODIMP VLCLog::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
669 if( NULL == ppTInfo )
672 if( SUCCEEDED(loadTypeInfo()) )
674 _p_typeinfo->AddRef();
675 *ppTInfo = _p_typeinfo;
682 STDMETHODIMP VLCLog::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
683 UINT cNames, LCID lcid, DISPID* rgDispID)
685 if( SUCCEEDED(loadTypeInfo()) )
687 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
692 STDMETHODIMP VLCLog::Invoke(DISPID dispIdMember, REFIID riid,
693 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
694 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
696 if( SUCCEEDED(loadTypeInfo()) )
698 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
699 pVarResult, pExcepInfo, puArgErr);
704 STDMETHODIMP VLCLog::get_messages(IVLCMessages** obj)
709 *obj = _p_vlcmessages;
710 if( NULL != _p_vlcmessages )
712 _p_vlcmessages->AddRef();
715 return E_OUTOFMEMORY;
718 STDMETHODIMP VLCLog::get_verbosity(long* level)
725 libvlc_instance_t* p_libvlc;
726 HRESULT hr = _p_instance->getVLC(&p_libvlc);
728 *level = libvlc_get_log_verbosity(p_libvlc);
733 /* log is not enabled, return -1 */
739 STDMETHODIMP VLCLog::put_verbosity(long verbosity)
741 libvlc_instance_t* p_libvlc;
742 HRESULT hr = _p_instance->getVLC(&p_libvlc);
745 libvlc_exception_t ex;
746 libvlc_exception_init(&ex);
752 _p_log = libvlc_log_open(p_libvlc, &ex);
753 hr = exception_bridge(&ex);
756 libvlc_set_log_verbosity(p_libvlc, (unsigned)verbosity);
760 /* close log when verbosity is set to -1 */
761 libvlc_log_close(_p_log);
764 hr = exception_bridge(&ex);
769 /*******************************************************************************/
771 VLCMarquee::~VLCMarquee()
774 _p_typeinfo->Release();
777 HRESULT VLCMarquee::loadTypeInfo(void)
779 HRESULT hr = NOERROR;
780 if( NULL == _p_typeinfo )
784 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
787 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMarquee, &_p_typeinfo);
792 p_typelib->Release();
798 STDMETHODIMP VLCMarquee::GetTypeInfoCount(UINT* pctInfo)
800 if( NULL == pctInfo )
803 if( SUCCEEDED(loadTypeInfo()) )
811 STDMETHODIMP VLCMarquee::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
813 if( NULL == ppTInfo )
816 if( SUCCEEDED(loadTypeInfo()) )
818 _p_typeinfo->AddRef();
819 *ppTInfo = _p_typeinfo;
826 STDMETHODIMP VLCMarquee::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
827 UINT cNames, LCID lcid, DISPID* rgDispID)
829 if( SUCCEEDED(loadTypeInfo()) )
831 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
836 STDMETHODIMP VLCMarquee::Invoke(DISPID dispIdMember, REFIID riid,
837 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
838 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
840 if( SUCCEEDED(loadTypeInfo()) )
842 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
843 pVarResult, pExcepInfo, puArgErr);
848 STDMETHODIMP VLCMarquee::enable()
850 libvlc_media_player_t *p_md;
851 HRESULT hr = _p_instance->getMD(&p_md);
854 libvlc_exception_t ex;
855 libvlc_exception_init(&ex);
857 libvlc_video_set_marquee_option_as_int(p_md, libvlc_marquee_Enabled, true, &ex);
858 hr = exception_bridge(&ex);
863 STDMETHODIMP VLCMarquee::disable()
865 libvlc_media_player_t *p_md;
866 HRESULT hr = _p_instance->getMD(&p_md);
869 libvlc_exception_t ex;
870 libvlc_exception_init(&ex);
872 libvlc_video_set_marquee_option_as_int(p_md, libvlc_marquee_Enabled, false, &ex);
873 hr = exception_bridge(&ex);
878 STDMETHODIMP VLCMarquee::color(long val)
880 libvlc_media_player_t *p_md;
881 HRESULT hr = _p_instance->getMD(&p_md);
884 libvlc_exception_t ex;
885 libvlc_exception_init(&ex);
887 libvlc_video_set_marquee_option_as_int(p_md, libvlc_marquee_Color, val, &ex);
888 hr = exception_bridge(&ex);
893 STDMETHODIMP VLCMarquee::opacity(long val)
895 libvlc_media_player_t *p_md;
896 HRESULT hr = _p_instance->getMD(&p_md);
899 libvlc_exception_t ex;
900 libvlc_exception_init(&ex);
902 libvlc_video_set_marquee_option_as_int(p_md, libvlc_marquee_Opacity, val, &ex);
903 hr = exception_bridge(&ex);
908 STDMETHODIMP VLCMarquee::position(long val)
910 libvlc_media_player_t *p_md;
911 HRESULT hr = _p_instance->getMD(&p_md);
914 libvlc_exception_t ex;
915 libvlc_exception_init(&ex);
917 libvlc_video_set_marquee_option_as_int(p_md, libvlc_marquee_Position, val, &ex);
918 hr = exception_bridge(&ex);
923 STDMETHODIMP VLCMarquee::refresh(long val)
925 libvlc_media_player_t *p_md;
926 HRESULT hr = _p_instance->getMD(&p_md);
929 libvlc_exception_t ex;
930 libvlc_exception_init(&ex);
932 libvlc_video_set_marquee_option_as_int(p_md, libvlc_marquee_Refresh, val, &ex);
933 hr = exception_bridge(&ex);
938 STDMETHODIMP VLCMarquee::size(long val)
940 libvlc_media_player_t *p_md;
941 HRESULT hr = _p_instance->getMD(&p_md);
944 libvlc_exception_t ex;
945 libvlc_exception_init(&ex);
947 libvlc_video_set_marquee_option_as_int(p_md, libvlc_marquee_Size, val, &ex);
948 hr = exception_bridge(&ex);
953 STDMETHODIMP VLCMarquee::text(BSTR text)
955 libvlc_media_player_t *p_md;
956 HRESULT hr = _p_instance->getMD(&p_md);
959 libvlc_exception_t ex;
960 libvlc_exception_init(&ex);
962 char *psz_text = CStrFromBSTR(CP_UTF8, text);
963 libvlc_video_set_marquee_option_as_string(p_md, libvlc_marquee_Text, psz_text, &ex);
964 hr = exception_bridge(&ex);
965 CoTaskMemFree(psz_text);
970 STDMETHODIMP VLCMarquee::timeout(long val)
972 libvlc_media_player_t *p_md;
973 HRESULT hr = _p_instance->getMD(&p_md);
976 libvlc_exception_t ex;
977 libvlc_exception_init(&ex);
979 libvlc_video_set_marquee_option_as_int(p_md, libvlc_marquee_Timeout, val, &ex);
980 hr = exception_bridge(&ex);
985 STDMETHODIMP VLCMarquee::x(long val)
987 libvlc_media_player_t *p_md;
988 HRESULT hr = _p_instance->getMD(&p_md);
991 libvlc_exception_t ex;
992 libvlc_exception_init(&ex);
994 libvlc_video_set_marquee_option_as_int(p_md, libvlc_marquee_X, val, &ex);
995 hr = exception_bridge(&ex);
1000 STDMETHODIMP VLCMarquee::y(long val)
1002 libvlc_media_player_t *p_md;
1003 HRESULT hr = _p_instance->getMD(&p_md);
1006 libvlc_exception_t ex;
1007 libvlc_exception_init(&ex);
1009 libvlc_video_set_marquee_option_as_int(p_md, libvlc_marquee_Y, val, &ex);
1010 hr = exception_bridge(&ex);
1015 /*******************************************************************************/
1017 /* STL forward iterator used by VLCEnumIterator class to implement IEnumVARIANT */
1019 class VLCMessageSTLIterator
1024 VLCMessageSTLIterator(IVLCMessageIterator* iter) : iter(iter), msg(NULL)
1026 // get first message
1030 VLCMessageSTLIterator(const VLCMessageSTLIterator& other)
1040 virtual ~VLCMessageSTLIterator()
1049 // we only need prefix ++ operator
1050 VLCMessageSTLIterator& operator++()
1052 VARIANT_BOOL hasNext = VARIANT_FALSE;
1055 iter->get_hasNext(&hasNext);
1062 if( VARIANT_TRUE == hasNext ) {
1069 VARIANT operator*() const
1075 if( SUCCEEDED(msg->QueryInterface(IID_IDispatch,
1076 (LPVOID*)&V_DISPATCH(&v))) )
1078 V_VT(&v) = VT_DISPATCH;
1084 bool operator==(const VLCMessageSTLIterator& other) const
1086 return msg == other.msg;
1089 bool operator!=(const VLCMessageSTLIterator& other) const
1091 return msg != other.msg;
1095 IVLCMessageIterator* iter;
1099 ////////////////////////////////////////////////////////////////////////////////////////////////////////////
1101 VLCMessages::~VLCMessages()
1104 _p_typeinfo->Release();
1107 HRESULT VLCMessages::loadTypeInfo(void)
1109 HRESULT hr = NOERROR;
1110 if( NULL == _p_typeinfo )
1112 ITypeLib *p_typelib;
1114 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1117 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessages, &_p_typeinfo);
1122 p_typelib->Release();
1128 STDMETHODIMP VLCMessages::GetTypeInfoCount(UINT* pctInfo)
1130 if( NULL == pctInfo )
1131 return E_INVALIDARG;
1133 if( SUCCEEDED(loadTypeInfo()) )
1141 STDMETHODIMP VLCMessages::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1143 if( NULL == ppTInfo )
1144 return E_INVALIDARG;
1146 if( SUCCEEDED(loadTypeInfo()) )
1148 _p_typeinfo->AddRef();
1149 *ppTInfo = _p_typeinfo;
1156 STDMETHODIMP VLCMessages::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1157 UINT cNames, LCID lcid, DISPID* rgDispID)
1159 if( SUCCEEDED(loadTypeInfo()) )
1161 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1166 STDMETHODIMP VLCMessages::Invoke(DISPID dispIdMember, REFIID riid,
1167 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1168 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1170 if( SUCCEEDED(loadTypeInfo()) )
1172 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1173 pVarResult, pExcepInfo, puArgErr);
1178 STDMETHODIMP VLCMessages::get__NewEnum(LPUNKNOWN* _NewEnum)
1180 if( NULL == _NewEnum )
1183 IVLCMessageIterator* iter = NULL;
1186 *_NewEnum= new VLCEnumIterator<IID_IEnumVARIANT,
1189 VLCMessageSTLIterator>
1190 (VLCMessageSTLIterator(iter), VLCMessageSTLIterator(NULL));
1192 return *_NewEnum ? S_OK : E_OUTOFMEMORY;
1195 STDMETHODIMP VLCMessages::clear()
1197 libvlc_log_t *p_log = _p_vlclog->_p_log;
1199 libvlc_log_clear(p_log);
1203 STDMETHODIMP VLCMessages::get_count(long* count)
1208 libvlc_log_t *p_log = _p_vlclog->_p_log;
1209 *count = libvlc_log_count(p_log);
1213 STDMETHODIMP VLCMessages::iterator(IVLCMessageIterator** iter)
1218 *iter = new VLCMessageIterator(_p_instance, _p_vlclog);
1220 return *iter ? S_OK : E_OUTOFMEMORY;
1223 /*******************************************************************************/
1225 VLCMessageIterator::VLCMessageIterator(VLCPlugin *p_instance, VLCLog* p_vlclog ) :
1226 _p_instance(p_instance),
1231 if( p_vlclog->_p_log )
1233 _p_iter = libvlc_log_get_iterator(p_vlclog->_p_log, NULL);
1239 VLCMessageIterator::~VLCMessageIterator()
1242 libvlc_log_iterator_free(_p_iter);
1245 _p_typeinfo->Release();
1248 HRESULT VLCMessageIterator::loadTypeInfo(void)
1250 HRESULT hr = NOERROR;
1251 if( NULL == _p_typeinfo )
1253 ITypeLib *p_typelib;
1255 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1258 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessageIterator, &_p_typeinfo);
1263 p_typelib->Release();
1269 STDMETHODIMP VLCMessageIterator::GetTypeInfoCount(UINT* pctInfo)
1271 if( NULL == pctInfo )
1272 return E_INVALIDARG;
1274 if( SUCCEEDED(loadTypeInfo()) )
1282 STDMETHODIMP VLCMessageIterator::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1284 if( NULL == ppTInfo )
1285 return E_INVALIDARG;
1287 if( SUCCEEDED(loadTypeInfo()) )
1289 _p_typeinfo->AddRef();
1290 *ppTInfo = _p_typeinfo;
1297 STDMETHODIMP VLCMessageIterator::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1298 UINT cNames, LCID lcid, DISPID* rgDispID)
1300 if( SUCCEEDED(loadTypeInfo()) )
1302 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1307 STDMETHODIMP VLCMessageIterator::Invoke(DISPID dispIdMember, REFIID riid,
1308 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1309 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1311 if( SUCCEEDED(loadTypeInfo()) )
1313 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1314 pVarResult, pExcepInfo, puArgErr);
1319 STDMETHODIMP VLCMessageIterator::get_hasNext(VARIANT_BOOL* hasNext)
1321 if( NULL == hasNext )
1324 if( _p_iter && _p_vlclog->_p_log )
1326 *hasNext = libvlc_log_iterator_has_next(_p_iter) ?
1327 VARIANT_TRUE : VARIANT_FALSE;
1331 *hasNext = VARIANT_FALSE;
1336 STDMETHODIMP VLCMessageIterator::next(IVLCMessage** message)
1340 if( NULL == message )
1343 if( _p_iter && _p_vlclog->_p_log )
1345 struct libvlc_log_message_t buffer;
1347 buffer.sizeof_msg = sizeof(buffer);
1349 libvlc_exception_t ex;
1350 libvlc_exception_init(&ex);
1352 libvlc_log_iterator_next(_p_iter, &buffer, &ex);
1353 *message = new VLCMessage(_p_instance, buffer);
1360 /*******************************************************************************/
1362 VLCMessage::~VLCMessage()
1365 _p_typeinfo->Release();
1368 HRESULT VLCMessage::loadTypeInfo(void)
1370 HRESULT hr = NOERROR;
1371 if( NULL == _p_typeinfo )
1373 ITypeLib *p_typelib;
1375 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1378 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessage, &_p_typeinfo);
1383 p_typelib->Release();
1389 STDMETHODIMP VLCMessage::GetTypeInfoCount(UINT* pctInfo)
1391 if( NULL == pctInfo )
1392 return E_INVALIDARG;
1394 if( SUCCEEDED(loadTypeInfo()) )
1402 STDMETHODIMP VLCMessage::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1404 if( NULL == ppTInfo )
1405 return E_INVALIDARG;
1407 if( SUCCEEDED(loadTypeInfo()) )
1409 _p_typeinfo->AddRef();
1410 *ppTInfo = _p_typeinfo;
1417 STDMETHODIMP VLCMessage::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1418 UINT cNames, LCID lcid, DISPID* rgDispID)
1420 if( SUCCEEDED(loadTypeInfo()) )
1422 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1427 STDMETHODIMP VLCMessage::Invoke(DISPID dispIdMember, REFIID riid,
1428 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1429 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1431 if( SUCCEEDED(loadTypeInfo()) )
1433 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1434 pVarResult, pExcepInfo, puArgErr);
1439 inline const char *msgSeverity(int sev)
1454 STDMETHODIMP VLCMessage::get__Value(VARIANT* _Value)
1456 if( NULL == _Value )
1461 snprintf(buffer, sizeof(buffer), "%s %s %s: %s",
1462 _msg.psz_type, _msg.psz_name, msgSeverity(_msg.i_severity), _msg.psz_message);
1464 V_VT(_Value) = VT_BSTR;
1465 V_BSTR(_Value) = BSTRFromCStr(CP_UTF8, buffer);
1470 STDMETHODIMP VLCMessage::get_severity(long* level)
1475 *level = _msg.i_severity;
1480 STDMETHODIMP VLCMessage::get_type(BSTR* type)
1485 *type = BSTRFromCStr(CP_UTF8, _msg.psz_type);
1490 STDMETHODIMP VLCMessage::get_name(BSTR* name)
1495 *name = BSTRFromCStr(CP_UTF8, _msg.psz_name);
1500 STDMETHODIMP VLCMessage::get_header(BSTR* header)
1502 if( NULL == header )
1505 *header = BSTRFromCStr(CP_UTF8, _msg.psz_header);
1510 STDMETHODIMP VLCMessage::get_message(BSTR* message)
1512 if( NULL == message )
1515 *message = BSTRFromCStr(CP_UTF8, _msg.psz_message);
1520 /*******************************************************************************/
1522 VLCPlaylistItems::~VLCPlaylistItems()
1525 _p_typeinfo->Release();
1528 HRESULT VLCPlaylistItems::loadTypeInfo(void)
1530 HRESULT hr = NOERROR;
1531 if( NULL == _p_typeinfo )
1533 ITypeLib *p_typelib;
1535 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1538 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCPlaylistItems, &_p_typeinfo);
1543 p_typelib->Release();
1549 STDMETHODIMP VLCPlaylistItems::GetTypeInfoCount(UINT* pctInfo)
1551 if( NULL == pctInfo )
1552 return E_INVALIDARG;
1554 if( SUCCEEDED(loadTypeInfo()) )
1562 STDMETHODIMP VLCPlaylistItems::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1564 if( NULL == ppTInfo )
1565 return E_INVALIDARG;
1567 if( SUCCEEDED(loadTypeInfo()) )
1569 _p_typeinfo->AddRef();
1570 *ppTInfo = _p_typeinfo;
1577 STDMETHODIMP VLCPlaylistItems::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1578 UINT cNames, LCID lcid, DISPID* rgDispID)
1580 if( SUCCEEDED(loadTypeInfo()) )
1582 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1587 STDMETHODIMP VLCPlaylistItems::Invoke(DISPID dispIdMember, REFIID riid,
1588 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1589 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1591 if( SUCCEEDED(loadTypeInfo()) )
1593 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1594 pVarResult, pExcepInfo, puArgErr);
1599 STDMETHODIMP VLCPlaylistItems::get_count(long* count)
1604 libvlc_exception_t ex;
1605 libvlc_exception_init(&ex);
1607 *count = _p_instance->playlist_count(&ex);
1608 return exception_bridge(&ex);
1611 STDMETHODIMP VLCPlaylistItems::clear()
1613 libvlc_exception_t ex;
1614 libvlc_exception_init(&ex);
1616 _p_instance->playlist_clear(&ex);
1617 return exception_bridge(&ex);
1620 STDMETHODIMP VLCPlaylistItems::remove(long item)
1622 libvlc_instance_t* p_libvlc;
1623 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1626 libvlc_exception_t ex;
1627 libvlc_exception_init(&ex);
1629 _p_instance->playlist_delete_item(item, &ex);
1630 hr = exception_bridge(&ex);
1635 /*******************************************************************************/
1637 VLCPlaylist::~VLCPlaylist()
1639 delete _p_vlcplaylistitems;
1641 _p_typeinfo->Release();
1644 HRESULT VLCPlaylist::loadTypeInfo(void)
1646 HRESULT hr = NOERROR;
1647 if( NULL == _p_typeinfo )
1649 ITypeLib *p_typelib;
1651 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1654 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCPlaylist, &_p_typeinfo);
1659 p_typelib->Release();
1665 STDMETHODIMP VLCPlaylist::GetTypeInfoCount(UINT* pctInfo)
1667 if( NULL == pctInfo )
1668 return E_INVALIDARG;
1670 if( SUCCEEDED(loadTypeInfo()) )
1678 STDMETHODIMP VLCPlaylist::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1680 if( NULL == ppTInfo )
1681 return E_INVALIDARG;
1683 if( SUCCEEDED(loadTypeInfo()) )
1685 _p_typeinfo->AddRef();
1686 *ppTInfo = _p_typeinfo;
1693 STDMETHODIMP VLCPlaylist::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1694 UINT cNames, LCID lcid, DISPID* rgDispID)
1696 if( SUCCEEDED(loadTypeInfo()) )
1698 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1703 STDMETHODIMP VLCPlaylist::Invoke(DISPID dispIdMember, REFIID riid,
1704 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1705 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1707 if( SUCCEEDED(loadTypeInfo()) )
1709 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1710 pVarResult, pExcepInfo, puArgErr);
1715 STDMETHODIMP VLCPlaylist::get_itemCount(long* count)
1721 libvlc_exception_t ex;
1722 libvlc_exception_init(&ex);
1724 *count = _p_instance->playlist_count(&ex);
1725 return exception_bridge(&ex);
1728 STDMETHODIMP VLCPlaylist::get_isPlaying(VARIANT_BOOL* isPlaying)
1730 if( NULL == isPlaying )
1733 libvlc_media_player_t *p_md;
1734 HRESULT hr = _p_instance->getMD(&p_md);
1737 libvlc_exception_t ex;
1738 libvlc_exception_init(&ex);
1740 *isPlaying = libvlc_media_player_is_playing(p_md, &ex) ?
1741 VARIANT_TRUE: VARIANT_FALSE;
1742 libvlc_exception_clear(&ex);
1747 STDMETHODIMP VLCPlaylist::add(BSTR uri, VARIANT name, VARIANT options, long* item)
1752 if( 0 == SysStringLen(uri) )
1753 return E_INVALIDARG;
1755 libvlc_instance_t* p_libvlc;
1756 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1759 libvlc_exception_t ex;
1760 libvlc_exception_init(&ex);
1762 char *psz_uri = NULL;
1763 if( SysStringLen(_p_instance->getBaseURL()) > 0 )
1766 ** if the MRL a relative URL, we should end up with an absolute URL
1768 LPWSTR abs_url = CombineURL(_p_instance->getBaseURL(), uri);
1769 if( NULL != abs_url )
1771 psz_uri = CStrFromWSTR(CP_UTF8, abs_url, wcslen(abs_url));
1772 CoTaskMemFree(abs_url);
1776 psz_uri = CStrFromBSTR(CP_UTF8, uri);
1782 ** baseURL is empty, assume MRL is absolute
1784 psz_uri = CStrFromBSTR(CP_UTF8, uri);
1787 if( NULL == psz_uri )
1789 return E_OUTOFMEMORY;
1793 char **ppsz_options;
1795 hr = VLCControl::CreateTargetOptions(CP_UTF8, &options, &ppsz_options, &i_options);
1798 CoTaskMemFree(psz_uri);
1802 char *psz_name = NULL;
1804 VariantInit(&v_name);
1805 if( SUCCEEDED(VariantChangeType(&v_name, &name, 0, VT_BSTR)) )
1807 if( SysStringLen(V_BSTR(&v_name)) > 0 )
1808 psz_name = CStrFromBSTR(CP_UTF8, V_BSTR(&v_name));
1810 VariantClear(&v_name);
1813 *item = _p_instance->playlist_add_extended_untrusted(psz_uri,
1814 i_options, const_cast<const char **>(ppsz_options), &ex);
1816 VLCControl::FreeTargetOptions(ppsz_options, i_options);
1817 CoTaskMemFree(psz_uri);
1818 if( psz_name ) /* XXX Do we even need to check? */
1819 CoTaskMemFree(psz_name);
1820 hr = exception_bridge(&ex);
1825 STDMETHODIMP VLCPlaylist::play()
1827 libvlc_exception_t ex;
1828 libvlc_exception_init(&ex);
1830 _p_instance->playlist_play(&ex);
1831 return exception_bridge(&ex);
1834 STDMETHODIMP VLCPlaylist::playItem(long item)
1836 libvlc_exception_t ex;
1837 libvlc_exception_init(&ex);
1839 _p_instance->playlist_play_item(item,&ex);
1840 return exception_bridge(&ex);;
1843 STDMETHODIMP VLCPlaylist::togglePause()
1845 libvlc_media_player_t* p_md;
1846 HRESULT hr = _p_instance->getMD(&p_md);
1849 libvlc_exception_t ex;
1850 libvlc_exception_init(&ex);
1852 libvlc_media_player_pause(p_md, &ex);
1853 hr = exception_bridge(&ex);;
1858 STDMETHODIMP VLCPlaylist::stop()
1860 libvlc_media_player_t *p_md;
1861 HRESULT hr = _p_instance->getMD(&p_md);
1864 libvlc_exception_t ex;
1865 libvlc_exception_init(&ex);
1867 libvlc_media_player_stop(p_md, &ex);
1868 hr = exception_bridge(&ex);;
1873 STDMETHODIMP VLCPlaylist::next()
1875 libvlc_exception_t ex;
1876 libvlc_exception_init(&ex);
1878 _p_instance->playlist_next(&ex);
1879 return exception_bridge(&ex);;
1882 STDMETHODIMP VLCPlaylist::prev()
1884 libvlc_exception_t ex;
1885 libvlc_exception_init(&ex);
1887 _p_instance->playlist_prev(&ex);
1888 return exception_bridge(&ex);;
1891 STDMETHODIMP VLCPlaylist::clear()
1893 libvlc_exception_t ex;
1894 libvlc_exception_init(&ex);
1896 _p_instance->playlist_clear(&ex);
1897 return exception_bridge(&ex);;
1900 STDMETHODIMP VLCPlaylist::removeItem(long item)
1902 libvlc_instance_t* p_libvlc;
1903 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1906 libvlc_exception_t ex;
1907 libvlc_exception_init(&ex);
1909 _p_instance->playlist_delete_item(item, &ex);
1910 hr = exception_bridge(&ex);;
1915 STDMETHODIMP VLCPlaylist::get_items(IVLCPlaylistItems** obj)
1920 *obj = _p_vlcplaylistitems;
1921 if( NULL != _p_vlcplaylistitems )
1923 _p_vlcplaylistitems->AddRef();
1926 return E_OUTOFMEMORY;
1929 /*******************************************************************************/
1931 VLCSubtitle::~VLCSubtitle()
1934 _p_typeinfo->Release();
1937 HRESULT VLCSubtitle::loadTypeInfo(void)
1939 HRESULT hr = NOERROR;
1940 if( NULL == _p_typeinfo )
1942 ITypeLib *p_typelib;
1944 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1947 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCSubtitle, &_p_typeinfo);
1952 p_typelib->Release();
1958 STDMETHODIMP VLCSubtitle::GetTypeInfoCount(UINT* pctInfo)
1960 if( NULL == pctInfo )
1961 return E_INVALIDARG;
1963 if( SUCCEEDED(loadTypeInfo()) )
1971 STDMETHODIMP VLCSubtitle::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1973 if( NULL == ppTInfo )
1974 return E_INVALIDARG;
1976 if( SUCCEEDED(loadTypeInfo()) )
1978 _p_typeinfo->AddRef();
1979 *ppTInfo = _p_typeinfo;
1986 STDMETHODIMP VLCSubtitle::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1987 UINT cNames, LCID lcid, DISPID* rgDispID)
1989 if( SUCCEEDED(loadTypeInfo()) )
1991 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1996 STDMETHODIMP VLCSubtitle::Invoke(DISPID dispIdMember, REFIID riid,
1997 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1998 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
2000 if( SUCCEEDED(loadTypeInfo()) )
2002 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
2003 pVarResult, pExcepInfo, puArgErr);
2008 STDMETHODIMP VLCSubtitle::get_track(long* spu)
2013 libvlc_media_player_t *p_md;
2014 HRESULT hr = _p_instance->getMD(&p_md);
2017 libvlc_exception_t ex;
2018 libvlc_exception_init(&ex);
2020 *spu = libvlc_video_get_spu(p_md, &ex);
2021 hr = exception_bridge(&ex);
2026 STDMETHODIMP VLCSubtitle::put_track(long spu)
2028 libvlc_media_player_t *p_md;
2029 HRESULT hr = _p_instance->getMD(&p_md);
2032 libvlc_exception_t ex;
2033 libvlc_exception_init(&ex);
2035 libvlc_video_set_spu(p_md, spu, &ex);
2036 hr = exception_bridge(&ex);
2041 STDMETHODIMP VLCSubtitle::get_count(long* spuNumber)
2043 if( NULL == spuNumber )
2046 libvlc_media_player_t *p_md;
2047 HRESULT hr = _p_instance->getMD(&p_md);
2050 libvlc_exception_t ex;
2051 libvlc_exception_init(&ex);
2052 // get the number of video subtitle available and return it
2053 *spuNumber = libvlc_video_get_spu_count(p_md, &ex);
2054 hr = exception_bridge(&ex);
2060 STDMETHODIMP VLCSubtitle::description(long nameID, BSTR* name)
2065 libvlc_media_player_t* p_md;
2066 libvlc_exception_t ex;
2067 libvlc_exception_init(&ex);
2069 HRESULT hr = _p_instance->getMD(&p_md);
2073 const char *psz_name;
2074 libvlc_track_description_t *p_spuDesc;
2076 // get subtitles description
2077 p_spuDesc = libvlc_video_get_spu_description(p_md, &ex);
2078 hr = exception_bridge(&ex);
2082 // get the number of available subtitle
2083 i_limit = libvlc_video_get_spu_count(p_md, &ex);
2084 hr = exception_bridge(&ex);
2088 // check if the number given is a good one
2089 if ( ( nameID > ( i_limit -1 ) ) || ( nameID < 0 ) )
2092 // get the good spuDesc
2093 for( i = 0 ; i < nameID ; i++ )
2095 p_spuDesc = p_spuDesc->p_next;
2097 // get the subtitle name
2098 psz_name = p_spuDesc->psz_name;
2101 if( psz_name != NULL )
2103 *name = BSTRFromCStr(CP_UTF8, psz_name);
2104 return (NULL == *name) ? E_OUTOFMEMORY : NOERROR;
2112 /*******************************************************************************/
2114 VLCVideo::~VLCVideo()
2116 delete _p_vlcmarquee;
2118 _p_typeinfo->Release();
2121 HRESULT VLCVideo::loadTypeInfo(void)
2123 HRESULT hr = NOERROR;
2124 if( NULL == _p_typeinfo )
2126 ITypeLib *p_typelib;
2128 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
2131 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCVideo, &_p_typeinfo);
2136 p_typelib->Release();
2142 STDMETHODIMP VLCVideo::GetTypeInfoCount(UINT* pctInfo)
2144 if( NULL == pctInfo )
2145 return E_INVALIDARG;
2147 if( SUCCEEDED(loadTypeInfo()) )
2155 STDMETHODIMP VLCVideo::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
2157 if( NULL == ppTInfo )
2158 return E_INVALIDARG;
2160 if( SUCCEEDED(loadTypeInfo()) )
2162 _p_typeinfo->AddRef();
2163 *ppTInfo = _p_typeinfo;
2170 STDMETHODIMP VLCVideo::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
2171 UINT cNames, LCID lcid, DISPID* rgDispID)
2173 if( SUCCEEDED(loadTypeInfo()) )
2175 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
2180 STDMETHODIMP VLCVideo::Invoke(DISPID dispIdMember, REFIID riid,
2181 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
2182 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
2184 if( SUCCEEDED(loadTypeInfo()) )
2186 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
2187 pVarResult, pExcepInfo, puArgErr);
2192 STDMETHODIMP VLCVideo::get_fullscreen(VARIANT_BOOL* fullscreen)
2194 if( NULL == fullscreen )
2197 libvlc_media_player_t *p_md;
2198 HRESULT hr = _p_instance->getMD(&p_md);
2201 libvlc_exception_t ex;
2202 libvlc_exception_init(&ex);
2204 *fullscreen = libvlc_get_fullscreen(p_md, &ex) ?
2205 VARIANT_TRUE : VARIANT_FALSE;
2206 hr = exception_bridge(&ex);
2211 STDMETHODIMP VLCVideo::put_fullscreen(VARIANT_BOOL fullscreen)
2213 libvlc_media_player_t *p_md;
2214 HRESULT hr = _p_instance->getMD(&p_md);
2217 libvlc_exception_t ex;
2218 libvlc_exception_init(&ex);
2220 libvlc_set_fullscreen(p_md, VARIANT_FALSE != fullscreen, &ex);
2221 hr = exception_bridge(&ex);
2226 STDMETHODIMP VLCVideo::get_width(long* width)
2231 libvlc_media_player_t *p_md;
2232 HRESULT hr = _p_instance->getMD(&p_md);
2235 libvlc_exception_t ex;
2236 libvlc_exception_init(&ex);
2238 *width = libvlc_video_get_width(p_md, &ex);
2239 hr = exception_bridge(&ex);
2244 STDMETHODIMP VLCVideo::get_height(long* height)
2246 if( NULL == height )
2249 libvlc_media_player_t *p_md;
2250 HRESULT hr = _p_instance->getMD(&p_md);
2253 libvlc_exception_t ex;
2254 libvlc_exception_init(&ex);
2256 *height = libvlc_video_get_height(p_md, &ex);
2257 hr = exception_bridge(&ex);
2262 STDMETHODIMP VLCVideo::get_aspectRatio(BSTR* aspect)
2264 if( NULL == aspect )
2267 libvlc_media_player_t *p_md;
2268 HRESULT hr = _p_instance->getMD(&p_md);
2271 libvlc_exception_t ex;
2272 libvlc_exception_init(&ex);
2274 char *psz_aspect = libvlc_video_get_aspect_ratio(p_md, &ex);
2276 hr = exception_bridge(&ex);
2277 if( SUCCEEDED(hr) && NULL != psz_aspect )
2279 *aspect = BSTRFromCStr(CP_UTF8, psz_aspect);
2280 if( NULL == *aspect )
2282 } else if( NULL == psz_aspect) hr = E_OUTOFMEMORY; // strdup("") failed
2288 STDMETHODIMP VLCVideo::put_aspectRatio(BSTR aspect)
2290 if( NULL == aspect )
2293 libvlc_media_player_t *p_md;
2294 HRESULT hr = _p_instance->getMD(&p_md);
2297 libvlc_exception_t ex;
2298 libvlc_exception_init(&ex);
2300 char *psz_aspect = CStrFromBSTR(CP_UTF8, aspect);
2301 if( NULL == psz_aspect )
2303 return E_OUTOFMEMORY;
2306 libvlc_video_set_aspect_ratio(p_md, psz_aspect, &ex);
2308 CoTaskMemFree(psz_aspect);
2309 hr = exception_bridge(&ex);
2314 STDMETHODIMP VLCVideo::get_subtitle(long* spu)
2319 libvlc_media_player_t *p_md;
2320 HRESULT hr = _p_instance->getMD(&p_md);
2323 libvlc_exception_t ex;
2324 libvlc_exception_init(&ex);
2326 *spu = libvlc_video_get_spu(p_md, &ex);
2327 hr = exception_bridge(&ex);
2332 STDMETHODIMP VLCVideo::put_subtitle(long spu)
2334 libvlc_media_player_t *p_md;
2335 HRESULT hr = _p_instance->getMD(&p_md);
2338 libvlc_exception_t ex;
2339 libvlc_exception_init(&ex);
2341 libvlc_video_set_spu(p_md, spu, &ex);
2342 hr = exception_bridge(&ex);
2347 STDMETHODIMP VLCVideo::get_crop(BSTR* geometry)
2349 if( NULL == geometry )
2352 libvlc_media_player_t *p_md;
2353 HRESULT hr = _p_instance->getMD(&p_md);
2356 libvlc_exception_t ex;
2357 libvlc_exception_init(&ex);
2359 char *psz_geometry = libvlc_video_get_crop_geometry(p_md, &ex);
2361 hr = exception_bridge(&ex);
2362 if( SUCCEEDED(&ex) && NULL != psz_geometry )
2364 *geometry = BSTRFromCStr(CP_UTF8, psz_geometry);
2365 if( NULL == geometry ) hr = E_OUTOFMEMORY;
2366 } else if( NULL == psz_geometry ) hr = E_OUTOFMEMORY;
2367 free( psz_geometry );
2372 STDMETHODIMP VLCVideo::put_crop(BSTR geometry)
2374 if( NULL == geometry )
2377 if( 0 == SysStringLen(geometry) )
2378 return E_INVALIDARG;
2380 libvlc_media_player_t *p_md;
2381 HRESULT hr = _p_instance->getMD(&p_md);
2384 libvlc_exception_t ex;
2385 libvlc_exception_init(&ex);
2387 char *psz_geometry = CStrFromBSTR(CP_UTF8, geometry);
2388 if( NULL == psz_geometry )
2390 return E_OUTOFMEMORY;
2393 libvlc_video_set_crop_geometry(p_md, psz_geometry, &ex);
2395 CoTaskMemFree(psz_geometry);
2396 hr = exception_bridge(&ex);
2401 STDMETHODIMP VLCVideo::get_teletext(long* page)
2406 libvlc_media_player_t *p_md;
2407 HRESULT hr = _p_instance->getMD(&p_md);
2410 libvlc_exception_t ex;
2411 libvlc_exception_init(&ex);
2413 *page = libvlc_video_get_teletext(p_md, &ex);
2414 hr = exception_bridge(&ex);
2419 STDMETHODIMP VLCVideo::put_teletext(long page)
2421 libvlc_media_player_t *p_md;
2422 HRESULT hr = _p_instance->getMD(&p_md);
2425 libvlc_exception_t ex;
2426 libvlc_exception_init(&ex);
2428 libvlc_video_set_teletext(p_md, page, &ex);
2429 hr = exception_bridge(&ex);
2434 STDMETHODIMP VLCVideo::deinterlaceDisable()
2436 libvlc_media_player_t *p_md;
2437 HRESULT hr = _p_instance->getMD(&p_md);
2440 libvlc_exception_t ex;
2441 libvlc_exception_init(&ex);
2443 libvlc_video_set_deinterlace(p_md, 0, "", &ex);
2444 hr = exception_bridge(&ex);
2449 STDMETHODIMP VLCVideo::deinterlaceEnable(BSTR mode)
2451 libvlc_media_player_t *p_md;
2452 HRESULT hr = _p_instance->getMD(&p_md);
2455 libvlc_exception_t ex;
2456 libvlc_exception_init(&ex);
2457 /* get deinterlace mode from the user */
2458 char *psz_mode = CStrFromBSTR(CP_UTF8, mode);
2459 /* enable deinterlace filter if possible */
2460 libvlc_video_set_deinterlace(p_md, 1, psz_mode, &ex);
2461 hr = exception_bridge(&ex);
2462 CoTaskMemFree(psz_mode);
2467 STDMETHODIMP VLCVideo::takeSnapshot(LPPICTUREDISP* picture)
2469 if( NULL == picture )
2472 libvlc_media_player_t *p_md;
2473 HRESULT hr = _p_instance->getMD(&p_md);
2476 libvlc_exception_t ex;
2477 libvlc_exception_init(&ex);
2479 static int uniqueId = 0;
2480 TCHAR path[MAX_PATH+1];
2482 int pathlen = GetTempPath(MAX_PATH-24, path);
2483 if( (0 == pathlen) || (pathlen > (MAX_PATH-24)) )
2486 /* check temp directory path by openning it */
2488 HANDLE dirHandle = CreateFile(path, GENERIC_READ,
2489 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
2490 NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
2491 if( INVALID_HANDLE_VALUE == dirHandle )
2493 _p_instance->setErrorInfo(IID_IVLCVideo,
2494 "Invalid temporary directory for snapshot images, check values of TMP, TEMP envars.");
2499 BY_HANDLE_FILE_INFORMATION bhfi;
2500 BOOL res = GetFileInformationByHandle(dirHandle, &bhfi);
2501 CloseHandle(dirHandle);
2502 if( !res || !(bhfi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
2504 _p_instance->setErrorInfo(IID_IVLCVideo,
2505 "Invalid temporary directory for snapshot images, check values of TMP, TEMP envars.");
2511 TCHAR filepath[MAX_PATH+1];
2513 _stprintf(filepath, TEXT("%sAXVLC%lXS%lX.bmp"),
2514 path, GetCurrentProcessId(), ++uniqueId);
2517 /* reuse path storage for UTF8 string */
2518 char *psz_filepath = (char *)path;
2519 WCHAR* wpath = filepath;
2521 char *psz_filepath = path;
2522 /* first convert to unicode using current code page */
2523 WCHAR wpath[MAX_PATH+1];
2524 if( 0 == MultiByteToWideChar(CP_ACP, 0, filepath, -1,
2525 wpath, sizeof(wpath)/sizeof(WCHAR)) )
2528 /* convert to UTF8 */
2529 pathlen = WideCharToMultiByte(CP_UTF8, 0, wpath, -1,
2530 psz_filepath, sizeof(path), NULL, NULL);
2531 // fail if path is 0 or too short (i.e pathlen is the same as
2534 if( (0 == pathlen) || (sizeof(path) == pathlen) )
2537 /* take snapshot into file */
2538 libvlc_video_take_snapshot(p_md, psz_filepath, 0, 0, &ex);
2539 hr = exception_bridge(&ex);
2542 /* open snapshot file */
2543 HANDLE snapPic = LoadImage(NULL, filepath, IMAGE_BITMAP, 0, 0,
2544 LR_CREATEDIBSECTION|LR_LOADFROMFILE);
2549 snapDesc.cbSizeofstruct = sizeof(PICTDESC);
2550 snapDesc.picType = PICTYPE_BITMAP;
2551 snapDesc.bmp.hbitmap = (HBITMAP)snapPic;
2552 snapDesc.bmp.hpal = NULL;
2554 hr = OleCreatePictureIndirect(&snapDesc, IID_IPictureDisp,
2555 TRUE, (LPVOID*)picture);
2559 DeleteObject(snapPic);
2562 DeleteFile(filepath);
2568 STDMETHODIMP VLCVideo::toggleFullscreen()
2570 libvlc_media_player_t *p_md;
2571 HRESULT hr = _p_instance->getMD(&p_md);
2574 libvlc_exception_t ex;
2575 libvlc_exception_init(&ex);
2577 libvlc_toggle_fullscreen(p_md, &ex);
2578 hr = exception_bridge(&ex);
2583 STDMETHODIMP VLCVideo::toggleTeletext()
2585 libvlc_media_player_t *p_md;
2586 HRESULT hr = _p_instance->getMD(&p_md);
2589 libvlc_exception_t ex;
2590 libvlc_exception_init(&ex);
2592 libvlc_toggle_teletext(p_md, &ex);
2593 hr = exception_bridge(&ex);
2598 STDMETHODIMP VLCVideo::get_marquee(IVLCMarquee** obj)
2603 *obj = _p_vlcmarquee;
2604 if( NULL != _p_vlcmarquee )
2606 _p_vlcmarquee->AddRef();
2609 return E_OUTOFMEMORY;
2612 /*******************************************************************************/
2614 VLCControl2::VLCControl2(VLCPlugin *p_instance) :
2615 _p_instance(p_instance),
2619 _p_vlcplaylist(NULL),
2620 _p_vlcsubtitle(NULL),
2623 _p_vlcaudio = new VLCAudio(p_instance);
2624 _p_vlcinput = new VLCInput(p_instance);
2625 _p_vlclog = new VLCLog(p_instance);
2626 _p_vlcplaylist = new VLCPlaylist(p_instance);
2627 _p_vlcsubtitle = new VLCSubtitle(p_instance);
2628 _p_vlcvideo = new VLCVideo(p_instance);
2631 VLCControl2::~VLCControl2()
2634 delete _p_vlcsubtitle;
2635 delete _p_vlcplaylist;
2640 _p_typeinfo->Release();
2643 HRESULT VLCControl2::loadTypeInfo(void)
2645 HRESULT hr = NOERROR;
2646 if( NULL == _p_typeinfo )
2648 ITypeLib *p_typelib;
2650 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
2653 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCControl2, &_p_typeinfo);
2658 p_typelib->Release();
2664 STDMETHODIMP VLCControl2::GetTypeInfoCount(UINT* pctInfo)
2666 if( NULL == pctInfo )
2667 return E_INVALIDARG;
2669 if( SUCCEEDED(loadTypeInfo()) )
2677 STDMETHODIMP VLCControl2::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
2679 if( NULL == ppTInfo )
2680 return E_INVALIDARG;
2682 if( SUCCEEDED(loadTypeInfo()) )
2684 _p_typeinfo->AddRef();
2685 *ppTInfo = _p_typeinfo;
2692 STDMETHODIMP VLCControl2::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
2693 UINT cNames, LCID lcid, DISPID* rgDispID)
2695 if( SUCCEEDED(loadTypeInfo()) )
2697 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
2702 STDMETHODIMP VLCControl2::Invoke(DISPID dispIdMember, REFIID riid,
2703 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
2704 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
2706 if( SUCCEEDED(loadTypeInfo()) )
2708 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
2709 pVarResult, pExcepInfo, puArgErr);
2714 STDMETHODIMP VLCControl2::get_AutoLoop(VARIANT_BOOL *autoloop)
2716 if( NULL == autoloop )
2719 *autoloop = _p_instance->getAutoLoop() ? VARIANT_TRUE: VARIANT_FALSE;
2723 STDMETHODIMP VLCControl2::put_AutoLoop(VARIANT_BOOL autoloop)
2725 _p_instance->setAutoLoop((VARIANT_FALSE != autoloop) ? TRUE: FALSE);
2729 STDMETHODIMP VLCControl2::get_AutoPlay(VARIANT_BOOL *autoplay)
2731 if( NULL == autoplay )
2734 *autoplay = _p_instance->getAutoPlay() ? VARIANT_TRUE: VARIANT_FALSE;
2738 STDMETHODIMP VLCControl2::put_AutoPlay(VARIANT_BOOL autoplay)
2740 _p_instance->setAutoPlay((VARIANT_FALSE != autoplay) ? TRUE: FALSE);
2744 STDMETHODIMP VLCControl2::get_BaseURL(BSTR *url)
2749 *url = SysAllocStringLen(_p_instance->getBaseURL(),
2750 SysStringLen(_p_instance->getBaseURL()));
2754 STDMETHODIMP VLCControl2::put_BaseURL(BSTR mrl)
2756 _p_instance->setBaseURL(mrl);
2761 STDMETHODIMP VLCControl2::get_MRL(BSTR *mrl)
2766 *mrl = SysAllocStringLen(_p_instance->getMRL(),
2767 SysStringLen(_p_instance->getMRL()));
2771 STDMETHODIMP VLCControl2::put_MRL(BSTR mrl)
2773 _p_instance->setMRL(mrl);
2779 STDMETHODIMP VLCControl2::get_Toolbar(VARIANT_BOOL *visible)
2781 if( NULL == visible )
2785 * Note to developers
2787 * Returning the _b_toolbar is closer to the method specification.
2788 * But returning True when toolbar is not implemented so not displayed
2789 * could be bad for ActiveX users which rely on this value to show their
2790 * own toolbar if not provided by the ActiveX.
2792 * This is the reason why FALSE is returned, until toolbar get implemented.
2795 /* DISABLED for now */
2796 // *visible = _p_instance->getShowToolbar() ? VARIANT_TRUE: VARIANT_FALSE;
2798 *visible = VARIANT_FALSE;
2803 STDMETHODIMP VLCControl2::put_Toolbar(VARIANT_BOOL visible)
2805 _p_instance->setShowToolbar((VARIANT_FALSE != visible) ? TRUE: FALSE);
2810 STDMETHODIMP VLCControl2::get_StartTime(long *seconds)
2812 if( NULL == seconds )
2815 *seconds = _p_instance->getStartTime();
2820 STDMETHODIMP VLCControl2::put_StartTime(long seconds)
2822 _p_instance->setStartTime(seconds);
2827 STDMETHODIMP VLCControl2::get_VersionInfo(BSTR *version)
2829 if( NULL == version )
2832 const char *versionStr = libvlc_get_version();
2833 if( NULL != versionStr )
2835 *version = BSTRFromCStr(CP_UTF8, versionStr);
2837 return (NULL == *version) ? E_OUTOFMEMORY : NOERROR;
2843 STDMETHODIMP VLCControl2::get_Visible(VARIANT_BOOL *isVisible)
2845 if( NULL == isVisible )
2848 *isVisible = _p_instance->getVisible() ? VARIANT_TRUE : VARIANT_FALSE;
2853 STDMETHODIMP VLCControl2::put_Visible(VARIANT_BOOL isVisible)
2855 _p_instance->setVisible(isVisible != VARIANT_FALSE);
2860 STDMETHODIMP VLCControl2::get_Volume(long *volume)
2862 if( NULL == volume )
2865 *volume = _p_instance->getVolume();
2869 STDMETHODIMP VLCControl2::put_Volume(long volume)
2871 _p_instance->setVolume(volume);
2875 STDMETHODIMP VLCControl2::get_BackColor(OLE_COLOR *backcolor)
2877 if( NULL == backcolor )
2880 *backcolor = _p_instance->getBackColor();
2884 STDMETHODIMP VLCControl2::put_BackColor(OLE_COLOR backcolor)
2886 _p_instance->setBackColor(backcolor);
2890 STDMETHODIMP VLCControl2::get_audio(IVLCAudio** obj)
2896 if( NULL != _p_vlcaudio )
2898 _p_vlcaudio->AddRef();
2901 return E_OUTOFMEMORY;
2904 STDMETHODIMP VLCControl2::get_input(IVLCInput** obj)
2910 if( NULL != _p_vlcinput )
2912 _p_vlcinput->AddRef();
2915 return E_OUTOFMEMORY;
2918 STDMETHODIMP VLCControl2::get_log(IVLCLog** obj)
2924 if( NULL != _p_vlclog )
2926 _p_vlclog->AddRef();
2929 return E_OUTOFMEMORY;
2932 STDMETHODIMP VLCControl2::get_playlist(IVLCPlaylist** obj)
2937 *obj = _p_vlcplaylist;
2938 if( NULL != _p_vlcplaylist )
2940 _p_vlcplaylist->AddRef();
2943 return E_OUTOFMEMORY;
2946 STDMETHODIMP VLCControl2::get_subtitle(IVLCSubtitle** obj)
2951 *obj = _p_vlcsubtitle;
2952 if( NULL != _p_vlcsubtitle )
2954 _p_vlcsubtitle->AddRef();
2957 return E_OUTOFMEMORY;
2960 STDMETHODIMP VLCControl2::get_video(IVLCVideo** obj)
2966 if( NULL != _p_vlcvideo )
2968 _p_vlcvideo->AddRef();
2971 return E_OUTOFMEMORY;