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_exception_get_message(ex));
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( VLCMessageIterator )
55 EMIT_EXCEPTION_BRIDGE( VLCMessages )
56 EMIT_EXCEPTION_BRIDGE( VLCLog )
57 EMIT_EXCEPTION_BRIDGE( VLCPlaylistItems )
58 EMIT_EXCEPTION_BRIDGE( VLCPlaylist )
59 EMIT_EXCEPTION_BRIDGE( VLCVideo )
60 EMIT_EXCEPTION_BRIDGE( VLCSubtitle )
62 #undef EMIT_EXCEPTION_BRIDGE
68 _p_typeinfo->Release();
71 HRESULT VLCAudio::loadTypeInfo(void)
74 if( NULL == _p_typeinfo )
78 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
81 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCAudio, &_p_typeinfo);
92 STDMETHODIMP VLCAudio::GetTypeInfoCount(UINT* pctInfo)
97 if( SUCCEEDED(loadTypeInfo()) )
105 STDMETHODIMP VLCAudio::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
107 if( NULL == ppTInfo )
110 if( SUCCEEDED(loadTypeInfo()) )
112 _p_typeinfo->AddRef();
113 *ppTInfo = _p_typeinfo;
120 STDMETHODIMP VLCAudio::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
121 UINT cNames, LCID lcid, DISPID* rgDispID)
123 if( SUCCEEDED(loadTypeInfo()) )
125 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
130 STDMETHODIMP VLCAudio::Invoke(DISPID dispIdMember, REFIID riid,
131 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
132 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
134 if( SUCCEEDED(loadTypeInfo()) )
136 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
137 pVarResult, pExcepInfo, puArgErr);
142 STDMETHODIMP VLCAudio::get_mute(VARIANT_BOOL* mute)
147 libvlc_instance_t* p_libvlc;
148 HRESULT hr = _p_instance->getVLC(&p_libvlc);
151 libvlc_exception_t ex;
152 libvlc_exception_init(&ex);
154 *mute = libvlc_audio_get_mute(p_libvlc, &ex) ?
155 VARIANT_TRUE : VARIANT_FALSE;
156 hr = exception_bridge(&ex);
161 STDMETHODIMP VLCAudio::put_mute(VARIANT_BOOL mute)
163 libvlc_instance_t* p_libvlc;
164 HRESULT hr = _p_instance->getVLC(&p_libvlc);
167 libvlc_exception_t ex;
168 libvlc_exception_init(&ex);
170 libvlc_audio_set_mute(p_libvlc, VARIANT_FALSE != mute, &ex);
171 hr = exception_bridge(&ex);
176 STDMETHODIMP VLCAudio::get_volume(long* volume)
181 libvlc_instance_t* p_libvlc;
182 HRESULT hr = _p_instance->getVLC(&p_libvlc);
185 libvlc_exception_t ex;
186 libvlc_exception_init(&ex);
188 *volume = libvlc_audio_get_volume(p_libvlc, &ex);
189 hr = exception_bridge(&ex);
194 STDMETHODIMP VLCAudio::put_volume(long volume)
196 libvlc_instance_t* p_libvlc;
197 HRESULT hr = _p_instance->getVLC(&p_libvlc);
200 libvlc_exception_t ex;
201 libvlc_exception_init(&ex);
203 libvlc_audio_set_volume(p_libvlc, volume, &ex);
204 hr = exception_bridge(&ex);
209 STDMETHODIMP VLCAudio::get_track(long* track)
214 libvlc_media_player_t* p_md;
215 HRESULT hr = _p_instance->getMD(&p_md);
218 libvlc_exception_t ex;
219 libvlc_exception_init(&ex);
221 *track = libvlc_audio_get_track(p_md, &ex);
222 hr = exception_bridge(&ex);
227 STDMETHODIMP VLCAudio::put_track(long track)
229 libvlc_media_player_t *p_md;
230 HRESULT hr = _p_instance->getMD(&p_md);
233 libvlc_exception_t ex;
234 libvlc_exception_init(&ex);
236 libvlc_audio_set_track(p_md, track, &ex);
237 hr = exception_bridge(&ex);
242 STDMETHODIMP VLCAudio::get_count(long* trackNumber)
244 if( NULL == trackNumber )
247 libvlc_media_player_t* p_md;
248 HRESULT hr = _p_instance->getMD(&p_md);
251 libvlc_exception_t ex;
252 libvlc_exception_init(&ex);
253 // get the number of audio track available and return it
254 *trackNumber = libvlc_audio_get_track_count(p_md, &ex);
255 hr = exception_bridge(&ex);
261 STDMETHODIMP VLCAudio::description(long trackID, BSTR* name)
266 libvlc_media_player_t* p_md;
267 libvlc_exception_t ex;
268 libvlc_exception_init(&ex);
270 HRESULT hr = _p_instance->getMD(&p_md);
274 const char *psz_name;
275 libvlc_track_description_t *p_trackDesc;
277 // get tracks description
278 p_trackDesc = libvlc_audio_get_track_description(p_md, &ex);
279 hr = exception_bridge(&ex);
283 //get the number of available track
284 i_limit = libvlc_audio_get_track_count(p_md, &ex);
285 hr = exception_bridge(&ex);
289 // check if the number given is a good one
290 if ( ( trackID > ( i_limit -1 ) ) || ( trackID < 0 ) )
293 // get the good trackDesc
294 for( i = 0 ; i < trackID ; i++ )
296 p_trackDesc = p_trackDesc->p_next;
298 // get the track name
299 psz_name = p_trackDesc->psz_name;
302 if( psz_name != NULL )
304 *name = BSTRFromCStr(CP_UTF8, psz_name);
305 return (NULL == *name) ? E_OUTOFMEMORY : NOERROR;
313 STDMETHODIMP VLCAudio::get_channel(long *channel)
315 if( NULL == channel )
318 libvlc_instance_t* p_libvlc;
319 HRESULT hr = _p_instance->getVLC(&p_libvlc);
322 libvlc_exception_t ex;
323 libvlc_exception_init(&ex);
325 *channel = libvlc_audio_get_channel(p_libvlc, &ex);
326 hr = exception_bridge(&ex);
331 STDMETHODIMP VLCAudio::put_channel(long channel)
333 libvlc_instance_t* p_libvlc;
334 HRESULT hr = _p_instance->getVLC(&p_libvlc);
337 libvlc_exception_t ex;
338 libvlc_exception_init(&ex);
340 libvlc_audio_set_channel(p_libvlc, channel, &ex);
341 hr = exception_bridge(&ex);
346 STDMETHODIMP VLCAudio::toggleMute()
348 libvlc_instance_t* p_libvlc;
349 HRESULT hr = _p_instance->getVLC(&p_libvlc);
352 libvlc_exception_t ex;
353 libvlc_exception_init(&ex);
355 libvlc_audio_toggle_mute(p_libvlc, &ex);
356 hr = exception_bridge(&ex);
361 /*******************************************************************************/
363 VLCInput::~VLCInput()
366 _p_typeinfo->Release();
369 HRESULT VLCInput::loadTypeInfo(void)
371 HRESULT hr = NOERROR;
372 if( NULL == _p_typeinfo )
376 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
379 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCInput, &_p_typeinfo);
384 p_typelib->Release();
390 STDMETHODIMP VLCInput::GetTypeInfoCount(UINT* pctInfo)
392 if( NULL == pctInfo )
395 if( SUCCEEDED(loadTypeInfo()) )
403 STDMETHODIMP VLCInput::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
405 if( NULL == ppTInfo )
408 if( SUCCEEDED(loadTypeInfo()) )
410 _p_typeinfo->AddRef();
411 *ppTInfo = _p_typeinfo;
418 STDMETHODIMP VLCInput::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
419 UINT cNames, LCID lcid, DISPID* rgDispID)
421 if( SUCCEEDED(loadTypeInfo()) )
423 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
428 STDMETHODIMP VLCInput::Invoke(DISPID dispIdMember, REFIID riid,
429 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
430 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
432 if( SUCCEEDED(loadTypeInfo()) )
434 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
435 pVarResult, pExcepInfo, puArgErr);
440 STDMETHODIMP VLCInput::get_length(double* length)
446 libvlc_media_player_t *p_md;
447 HRESULT hr = _p_instance->getMD(&p_md);
450 libvlc_exception_t ex;
451 libvlc_exception_init(&ex);
453 *length = (double)libvlc_media_player_get_length(p_md, &ex);
454 hr = exception_bridge(&ex);
459 STDMETHODIMP VLCInput::get_position(double* position)
461 if( NULL == position )
465 libvlc_media_player_t *p_md;
466 HRESULT hr = _p_instance->getMD(&p_md);
469 libvlc_exception_t ex;
470 libvlc_exception_init(&ex);
472 *position = libvlc_media_player_get_position(p_md, &ex);
473 hr = exception_bridge(&ex);
478 STDMETHODIMP VLCInput::put_position(double position)
480 libvlc_media_player_t *p_md;
481 HRESULT hr = _p_instance->getMD(&p_md);
484 libvlc_exception_t ex;
485 libvlc_exception_init(&ex);
487 libvlc_media_player_set_position(p_md, position, &ex);
488 hr = exception_bridge(&ex);
493 STDMETHODIMP VLCInput::get_time(double* time)
498 libvlc_media_player_t *p_md;
499 HRESULT hr = _p_instance->getMD(&p_md);
502 libvlc_exception_t ex;
503 libvlc_exception_init(&ex);
505 *time = (double)libvlc_media_player_get_time(p_md, &ex);
506 hr = exception_bridge(&ex);
511 STDMETHODIMP VLCInput::put_time(double time)
513 libvlc_media_player_t *p_md;
514 HRESULT hr = _p_instance->getMD(&p_md);
517 libvlc_exception_t ex;
518 libvlc_exception_init(&ex);
520 libvlc_media_player_set_time(p_md, (int64_t)time, &ex);
521 hr = exception_bridge(&ex);
526 STDMETHODIMP VLCInput::get_state(long* state)
531 libvlc_media_player_t *p_md;
532 HRESULT hr = _p_instance->getMD(&p_md);
535 libvlc_exception_t ex;
536 libvlc_exception_init(&ex);
538 *state = libvlc_media_player_get_state(p_md, &ex);
539 if( libvlc_exception_raised(&ex) )
541 // don't fail, just return the idle state
543 libvlc_exception_clear(&ex);
549 STDMETHODIMP VLCInput::get_rate(double* rate)
554 libvlc_media_player_t *p_md;
555 HRESULT hr = _p_instance->getMD(&p_md);
558 libvlc_exception_t ex;
559 libvlc_exception_init(&ex);
561 *rate = libvlc_media_player_get_rate(p_md, &ex);
562 hr = exception_bridge(&ex);
567 STDMETHODIMP VLCInput::put_rate(double rate)
569 libvlc_media_player_t *p_md;
570 HRESULT hr = _p_instance->getMD(&p_md);
573 libvlc_exception_t ex;
574 libvlc_exception_init(&ex);
576 libvlc_media_player_set_rate(p_md, rate, &ex);
577 hr = exception_bridge(&ex);
582 STDMETHODIMP VLCInput::get_fps(double* fps)
588 libvlc_media_player_t *p_md;
589 HRESULT hr = _p_instance->getMD(&p_md);
592 libvlc_exception_t ex;
593 libvlc_exception_init(&ex);
595 *fps = libvlc_media_player_get_fps(p_md, &ex);
596 hr = exception_bridge(&ex);
601 STDMETHODIMP VLCInput::get_hasVout(VARIANT_BOOL* hasVout)
603 if( NULL == hasVout )
606 libvlc_media_player_t *p_md;
607 HRESULT hr = _p_instance->getMD(&p_md);
610 libvlc_exception_t ex;
611 libvlc_exception_init(&ex);
613 *hasVout = libvlc_media_player_has_vout(p_md, &ex) ?
614 VARIANT_TRUE : VARIANT_FALSE;
615 hr = exception_bridge(&ex);
620 /*******************************************************************************/
624 delete _p_vlcmessages;
626 libvlc_log_close(_p_log, NULL);
629 _p_typeinfo->Release();
632 HRESULT VLCLog::loadTypeInfo(void)
634 HRESULT hr = NOERROR;
635 if( NULL == _p_typeinfo )
639 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
642 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCLog, &_p_typeinfo);
647 p_typelib->Release();
653 STDMETHODIMP VLCLog::GetTypeInfoCount(UINT* pctInfo)
655 if( NULL == pctInfo )
658 if( SUCCEEDED(loadTypeInfo()) )
666 STDMETHODIMP VLCLog::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
668 if( NULL == ppTInfo )
671 if( SUCCEEDED(loadTypeInfo()) )
673 _p_typeinfo->AddRef();
674 *ppTInfo = _p_typeinfo;
681 STDMETHODIMP VLCLog::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
682 UINT cNames, LCID lcid, DISPID* rgDispID)
684 if( SUCCEEDED(loadTypeInfo()) )
686 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
691 STDMETHODIMP VLCLog::Invoke(DISPID dispIdMember, REFIID riid,
692 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
693 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
695 if( SUCCEEDED(loadTypeInfo()) )
697 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
698 pVarResult, pExcepInfo, puArgErr);
703 STDMETHODIMP VLCLog::get_messages(IVLCMessages** obj)
708 *obj = _p_vlcmessages;
709 if( NULL != _p_vlcmessages )
711 _p_vlcmessages->AddRef();
714 return E_OUTOFMEMORY;
717 STDMETHODIMP VLCLog::get_verbosity(long* level)
724 libvlc_instance_t* p_libvlc;
725 HRESULT hr = _p_instance->getVLC(&p_libvlc);
728 libvlc_exception_t ex;
729 libvlc_exception_init(&ex);
731 *level = libvlc_get_log_verbosity(p_libvlc, &ex);
732 hr = exception_bridge(&ex);
738 /* log is not enabled, return -1 */
744 STDMETHODIMP VLCLog::put_verbosity(long verbosity)
746 libvlc_instance_t* p_libvlc;
747 HRESULT hr = _p_instance->getVLC(&p_libvlc);
750 libvlc_exception_t ex;
751 libvlc_exception_init(&ex);
757 _p_log = libvlc_log_open(p_libvlc, &ex);
758 hr = exception_bridge(&ex);
761 libvlc_set_log_verbosity(p_libvlc, (unsigned)verbosity, &ex);
765 /* close log when verbosity is set to -1 */
766 libvlc_log_close(_p_log, &ex);
769 hr = exception_bridge(&ex);
774 /*******************************************************************************/
776 /* STL forward iterator used by VLCEnumIterator class to implement IEnumVARIANT */
778 class VLCMessageSTLIterator
783 VLCMessageSTLIterator(IVLCMessageIterator* iter) : iter(iter), msg(NULL)
789 VLCMessageSTLIterator(const VLCMessageSTLIterator& other)
799 virtual ~VLCMessageSTLIterator()
808 // we only need prefix ++ operator
809 VLCMessageSTLIterator& operator++()
811 VARIANT_BOOL hasNext = VARIANT_FALSE;
814 iter->get_hasNext(&hasNext);
821 if( VARIANT_TRUE == hasNext ) {
828 VARIANT operator*() const
834 if( SUCCEEDED(msg->QueryInterface(IID_IDispatch,
835 (LPVOID*)&V_DISPATCH(&v))) )
837 V_VT(&v) = VT_DISPATCH;
843 bool operator==(const VLCMessageSTLIterator& other) const
845 return msg == other.msg;
848 bool operator!=(const VLCMessageSTLIterator& other) const
850 return msg != other.msg;
854 IVLCMessageIterator* iter;
858 ////////////////////////////////////////////////////////////////////////////////////////////////////////////
860 VLCMessages::~VLCMessages()
863 _p_typeinfo->Release();
866 HRESULT VLCMessages::loadTypeInfo(void)
868 HRESULT hr = NOERROR;
869 if( NULL == _p_typeinfo )
873 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
876 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessages, &_p_typeinfo);
881 p_typelib->Release();
887 STDMETHODIMP VLCMessages::GetTypeInfoCount(UINT* pctInfo)
889 if( NULL == pctInfo )
892 if( SUCCEEDED(loadTypeInfo()) )
900 STDMETHODIMP VLCMessages::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
902 if( NULL == ppTInfo )
905 if( SUCCEEDED(loadTypeInfo()) )
907 _p_typeinfo->AddRef();
908 *ppTInfo = _p_typeinfo;
915 STDMETHODIMP VLCMessages::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
916 UINT cNames, LCID lcid, DISPID* rgDispID)
918 if( SUCCEEDED(loadTypeInfo()) )
920 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
925 STDMETHODIMP VLCMessages::Invoke(DISPID dispIdMember, REFIID riid,
926 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
927 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
929 if( SUCCEEDED(loadTypeInfo()) )
931 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
932 pVarResult, pExcepInfo, puArgErr);
937 STDMETHODIMP VLCMessages::get__NewEnum(LPUNKNOWN* _NewEnum)
939 if( NULL == _NewEnum )
942 IVLCMessageIterator* iter = NULL;
945 *_NewEnum= new VLCEnumIterator<IID_IEnumVARIANT,
948 VLCMessageSTLIterator>
949 (VLCMessageSTLIterator(iter), VLCMessageSTLIterator(NULL));
951 return *_NewEnum ? S_OK : E_OUTOFMEMORY;
954 STDMETHODIMP VLCMessages::clear()
956 HRESULT hr = NOERROR;
957 libvlc_log_t *p_log = _p_vlclog->_p_log;
960 libvlc_exception_t ex;
961 libvlc_exception_init(&ex);
963 libvlc_log_clear(p_log, &ex);
964 hr = exception_bridge(&ex);
969 STDMETHODIMP VLCMessages::get_count(long* count)
976 libvlc_log_t *p_log = _p_vlclog->_p_log;
979 libvlc_exception_t ex;
980 libvlc_exception_init(&ex);
982 *count = libvlc_log_count(p_log, &ex);
983 hr = exception_bridge(&ex);
990 STDMETHODIMP VLCMessages::iterator(IVLCMessageIterator** iter)
995 *iter = new VLCMessageIterator(_p_instance, _p_vlclog);
997 return *iter ? S_OK : E_OUTOFMEMORY;
1000 /*******************************************************************************/
1002 VLCMessageIterator::VLCMessageIterator(VLCPlugin *p_instance, VLCLog* p_vlclog ) :
1003 _p_instance(p_instance),
1008 if( p_vlclog->_p_log )
1010 _p_iter = libvlc_log_get_iterator(p_vlclog->_p_log, NULL);
1016 VLCMessageIterator::~VLCMessageIterator()
1019 libvlc_log_iterator_free(_p_iter, NULL);
1022 _p_typeinfo->Release();
1025 HRESULT VLCMessageIterator::loadTypeInfo(void)
1027 HRESULT hr = NOERROR;
1028 if( NULL == _p_typeinfo )
1030 ITypeLib *p_typelib;
1032 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1035 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessageIterator, &_p_typeinfo);
1040 p_typelib->Release();
1046 STDMETHODIMP VLCMessageIterator::GetTypeInfoCount(UINT* pctInfo)
1048 if( NULL == pctInfo )
1049 return E_INVALIDARG;
1051 if( SUCCEEDED(loadTypeInfo()) )
1059 STDMETHODIMP VLCMessageIterator::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1061 if( NULL == ppTInfo )
1062 return E_INVALIDARG;
1064 if( SUCCEEDED(loadTypeInfo()) )
1066 _p_typeinfo->AddRef();
1067 *ppTInfo = _p_typeinfo;
1074 STDMETHODIMP VLCMessageIterator::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1075 UINT cNames, LCID lcid, DISPID* rgDispID)
1077 if( SUCCEEDED(loadTypeInfo()) )
1079 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1084 STDMETHODIMP VLCMessageIterator::Invoke(DISPID dispIdMember, REFIID riid,
1085 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1086 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1088 if( SUCCEEDED(loadTypeInfo()) )
1090 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1091 pVarResult, pExcepInfo, puArgErr);
1096 STDMETHODIMP VLCMessageIterator::get_hasNext(VARIANT_BOOL* hasNext)
1100 if( NULL == hasNext )
1103 if( _p_iter && _p_vlclog->_p_log )
1105 libvlc_exception_t ex;
1106 libvlc_exception_init(&ex);
1108 *hasNext = libvlc_log_iterator_has_next(_p_iter, &ex) ?
1109 VARIANT_TRUE : VARIANT_FALSE;
1110 hr = exception_bridge(&ex);
1114 *hasNext = VARIANT_FALSE;
1119 STDMETHODIMP VLCMessageIterator::next(IVLCMessage** message)
1123 if( NULL == message )
1126 if( _p_iter && _p_vlclog->_p_log )
1128 struct libvlc_log_message_t buffer;
1130 buffer.sizeof_msg = sizeof(buffer);
1132 libvlc_exception_t ex;
1133 libvlc_exception_init(&ex);
1135 libvlc_log_iterator_next(_p_iter, &buffer, &ex);
1136 hr = exception_bridge(&ex);
1139 *message = new VLCMessage(_p_instance, buffer);
1147 /*******************************************************************************/
1149 VLCMessage::~VLCMessage()
1152 _p_typeinfo->Release();
1155 HRESULT VLCMessage::loadTypeInfo(void)
1157 HRESULT hr = NOERROR;
1158 if( NULL == _p_typeinfo )
1160 ITypeLib *p_typelib;
1162 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1165 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessage, &_p_typeinfo);
1170 p_typelib->Release();
1176 STDMETHODIMP VLCMessage::GetTypeInfoCount(UINT* pctInfo)
1178 if( NULL == pctInfo )
1179 return E_INVALIDARG;
1181 if( SUCCEEDED(loadTypeInfo()) )
1189 STDMETHODIMP VLCMessage::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1191 if( NULL == ppTInfo )
1192 return E_INVALIDARG;
1194 if( SUCCEEDED(loadTypeInfo()) )
1196 _p_typeinfo->AddRef();
1197 *ppTInfo = _p_typeinfo;
1204 STDMETHODIMP VLCMessage::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1205 UINT cNames, LCID lcid, DISPID* rgDispID)
1207 if( SUCCEEDED(loadTypeInfo()) )
1209 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1214 STDMETHODIMP VLCMessage::Invoke(DISPID dispIdMember, REFIID riid,
1215 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1216 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1218 if( SUCCEEDED(loadTypeInfo()) )
1220 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1221 pVarResult, pExcepInfo, puArgErr);
1226 inline const char *msgSeverity(int sev)
1241 STDMETHODIMP VLCMessage::get__Value(VARIANT* _Value)
1243 if( NULL == _Value )
1248 snprintf(buffer, sizeof(buffer), "%s %s %s: %s",
1249 _msg.psz_type, _msg.psz_name, msgSeverity(_msg.i_severity), _msg.psz_message);
1251 V_VT(_Value) = VT_BSTR;
1252 V_BSTR(_Value) = BSTRFromCStr(CP_UTF8, buffer);
1257 STDMETHODIMP VLCMessage::get_severity(long* level)
1262 *level = _msg.i_severity;
1267 STDMETHODIMP VLCMessage::get_type(BSTR* type)
1272 *type = BSTRFromCStr(CP_UTF8, _msg.psz_type);
1277 STDMETHODIMP VLCMessage::get_name(BSTR* name)
1282 *name = BSTRFromCStr(CP_UTF8, _msg.psz_name);
1287 STDMETHODIMP VLCMessage::get_header(BSTR* header)
1289 if( NULL == header )
1292 *header = BSTRFromCStr(CP_UTF8, _msg.psz_header);
1297 STDMETHODIMP VLCMessage::get_message(BSTR* message)
1299 if( NULL == message )
1302 *message = BSTRFromCStr(CP_UTF8, _msg.psz_message);
1307 /*******************************************************************************/
1309 VLCPlaylistItems::~VLCPlaylistItems()
1312 _p_typeinfo->Release();
1315 HRESULT VLCPlaylistItems::loadTypeInfo(void)
1317 HRESULT hr = NOERROR;
1318 if( NULL == _p_typeinfo )
1320 ITypeLib *p_typelib;
1322 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1325 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCPlaylistItems, &_p_typeinfo);
1330 p_typelib->Release();
1336 STDMETHODIMP VLCPlaylistItems::GetTypeInfoCount(UINT* pctInfo)
1338 if( NULL == pctInfo )
1339 return E_INVALIDARG;
1341 if( SUCCEEDED(loadTypeInfo()) )
1349 STDMETHODIMP VLCPlaylistItems::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1351 if( NULL == ppTInfo )
1352 return E_INVALIDARG;
1354 if( SUCCEEDED(loadTypeInfo()) )
1356 _p_typeinfo->AddRef();
1357 *ppTInfo = _p_typeinfo;
1364 STDMETHODIMP VLCPlaylistItems::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1365 UINT cNames, LCID lcid, DISPID* rgDispID)
1367 if( SUCCEEDED(loadTypeInfo()) )
1369 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1374 STDMETHODIMP VLCPlaylistItems::Invoke(DISPID dispIdMember, REFIID riid,
1375 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1376 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1378 if( SUCCEEDED(loadTypeInfo()) )
1380 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1381 pVarResult, pExcepInfo, puArgErr);
1386 STDMETHODIMP VLCPlaylistItems::get_count(long* count)
1391 libvlc_exception_t ex;
1392 libvlc_exception_init(&ex);
1394 *count = _p_instance->playlist_count(&ex);
1395 return exception_bridge(&ex);
1398 STDMETHODIMP VLCPlaylistItems::clear()
1400 libvlc_exception_t ex;
1401 libvlc_exception_init(&ex);
1403 _p_instance->playlist_clear(&ex);
1404 return exception_bridge(&ex);
1407 STDMETHODIMP VLCPlaylistItems::remove(long item)
1409 libvlc_instance_t* p_libvlc;
1410 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1413 libvlc_exception_t ex;
1414 libvlc_exception_init(&ex);
1416 _p_instance->playlist_delete_item(item, &ex);
1417 hr = exception_bridge(&ex);
1422 /*******************************************************************************/
1424 VLCPlaylist::~VLCPlaylist()
1426 delete _p_vlcplaylistitems;
1428 _p_typeinfo->Release();
1431 HRESULT VLCPlaylist::loadTypeInfo(void)
1433 HRESULT hr = NOERROR;
1434 if( NULL == _p_typeinfo )
1436 ITypeLib *p_typelib;
1438 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1441 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCPlaylist, &_p_typeinfo);
1446 p_typelib->Release();
1452 STDMETHODIMP VLCPlaylist::GetTypeInfoCount(UINT* pctInfo)
1454 if( NULL == pctInfo )
1455 return E_INVALIDARG;
1457 if( SUCCEEDED(loadTypeInfo()) )
1465 STDMETHODIMP VLCPlaylist::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1467 if( NULL == ppTInfo )
1468 return E_INVALIDARG;
1470 if( SUCCEEDED(loadTypeInfo()) )
1472 _p_typeinfo->AddRef();
1473 *ppTInfo = _p_typeinfo;
1480 STDMETHODIMP VLCPlaylist::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1481 UINT cNames, LCID lcid, DISPID* rgDispID)
1483 if( SUCCEEDED(loadTypeInfo()) )
1485 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1490 STDMETHODIMP VLCPlaylist::Invoke(DISPID dispIdMember, REFIID riid,
1491 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1492 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1494 if( SUCCEEDED(loadTypeInfo()) )
1496 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1497 pVarResult, pExcepInfo, puArgErr);
1502 STDMETHODIMP VLCPlaylist::get_itemCount(long* count)
1508 libvlc_exception_t ex;
1509 libvlc_exception_init(&ex);
1511 *count = _p_instance->playlist_count(&ex);
1512 return exception_bridge(&ex);
1515 STDMETHODIMP VLCPlaylist::get_isPlaying(VARIANT_BOOL* isPlaying)
1517 if( NULL == isPlaying )
1520 libvlc_media_player_t *p_md;
1521 HRESULT hr = _p_instance->getMD(&p_md);
1524 libvlc_exception_t ex;
1525 libvlc_exception_init(&ex);
1527 *isPlaying = libvlc_media_player_is_playing(p_md, &ex) ?
1528 VARIANT_TRUE: VARIANT_FALSE;
1529 libvlc_exception_clear(&ex);
1534 STDMETHODIMP VLCPlaylist::add(BSTR uri, VARIANT name, VARIANT options, long* item)
1539 if( 0 == SysStringLen(uri) )
1540 return E_INVALIDARG;
1542 libvlc_instance_t* p_libvlc;
1543 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1546 libvlc_exception_t ex;
1547 libvlc_exception_init(&ex);
1549 char *psz_uri = NULL;
1550 if( SysStringLen(_p_instance->getBaseURL()) > 0 )
1553 ** if the MRL a relative URL, we should end up with an absolute URL
1555 LPWSTR abs_url = CombineURL(_p_instance->getBaseURL(), uri);
1556 if( NULL != abs_url )
1558 psz_uri = CStrFromWSTR(CP_UTF8, abs_url, wcslen(abs_url));
1559 CoTaskMemFree(abs_url);
1563 psz_uri = CStrFromBSTR(CP_UTF8, uri);
1569 ** baseURL is empty, assume MRL is absolute
1571 psz_uri = CStrFromBSTR(CP_UTF8, uri);
1574 if( NULL == psz_uri )
1576 return E_OUTOFMEMORY;
1580 char **ppsz_options;
1582 hr = VLCControl::CreateTargetOptions(CP_UTF8, &options, &ppsz_options, &i_options);
1585 CoTaskMemFree(psz_uri);
1589 char *psz_name = NULL;
1591 VariantInit(&v_name);
1592 if( SUCCEEDED(VariantChangeType(&v_name, &name, 0, VT_BSTR)) )
1594 if( SysStringLen(V_BSTR(&v_name)) > 0 )
1595 psz_name = CStrFromBSTR(CP_UTF8, V_BSTR(&v_name));
1597 VariantClear(&v_name);
1600 *item = _p_instance->playlist_add_extended_untrusted(psz_uri,
1601 i_options, const_cast<const char **>(ppsz_options), &ex);
1603 VLCControl::FreeTargetOptions(ppsz_options, i_options);
1604 CoTaskMemFree(psz_uri);
1605 if( psz_name ) /* XXX Do we even need to check? */
1606 CoTaskMemFree(psz_name);
1607 hr = exception_bridge(&ex);
1612 STDMETHODIMP VLCPlaylist::play()
1614 libvlc_exception_t ex;
1615 libvlc_exception_init(&ex);
1617 _p_instance->playlist_play(&ex);
1618 return exception_bridge(&ex);
1621 STDMETHODIMP VLCPlaylist::playItem(long item)
1623 libvlc_exception_t ex;
1624 libvlc_exception_init(&ex);
1626 _p_instance->playlist_play_item(item,&ex);
1627 return exception_bridge(&ex);;
1630 STDMETHODIMP VLCPlaylist::togglePause()
1632 libvlc_media_player_t* p_md;
1633 HRESULT hr = _p_instance->getMD(&p_md);
1636 libvlc_exception_t ex;
1637 libvlc_exception_init(&ex);
1639 libvlc_media_player_pause(p_md, &ex);
1640 hr = exception_bridge(&ex);;
1645 STDMETHODIMP VLCPlaylist::stop()
1647 libvlc_media_player_t *p_md;
1648 HRESULT hr = _p_instance->getMD(&p_md);
1651 libvlc_exception_t ex;
1652 libvlc_exception_init(&ex);
1654 libvlc_media_player_stop(p_md, &ex);
1655 hr = exception_bridge(&ex);;
1660 STDMETHODIMP VLCPlaylist::next()
1662 libvlc_exception_t ex;
1663 libvlc_exception_init(&ex);
1665 _p_instance->playlist_next(&ex);
1666 return exception_bridge(&ex);;
1669 STDMETHODIMP VLCPlaylist::prev()
1671 libvlc_exception_t ex;
1672 libvlc_exception_init(&ex);
1674 _p_instance->playlist_prev(&ex);
1675 return exception_bridge(&ex);;
1678 STDMETHODIMP VLCPlaylist::clear()
1680 libvlc_exception_t ex;
1681 libvlc_exception_init(&ex);
1683 _p_instance->playlist_clear(&ex);
1684 return exception_bridge(&ex);;
1687 STDMETHODIMP VLCPlaylist::removeItem(long item)
1689 libvlc_instance_t* p_libvlc;
1690 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1693 libvlc_exception_t ex;
1694 libvlc_exception_init(&ex);
1696 _p_instance->playlist_delete_item(item, &ex);
1697 hr = exception_bridge(&ex);;
1702 STDMETHODIMP VLCPlaylist::get_items(IVLCPlaylistItems** obj)
1707 *obj = _p_vlcplaylistitems;
1708 if( NULL != _p_vlcplaylistitems )
1710 _p_vlcplaylistitems->AddRef();
1713 return E_OUTOFMEMORY;
1716 /*******************************************************************************/
1718 VLCSubtitle::~VLCSubtitle()
1721 _p_typeinfo->Release();
1724 HRESULT VLCSubtitle::loadTypeInfo(void)
1726 HRESULT hr = NOERROR;
1727 if( NULL == _p_typeinfo )
1729 ITypeLib *p_typelib;
1731 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1734 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCSubtitle, &_p_typeinfo);
1739 p_typelib->Release();
1745 STDMETHODIMP VLCSubtitle::GetTypeInfoCount(UINT* pctInfo)
1747 if( NULL == pctInfo )
1748 return E_INVALIDARG;
1750 if( SUCCEEDED(loadTypeInfo()) )
1758 STDMETHODIMP VLCSubtitle::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1760 if( NULL == ppTInfo )
1761 return E_INVALIDARG;
1763 if( SUCCEEDED(loadTypeInfo()) )
1765 _p_typeinfo->AddRef();
1766 *ppTInfo = _p_typeinfo;
1773 STDMETHODIMP VLCSubtitle::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1774 UINT cNames, LCID lcid, DISPID* rgDispID)
1776 if( SUCCEEDED(loadTypeInfo()) )
1778 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1783 STDMETHODIMP VLCSubtitle::Invoke(DISPID dispIdMember, REFIID riid,
1784 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1785 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1787 if( SUCCEEDED(loadTypeInfo()) )
1789 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1790 pVarResult, pExcepInfo, puArgErr);
1795 STDMETHODIMP VLCSubtitle::get_track(long* spu)
1800 libvlc_media_player_t *p_md;
1801 HRESULT hr = _p_instance->getMD(&p_md);
1804 libvlc_exception_t ex;
1805 libvlc_exception_init(&ex);
1807 *spu = libvlc_video_get_spu(p_md, &ex);
1808 hr = exception_bridge(&ex);
1813 STDMETHODIMP VLCSubtitle::put_track(long spu)
1815 libvlc_media_player_t *p_md;
1816 HRESULT hr = _p_instance->getMD(&p_md);
1819 libvlc_exception_t ex;
1820 libvlc_exception_init(&ex);
1822 libvlc_video_set_spu(p_md, spu, &ex);
1823 hr = exception_bridge(&ex);
1828 STDMETHODIMP VLCSubtitle::get_count(long* spuNumber)
1830 if( NULL == spuNumber )
1833 libvlc_media_player_t *p_md;
1834 HRESULT hr = _p_instance->getMD(&p_md);
1837 libvlc_exception_t ex;
1838 libvlc_exception_init(&ex);
1839 // get the number of video subtitle available and return it
1840 *spuNumber = libvlc_video_get_spu_count(p_md, &ex);
1841 hr = exception_bridge(&ex);
1847 STDMETHODIMP VLCSubtitle::description(long nameID, BSTR* name)
1852 libvlc_media_player_t* p_md;
1853 libvlc_exception_t ex;
1854 libvlc_exception_init(&ex);
1856 HRESULT hr = _p_instance->getMD(&p_md);
1860 const char *psz_name;
1861 libvlc_track_description_t *p_spuDesc;
1863 // get subtitles description
1864 p_spuDesc = libvlc_video_get_spu_description(p_md, &ex);
1865 hr = exception_bridge(&ex);
1869 // get the number of available subtitle
1870 i_limit = libvlc_video_get_spu_count(p_md, &ex);
1871 hr = exception_bridge(&ex);
1875 // check if the number given is a good one
1876 if ( ( nameID > ( i_limit -1 ) ) || ( nameID < 0 ) )
1879 // get the good spuDesc
1880 for( i = 0 ; i < nameID ; i++ )
1882 p_spuDesc = p_spuDesc->p_next;
1884 // get the subtitle name
1885 psz_name = p_spuDesc->psz_name;
1888 if( psz_name != NULL )
1890 *name = BSTRFromCStr(CP_UTF8, psz_name);
1891 return (NULL == *name) ? E_OUTOFMEMORY : NOERROR;
1899 /*******************************************************************************/
1901 VLCVideo::~VLCVideo()
1904 _p_typeinfo->Release();
1907 HRESULT VLCVideo::loadTypeInfo(void)
1909 HRESULT hr = NOERROR;
1910 if( NULL == _p_typeinfo )
1912 ITypeLib *p_typelib;
1914 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1917 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCVideo, &_p_typeinfo);
1922 p_typelib->Release();
1928 STDMETHODIMP VLCVideo::GetTypeInfoCount(UINT* pctInfo)
1930 if( NULL == pctInfo )
1931 return E_INVALIDARG;
1933 if( SUCCEEDED(loadTypeInfo()) )
1941 STDMETHODIMP VLCVideo::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1943 if( NULL == ppTInfo )
1944 return E_INVALIDARG;
1946 if( SUCCEEDED(loadTypeInfo()) )
1948 _p_typeinfo->AddRef();
1949 *ppTInfo = _p_typeinfo;
1956 STDMETHODIMP VLCVideo::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1957 UINT cNames, LCID lcid, DISPID* rgDispID)
1959 if( SUCCEEDED(loadTypeInfo()) )
1961 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1966 STDMETHODIMP VLCVideo::Invoke(DISPID dispIdMember, REFIID riid,
1967 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1968 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1970 if( SUCCEEDED(loadTypeInfo()) )
1972 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1973 pVarResult, pExcepInfo, puArgErr);
1978 STDMETHODIMP VLCVideo::get_fullscreen(VARIANT_BOOL* fullscreen)
1980 if( NULL == fullscreen )
1983 libvlc_media_player_t *p_md;
1984 HRESULT hr = _p_instance->getMD(&p_md);
1987 libvlc_exception_t ex;
1988 libvlc_exception_init(&ex);
1990 *fullscreen = libvlc_get_fullscreen(p_md, &ex) ?
1991 VARIANT_TRUE : VARIANT_FALSE;
1992 hr = exception_bridge(&ex);
1997 STDMETHODIMP VLCVideo::put_fullscreen(VARIANT_BOOL fullscreen)
1999 libvlc_media_player_t *p_md;
2000 HRESULT hr = _p_instance->getMD(&p_md);
2003 libvlc_exception_t ex;
2004 libvlc_exception_init(&ex);
2006 libvlc_set_fullscreen(p_md, VARIANT_FALSE != fullscreen, &ex);
2007 hr = exception_bridge(&ex);
2012 STDMETHODIMP VLCVideo::get_width(long* width)
2017 libvlc_media_player_t *p_md;
2018 HRESULT hr = _p_instance->getMD(&p_md);
2021 libvlc_exception_t ex;
2022 libvlc_exception_init(&ex);
2024 *width = libvlc_video_get_width(p_md, &ex);
2025 hr = exception_bridge(&ex);
2030 STDMETHODIMP VLCVideo::get_height(long* height)
2032 if( NULL == height )
2035 libvlc_media_player_t *p_md;
2036 HRESULT hr = _p_instance->getMD(&p_md);
2039 libvlc_exception_t ex;
2040 libvlc_exception_init(&ex);
2042 *height = libvlc_video_get_height(p_md, &ex);
2043 hr = exception_bridge(&ex);
2048 STDMETHODIMP VLCVideo::get_aspectRatio(BSTR* aspect)
2050 if( NULL == aspect )
2053 libvlc_media_player_t *p_md;
2054 HRESULT hr = _p_instance->getMD(&p_md);
2057 libvlc_exception_t ex;
2058 libvlc_exception_init(&ex);
2060 char *psz_aspect = libvlc_video_get_aspect_ratio(p_md, &ex);
2062 hr = exception_bridge(&ex);
2063 if( SUCCEEDED(hr) && NULL != psz_aspect )
2065 *aspect = BSTRFromCStr(CP_UTF8, psz_aspect);
2066 if( NULL == *aspect )
2068 } else if( NULL == psz_aspect) hr = E_OUTOFMEMORY; // strdup("") failed
2074 STDMETHODIMP VLCVideo::put_aspectRatio(BSTR aspect)
2076 if( NULL == aspect )
2079 libvlc_media_player_t *p_md;
2080 HRESULT hr = _p_instance->getMD(&p_md);
2083 libvlc_exception_t ex;
2084 libvlc_exception_init(&ex);
2086 char *psz_aspect = CStrFromBSTR(CP_UTF8, aspect);
2087 if( NULL == psz_aspect )
2089 return E_OUTOFMEMORY;
2092 libvlc_video_set_aspect_ratio(p_md, psz_aspect, &ex);
2094 CoTaskMemFree(psz_aspect);
2095 hr = exception_bridge(&ex);
2100 STDMETHODIMP VLCVideo::get_subtitle(long* spu)
2105 libvlc_media_player_t *p_md;
2106 HRESULT hr = _p_instance->getMD(&p_md);
2109 libvlc_exception_t ex;
2110 libvlc_exception_init(&ex);
2112 *spu = libvlc_video_get_spu(p_md, &ex);
2113 hr = exception_bridge(&ex);
2118 STDMETHODIMP VLCVideo::put_subtitle(long spu)
2120 libvlc_media_player_t *p_md;
2121 HRESULT hr = _p_instance->getMD(&p_md);
2124 libvlc_exception_t ex;
2125 libvlc_exception_init(&ex);
2127 libvlc_video_set_spu(p_md, spu, &ex);
2128 hr = exception_bridge(&ex);
2133 STDMETHODIMP VLCVideo::get_crop(BSTR* geometry)
2135 if( NULL == geometry )
2138 libvlc_media_player_t *p_md;
2139 HRESULT hr = _p_instance->getMD(&p_md);
2142 libvlc_exception_t ex;
2143 libvlc_exception_init(&ex);
2145 char *psz_geometry = libvlc_video_get_crop_geometry(p_md, &ex);
2147 hr = exception_bridge(&ex);
2148 if( SUCCEEDED(&ex) && NULL != psz_geometry )
2150 *geometry = BSTRFromCStr(CP_UTF8, psz_geometry);
2151 if( NULL == geometry ) hr = E_OUTOFMEMORY;
2152 } else if( NULL == psz_geometry ) hr = E_OUTOFMEMORY;
2153 free( psz_geometry );
2158 STDMETHODIMP VLCVideo::put_crop(BSTR geometry)
2160 if( NULL == geometry )
2163 if( 0 == SysStringLen(geometry) )
2164 return E_INVALIDARG;
2166 libvlc_media_player_t *p_md;
2167 HRESULT hr = _p_instance->getMD(&p_md);
2170 libvlc_exception_t ex;
2171 libvlc_exception_init(&ex);
2173 char *psz_geometry = CStrFromBSTR(CP_UTF8, geometry);
2174 if( NULL == psz_geometry )
2176 return E_OUTOFMEMORY;
2179 libvlc_video_set_crop_geometry(p_md, psz_geometry, &ex);
2181 CoTaskMemFree(psz_geometry);
2182 hr = exception_bridge(&ex);
2187 STDMETHODIMP VLCVideo::get_teletext(long* page)
2192 libvlc_media_player_t *p_md;
2193 HRESULT hr = _p_instance->getMD(&p_md);
2196 libvlc_exception_t ex;
2197 libvlc_exception_init(&ex);
2199 *page = libvlc_video_get_teletext(p_md, &ex);
2200 hr = exception_bridge(&ex);
2205 STDMETHODIMP VLCVideo::put_teletext(long page)
2207 libvlc_media_player_t *p_md;
2208 HRESULT hr = _p_instance->getMD(&p_md);
2211 libvlc_exception_t ex;
2212 libvlc_exception_init(&ex);
2214 libvlc_video_set_teletext(p_md, page, &ex);
2215 hr = exception_bridge(&ex);
2220 STDMETHODIMP VLCVideo::deinterlaceDisable()
2222 libvlc_media_player_t *p_md;
2223 HRESULT hr = _p_instance->getMD(&p_md);
2226 libvlc_exception_t ex;
2227 libvlc_exception_init(&ex);
2229 libvlc_video_set_deinterlace(p_md, 0, "", &ex);
2230 hr = exception_bridge(&ex);
2235 STDMETHODIMP VLCVideo::deinterlaceEnable(BSTR mode)
2237 libvlc_media_player_t *p_md;
2238 HRESULT hr = _p_instance->getMD(&p_md);
2241 libvlc_exception_t ex;
2242 libvlc_exception_init(&ex);
2243 /* get deinterlace mode from the user */
2244 char *psz_mode = CStrFromBSTR(CP_UTF8, mode);
2245 /* enable deinterlace filter if possible */
2246 libvlc_video_set_deinterlace(p_md, 1, psz_mode, &ex);
2247 hr = exception_bridge(&ex);
2248 CoTaskMemFree(psz_mode);
2253 STDMETHODIMP VLCVideo::takeSnapshot(LPPICTUREDISP* picture)
2255 if( NULL == picture )
2258 libvlc_media_player_t *p_md;
2259 HRESULT hr = _p_instance->getMD(&p_md);
2262 libvlc_exception_t ex;
2263 libvlc_exception_init(&ex);
2265 static int uniqueId = 0;
2266 TCHAR path[MAX_PATH+1];
2268 int pathlen = GetTempPath(MAX_PATH-24, path);
2269 if( (0 == pathlen) || (pathlen > (MAX_PATH-24)) )
2272 /* check temp directory path by openning it */
2274 HANDLE dirHandle = CreateFile(path, GENERIC_READ,
2275 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
2276 NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
2277 if( INVALID_HANDLE_VALUE == dirHandle )
2279 _p_instance->setErrorInfo(IID_IVLCVideo,
2280 "Invalid temporary directory for snapshot images, check values of TMP, TEMP envars.");
2285 BY_HANDLE_FILE_INFORMATION bhfi;
2286 BOOL res = GetFileInformationByHandle(dirHandle, &bhfi);
2287 CloseHandle(dirHandle);
2288 if( !res || !(bhfi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
2290 _p_instance->setErrorInfo(IID_IVLCVideo,
2291 "Invalid temporary directory for snapshot images, check values of TMP, TEMP envars.");
2297 TCHAR filepath[MAX_PATH+1];
2299 _stprintf(filepath, TEXT("%sAXVLC%lXS%lX.bmp"),
2300 path, GetCurrentProcessId(), ++uniqueId);
2303 /* reuse path storage for UTF8 string */
2304 char *psz_filepath = (char *)path;
2305 WCHAR* wpath = filepath;
2307 char *psz_filepath = path;
2308 /* first convert to unicode using current code page */
2309 WCHAR wpath[MAX_PATH+1];
2310 if( 0 == MultiByteToWideChar(CP_ACP, 0, filepath, -1,
2311 wpath, sizeof(wpath)/sizeof(WCHAR)) )
2314 /* convert to UTF8 */
2315 pathlen = WideCharToMultiByte(CP_UTF8, 0, wpath, -1,
2316 psz_filepath, sizeof(path), NULL, NULL);
2317 // fail if path is 0 or too short (i.e pathlen is the same as
2320 if( (0 == pathlen) || (sizeof(path) == pathlen) )
2323 /* take snapshot into file */
2324 libvlc_video_take_snapshot(p_md, psz_filepath, 0, 0, &ex);
2325 hr = exception_bridge(&ex);
2328 /* open snapshot file */
2329 HANDLE snapPic = LoadImage(NULL, filepath, IMAGE_BITMAP, 0, 0,
2330 LR_CREATEDIBSECTION|LR_LOADFROMFILE);
2335 snapDesc.cbSizeofstruct = sizeof(PICTDESC);
2336 snapDesc.picType = PICTYPE_BITMAP;
2337 snapDesc.bmp.hbitmap = (HBITMAP)snapPic;
2338 snapDesc.bmp.hpal = NULL;
2340 hr = OleCreatePictureIndirect(&snapDesc, IID_IPictureDisp,
2341 TRUE, (LPVOID*)picture);
2345 DeleteObject(snapPic);
2348 DeleteFile(filepath);
2354 STDMETHODIMP VLCVideo::toggleFullscreen()
2356 libvlc_media_player_t *p_md;
2357 HRESULT hr = _p_instance->getMD(&p_md);
2360 libvlc_exception_t ex;
2361 libvlc_exception_init(&ex);
2363 libvlc_toggle_fullscreen(p_md, &ex);
2364 hr = exception_bridge(&ex);
2369 STDMETHODIMP VLCVideo::toggleTeletext()
2371 libvlc_media_player_t *p_md;
2372 HRESULT hr = _p_instance->getMD(&p_md);
2375 libvlc_exception_t ex;
2376 libvlc_exception_init(&ex);
2378 libvlc_toggle_teletext(p_md, &ex);
2379 hr = exception_bridge(&ex);
2384 /*******************************************************************************/
2386 VLCControl2::VLCControl2(VLCPlugin *p_instance) :
2387 _p_instance(p_instance),
2391 _p_vlcplaylist(NULL),
2392 _p_vlcsubtitle(NULL),
2395 _p_vlcaudio = new VLCAudio(p_instance);
2396 _p_vlcinput = new VLCInput(p_instance);
2397 _p_vlclog = new VLCLog(p_instance);
2398 _p_vlcplaylist = new VLCPlaylist(p_instance);
2399 _p_vlcsubtitle = new VLCSubtitle(p_instance);
2400 _p_vlcvideo = new VLCVideo(p_instance);
2403 VLCControl2::~VLCControl2()
2406 delete _p_vlcsubtitle;
2407 delete _p_vlcplaylist;
2412 _p_typeinfo->Release();
2415 HRESULT VLCControl2::loadTypeInfo(void)
2417 HRESULT hr = NOERROR;
2418 if( NULL == _p_typeinfo )
2420 ITypeLib *p_typelib;
2422 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
2425 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCControl2, &_p_typeinfo);
2430 p_typelib->Release();
2436 STDMETHODIMP VLCControl2::GetTypeInfoCount(UINT* pctInfo)
2438 if( NULL == pctInfo )
2439 return E_INVALIDARG;
2441 if( SUCCEEDED(loadTypeInfo()) )
2449 STDMETHODIMP VLCControl2::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
2451 if( NULL == ppTInfo )
2452 return E_INVALIDARG;
2454 if( SUCCEEDED(loadTypeInfo()) )
2456 _p_typeinfo->AddRef();
2457 *ppTInfo = _p_typeinfo;
2464 STDMETHODIMP VLCControl2::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
2465 UINT cNames, LCID lcid, DISPID* rgDispID)
2467 if( SUCCEEDED(loadTypeInfo()) )
2469 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
2474 STDMETHODIMP VLCControl2::Invoke(DISPID dispIdMember, REFIID riid,
2475 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
2476 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
2478 if( SUCCEEDED(loadTypeInfo()) )
2480 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
2481 pVarResult, pExcepInfo, puArgErr);
2486 STDMETHODIMP VLCControl2::get_AutoLoop(VARIANT_BOOL *autoloop)
2488 if( NULL == autoloop )
2491 *autoloop = _p_instance->getAutoLoop() ? VARIANT_TRUE: VARIANT_FALSE;
2495 STDMETHODIMP VLCControl2::put_AutoLoop(VARIANT_BOOL autoloop)
2497 _p_instance->setAutoLoop((VARIANT_FALSE != autoloop) ? TRUE: FALSE);
2501 STDMETHODIMP VLCControl2::get_AutoPlay(VARIANT_BOOL *autoplay)
2503 if( NULL == autoplay )
2506 *autoplay = _p_instance->getAutoPlay() ? VARIANT_TRUE: VARIANT_FALSE;
2510 STDMETHODIMP VLCControl2::put_AutoPlay(VARIANT_BOOL autoplay)
2512 _p_instance->setAutoPlay((VARIANT_FALSE != autoplay) ? TRUE: FALSE);
2516 STDMETHODIMP VLCControl2::get_BaseURL(BSTR *url)
2521 *url = SysAllocStringLen(_p_instance->getBaseURL(),
2522 SysStringLen(_p_instance->getBaseURL()));
2526 STDMETHODIMP VLCControl2::put_BaseURL(BSTR mrl)
2528 _p_instance->setBaseURL(mrl);
2533 STDMETHODIMP VLCControl2::get_MRL(BSTR *mrl)
2538 *mrl = SysAllocStringLen(_p_instance->getMRL(),
2539 SysStringLen(_p_instance->getMRL()));
2543 STDMETHODIMP VLCControl2::put_MRL(BSTR mrl)
2545 _p_instance->setMRL(mrl);
2551 STDMETHODIMP VLCControl2::get_Toolbar(VARIANT_BOOL *visible)
2553 if( NULL == visible )
2557 * Note to developpers
2559 * Returning the _b_toolbar is closer to the method specification.
2560 * But returning True when toolbar is not implemented so not displayed
2561 * could be bad for ActiveX users which rely on this value to show their
2562 * own toolbar if not provided by the ActiveX.
2564 * This is the reason why FALSE is returned, until toolbar get implemented.
2567 /* DISABLED for now */
2568 // *visible = _p_instance->getShowToolbar() ? VARIANT_TRUE: VARIANT_FALSE;
2570 *visible = VARIANT_FALSE;
2575 STDMETHODIMP VLCControl2::put_Toolbar(VARIANT_BOOL visible)
2577 _p_instance->setShowToolbar((VARIANT_FALSE != visible) ? TRUE: FALSE);
2582 STDMETHODIMP VLCControl2::get_StartTime(long *seconds)
2584 if( NULL == seconds )
2587 *seconds = _p_instance->getStartTime();
2592 STDMETHODIMP VLCControl2::put_StartTime(long seconds)
2594 _p_instance->setStartTime(seconds);
2599 STDMETHODIMP VLCControl2::get_VersionInfo(BSTR *version)
2601 if( NULL == version )
2604 const char *versionStr = libvlc_get_version();
2605 if( NULL != versionStr )
2607 *version = BSTRFromCStr(CP_UTF8, versionStr);
2609 return (NULL == *version) ? E_OUTOFMEMORY : NOERROR;
2615 STDMETHODIMP VLCControl2::get_Visible(VARIANT_BOOL *isVisible)
2617 if( NULL == isVisible )
2620 *isVisible = _p_instance->getVisible() ? VARIANT_TRUE : VARIANT_FALSE;
2625 STDMETHODIMP VLCControl2::put_Visible(VARIANT_BOOL isVisible)
2627 _p_instance->setVisible(isVisible != VARIANT_FALSE);
2632 STDMETHODIMP VLCControl2::get_Volume(long *volume)
2634 if( NULL == volume )
2637 *volume = _p_instance->getVolume();
2641 STDMETHODIMP VLCControl2::put_Volume(long volume)
2643 _p_instance->setVolume(volume);
2647 STDMETHODIMP VLCControl2::get_BackColor(OLE_COLOR *backcolor)
2649 if( NULL == backcolor )
2652 *backcolor = _p_instance->getBackColor();
2656 STDMETHODIMP VLCControl2::put_BackColor(OLE_COLOR backcolor)
2658 _p_instance->setBackColor(backcolor);
2662 STDMETHODIMP VLCControl2::get_audio(IVLCAudio** obj)
2668 if( NULL != _p_vlcaudio )
2670 _p_vlcaudio->AddRef();
2673 return E_OUTOFMEMORY;
2676 STDMETHODIMP VLCControl2::get_input(IVLCInput** obj)
2682 if( NULL != _p_vlcinput )
2684 _p_vlcinput->AddRef();
2687 return E_OUTOFMEMORY;
2690 STDMETHODIMP VLCControl2::get_log(IVLCLog** obj)
2696 if( NULL != _p_vlclog )
2698 _p_vlclog->AddRef();
2701 return E_OUTOFMEMORY;
2704 STDMETHODIMP VLCControl2::get_playlist(IVLCPlaylist** obj)
2709 *obj = _p_vlcplaylist;
2710 if( NULL != _p_vlcplaylist )
2712 _p_vlcplaylist->AddRef();
2715 return E_OUTOFMEMORY;
2718 STDMETHODIMP VLCControl2::get_subtitle(IVLCSubtitle** obj)
2723 *obj = _p_vlcsubtitle;
2724 if( NULL != _p_vlcsubtitle )
2726 _p_vlcsubtitle->AddRef();
2729 return E_OUTOFMEMORY;
2732 STDMETHODIMP VLCControl2::get_video(IVLCVideo** obj)
2738 if( NULL != _p_vlcvideo )
2740 _p_vlcvideo->AddRef();
2743 return E_OUTOFMEMORY;