1 /*****************************************************************************
2 * vlccontrol2.cpp: ActiveX control for VLC
3 *****************************************************************************
4 * Copyright (C) 2006 the VideoLAN team
6 * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>
7 * Jean-Paul Saman <jpsaman _at_ m2x _dot_ nl>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22 *****************************************************************************/
25 #include "vlccontrol2.h"
26 #include "vlccontrol.h"
38 _p_typeinfo->Release();
41 HRESULT VLCAudio::loadTypeInfo(void)
44 if( NULL == _p_typeinfo )
48 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
51 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCAudio, &_p_typeinfo);
62 STDMETHODIMP VLCAudio::GetTypeInfoCount(UINT* pctInfo)
67 if( SUCCEEDED(loadTypeInfo()) )
75 STDMETHODIMP VLCAudio::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
80 if( SUCCEEDED(loadTypeInfo()) )
82 _p_typeinfo->AddRef();
83 *ppTInfo = _p_typeinfo;
90 STDMETHODIMP VLCAudio::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
91 UINT cNames, LCID lcid, DISPID* rgDispID)
93 if( SUCCEEDED(loadTypeInfo()) )
95 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
100 STDMETHODIMP VLCAudio::Invoke(DISPID dispIdMember, REFIID riid,
101 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
102 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
104 if( SUCCEEDED(loadTypeInfo()) )
106 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
107 pVarResult, pExcepInfo, puArgErr);
112 STDMETHODIMP VLCAudio::get_mute(VARIANT_BOOL* mute)
117 libvlc_instance_t* p_libvlc;
118 HRESULT hr = _p_instance->getVLC(&p_libvlc);
121 libvlc_exception_t ex;
122 libvlc_exception_init(&ex);
124 *mute = libvlc_audio_get_mute(p_libvlc, &ex) ? VARIANT_TRUE : VARIANT_FALSE;
125 if( libvlc_exception_raised(&ex) )
127 _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex));
128 libvlc_exception_clear(&ex);
136 STDMETHODIMP VLCAudio::put_mute(VARIANT_BOOL mute)
138 libvlc_instance_t* p_libvlc;
139 HRESULT hr = _p_instance->getVLC(&p_libvlc);
142 libvlc_exception_t ex;
143 libvlc_exception_init(&ex);
145 libvlc_audio_set_mute(p_libvlc, VARIANT_FALSE != mute, &ex);
146 if( libvlc_exception_raised(&ex) )
148 _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex));
149 libvlc_exception_clear(&ex);
157 STDMETHODIMP VLCAudio::get_volume(long* volume)
162 libvlc_instance_t* p_libvlc;
163 HRESULT hr = _p_instance->getVLC(&p_libvlc);
166 libvlc_exception_t ex;
167 libvlc_exception_init(&ex);
169 *volume = libvlc_audio_get_volume(p_libvlc, &ex);
170 if( libvlc_exception_raised(&ex) )
172 _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex));
173 libvlc_exception_clear(&ex);
181 STDMETHODIMP VLCAudio::put_volume(long volume)
183 libvlc_instance_t* p_libvlc;
184 HRESULT hr = _p_instance->getVLC(&p_libvlc);
187 libvlc_exception_t ex;
188 libvlc_exception_init(&ex);
190 libvlc_audio_set_volume(p_libvlc, volume, &ex);
191 if( libvlc_exception_raised(&ex) )
193 _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex));
194 libvlc_exception_clear(&ex);
202 STDMETHODIMP VLCAudio::get_track(long* track)
207 libvlc_instance_t* p_libvlc;
208 HRESULT hr = _p_instance->getVLC(&p_libvlc);
211 libvlc_exception_t ex;
212 libvlc_exception_init(&ex);
214 *track = libvlc_audio_get_track(p_libvlc, &ex);
215 if( libvlc_exception_raised(&ex) )
217 _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex));
218 libvlc_exception_clear(&ex);
226 STDMETHODIMP VLCAudio::put_track(long track)
228 libvlc_instance_t* p_libvlc;
229 HRESULT hr = _p_instance->getVLC(&p_libvlc);
232 libvlc_exception_t ex;
233 libvlc_exception_init(&ex);
235 libvlc_audio_set_track(p_libvlc, track, &ex);
236 if( libvlc_exception_raised(&ex) )
238 _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex));
239 libvlc_exception_clear(&ex);
247 STDMETHODIMP VLCAudio::get_channel(BSTR *channel)
249 if( NULL == channel )
252 libvlc_instance_t* p_libvlc;
253 HRESULT hr = _p_instance->getVLC(&p_libvlc);
256 char *psz_channel = NULL;
257 libvlc_exception_t ex;
258 libvlc_exception_init(&ex);
260 psz_channel = libvlc_audio_get_channel(p_libvlc, &ex);
261 if( ! libvlc_exception_raised(&ex) )
263 if( NULL == psz_channel )
264 return E_OUTOFMEMORY;
266 *channel = BSTRFromCStr(CP_UTF8, psz_channel);
270 if( psz_channel ) free( psz_channel );
271 _p_instance->setErrorInfo(IID_IVLCAudio,
272 libvlc_exception_get_message(&ex));
273 libvlc_exception_clear(&ex);
279 STDMETHODIMP VLCAudio::put_channel(BSTR channel)
281 if( NULL == channel )
284 if( 0 == SysStringLen(channel) )
287 libvlc_instance_t* p_libvlc;
288 HRESULT hr = _p_instance->getVLC(&p_libvlc);
291 char *psz_channel = NULL;
292 libvlc_exception_t ex;
293 libvlc_exception_init(&ex);
295 psz_channel = CStrFromBSTR(CP_UTF8, channel);
296 if( NULL == psz_channel )
297 return E_OUTOFMEMORY;
299 libvlc_audio_set_channel(p_libvlc, psz_channel, &ex);
301 CoTaskMemFree(psz_channel);
302 if( libvlc_exception_raised(&ex) )
304 _p_instance->setErrorInfo(IID_IVLCAudio,
305 libvlc_exception_get_message(&ex));
306 libvlc_exception_clear(&ex);
314 STDMETHODIMP VLCAudio::toggleMute()
316 libvlc_instance_t* p_libvlc;
317 HRESULT hr = _p_instance->getVLC(&p_libvlc);
320 libvlc_exception_t ex;
321 libvlc_exception_init(&ex);
323 libvlc_audio_toggle_mute(p_libvlc, &ex);
324 if( libvlc_exception_raised(&ex) )
326 _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex));
327 libvlc_exception_clear(&ex);
335 /*******************************************************************************/
337 VLCInput::~VLCInput()
340 _p_typeinfo->Release();
343 HRESULT VLCInput::loadTypeInfo(void)
345 HRESULT hr = NOERROR;
346 if( NULL == _p_typeinfo )
350 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
353 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCInput, &_p_typeinfo);
358 p_typelib->Release();
364 STDMETHODIMP VLCInput::GetTypeInfoCount(UINT* pctInfo)
366 if( NULL == pctInfo )
369 if( SUCCEEDED(loadTypeInfo()) )
377 STDMETHODIMP VLCInput::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
379 if( NULL == ppTInfo )
382 if( SUCCEEDED(loadTypeInfo()) )
384 _p_typeinfo->AddRef();
385 *ppTInfo = _p_typeinfo;
392 STDMETHODIMP VLCInput::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
393 UINT cNames, LCID lcid, DISPID* rgDispID)
395 if( SUCCEEDED(loadTypeInfo()) )
397 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
402 STDMETHODIMP VLCInput::Invoke(DISPID dispIdMember, REFIID riid,
403 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
404 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
406 if( SUCCEEDED(loadTypeInfo()) )
408 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
409 pVarResult, pExcepInfo, puArgErr);
414 STDMETHODIMP VLCInput::get_length(double* length)
419 libvlc_instance_t* p_libvlc;
420 HRESULT hr = _p_instance->getVLC(&p_libvlc);
423 libvlc_exception_t ex;
424 libvlc_exception_init(&ex);
426 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
427 if( ! libvlc_exception_raised(&ex) )
429 *length = (double)libvlc_input_get_length(p_input, &ex);
430 libvlc_input_free(p_input);
431 if( ! libvlc_exception_raised(&ex) )
436 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
437 libvlc_exception_clear(&ex);
443 STDMETHODIMP VLCInput::get_position(double* position)
445 if( NULL == position )
448 libvlc_instance_t* p_libvlc;
449 HRESULT hr = _p_instance->getVLC(&p_libvlc);
452 libvlc_exception_t ex;
453 libvlc_exception_init(&ex);
455 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
456 if( ! libvlc_exception_raised(&ex) )
458 *position = libvlc_input_get_position(p_input, &ex);
459 libvlc_input_free(p_input);
460 if( ! libvlc_exception_raised(&ex) )
465 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
466 libvlc_exception_clear(&ex);
472 STDMETHODIMP VLCInput::put_position(double position)
474 libvlc_instance_t* p_libvlc;
475 HRESULT hr = _p_instance->getVLC(&p_libvlc);
478 libvlc_exception_t ex;
479 libvlc_exception_init(&ex);
481 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
482 if( ! libvlc_exception_raised(&ex) )
484 libvlc_input_set_position(p_input, position, &ex);
485 libvlc_input_free(p_input);
486 if( ! libvlc_exception_raised(&ex) )
491 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
492 libvlc_exception_clear(&ex);
498 STDMETHODIMP VLCInput::get_time(double* time)
503 libvlc_instance_t* p_libvlc;
504 HRESULT hr = _p_instance->getVLC(&p_libvlc);
507 libvlc_exception_t ex;
508 libvlc_exception_init(&ex);
510 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
511 if( ! libvlc_exception_raised(&ex) )
513 *time = (double)libvlc_input_get_time(p_input, &ex);
514 libvlc_input_free(p_input);
515 if( ! libvlc_exception_raised(&ex) )
520 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
521 libvlc_exception_clear(&ex);
527 STDMETHODIMP VLCInput::put_time(double time)
529 libvlc_instance_t* p_libvlc;
530 HRESULT hr = _p_instance->getVLC(&p_libvlc);
533 libvlc_exception_t ex;
534 libvlc_exception_init(&ex);
536 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
537 if( ! libvlc_exception_raised(&ex) )
539 libvlc_input_set_time(p_input, (vlc_int64_t)time, &ex);
540 libvlc_input_free(p_input);
541 if( ! libvlc_exception_raised(&ex) )
546 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
547 libvlc_exception_clear(&ex);
553 STDMETHODIMP VLCInput::get_state(long* state)
558 libvlc_instance_t* p_libvlc;
559 HRESULT hr = _p_instance->getVLC(&p_libvlc);
562 libvlc_exception_t ex;
563 libvlc_exception_init(&ex);
565 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
566 if( ! libvlc_exception_raised(&ex) )
568 *state = libvlc_input_get_state(p_input, &ex);
569 libvlc_input_free(p_input);
570 if( ! libvlc_exception_raised(&ex) )
575 libvlc_exception_clear(&ex);
576 // don't fail, just return the idle state
583 STDMETHODIMP VLCInput::get_rate(double* rate)
588 libvlc_instance_t* p_libvlc;
589 HRESULT hr = _p_instance->getVLC(&p_libvlc);
592 libvlc_exception_t ex;
593 libvlc_exception_init(&ex);
595 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
596 if( ! libvlc_exception_raised(&ex) )
598 *rate = libvlc_input_get_rate(p_input, &ex);
599 libvlc_input_free(p_input);
600 if( ! libvlc_exception_raised(&ex) )
605 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
606 libvlc_exception_clear(&ex);
612 STDMETHODIMP VLCInput::put_rate(double rate)
614 libvlc_instance_t* p_libvlc;
615 HRESULT hr = _p_instance->getVLC(&p_libvlc);
618 libvlc_exception_t ex;
619 libvlc_exception_init(&ex);
621 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
622 if( ! libvlc_exception_raised(&ex) )
624 libvlc_input_set_rate(p_input, rate, &ex);
625 libvlc_input_free(p_input);
626 if( ! libvlc_exception_raised(&ex) )
631 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
632 libvlc_exception_clear(&ex);
638 STDMETHODIMP VLCInput::get_fps(double* fps)
643 libvlc_instance_t* p_libvlc;
644 HRESULT hr = _p_instance->getVLC(&p_libvlc);
647 libvlc_exception_t ex;
648 libvlc_exception_init(&ex);
650 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
651 if( ! libvlc_exception_raised(&ex) )
653 *fps = libvlc_input_get_fps(p_input, &ex);
654 libvlc_input_free(p_input);
655 if( ! libvlc_exception_raised(&ex) )
660 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
661 libvlc_exception_clear(&ex);
667 STDMETHODIMP VLCInput::get_hasVout(VARIANT_BOOL* hasVout)
669 if( NULL == hasVout )
672 libvlc_instance_t* p_libvlc;
673 HRESULT hr = _p_instance->getVLC(&p_libvlc);
676 libvlc_exception_t ex;
677 libvlc_exception_init(&ex);
679 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
680 if( ! libvlc_exception_raised(&ex) )
682 *hasVout = libvlc_input_has_vout(p_input, &ex) ? VARIANT_TRUE : VARIANT_FALSE;
683 libvlc_input_free(p_input);
684 if( ! libvlc_exception_raised(&ex) )
689 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
690 libvlc_exception_clear(&ex);
696 /*******************************************************************************/
700 delete _p_vlcmessages;
702 libvlc_log_close(_p_log, NULL);
705 _p_typeinfo->Release();
708 HRESULT VLCLog::loadTypeInfo(void)
710 HRESULT hr = NOERROR;
711 if( NULL == _p_typeinfo )
715 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
718 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCLog, &_p_typeinfo);
723 p_typelib->Release();
729 STDMETHODIMP VLCLog::GetTypeInfoCount(UINT* pctInfo)
731 if( NULL == pctInfo )
734 if( SUCCEEDED(loadTypeInfo()) )
742 STDMETHODIMP VLCLog::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
744 if( NULL == ppTInfo )
747 if( SUCCEEDED(loadTypeInfo()) )
749 _p_typeinfo->AddRef();
750 *ppTInfo = _p_typeinfo;
757 STDMETHODIMP VLCLog::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
758 UINT cNames, LCID lcid, DISPID* rgDispID)
760 if( SUCCEEDED(loadTypeInfo()) )
762 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
767 STDMETHODIMP VLCLog::Invoke(DISPID dispIdMember, REFIID riid,
768 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
769 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
771 if( SUCCEEDED(loadTypeInfo()) )
773 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
774 pVarResult, pExcepInfo, puArgErr);
779 STDMETHODIMP VLCLog::get_messages(IVLCMessages** obj)
784 *obj = _p_vlcmessages;
785 if( NULL != _p_vlcmessages )
787 _p_vlcmessages->AddRef();
790 return E_OUTOFMEMORY;
793 STDMETHODIMP VLCLog::get_verbosity(long* level)
800 libvlc_instance_t* p_libvlc;
801 HRESULT hr = _p_instance->getVLC(&p_libvlc);
804 libvlc_exception_t ex;
805 libvlc_exception_init(&ex);
807 *level = libvlc_get_log_verbosity(p_libvlc, &ex);
808 if( libvlc_exception_raised(&ex) )
810 _p_instance->setErrorInfo(IID_IVLCLog, libvlc_exception_get_message(&ex));
811 libvlc_exception_clear(&ex);
819 /* log is not enabled, return -1 */
825 STDMETHODIMP VLCLog::put_verbosity(long verbosity)
827 libvlc_exception_t ex;
828 libvlc_exception_init(&ex);
830 libvlc_instance_t* p_libvlc;
831 HRESULT hr = _p_instance->getVLC(&p_libvlc);
838 _p_log = libvlc_log_open(p_libvlc, &ex);
839 if( libvlc_exception_raised(&ex) )
841 _p_instance->setErrorInfo(IID_IVLCLog, libvlc_exception_get_message(&ex));
842 libvlc_exception_clear(&ex);
846 libvlc_set_log_verbosity(p_libvlc, (unsigned)verbosity, &ex);
847 if( libvlc_exception_raised(&ex) )
849 _p_instance->setErrorInfo(IID_IVLCLog, libvlc_exception_get_message(&ex));
850 libvlc_exception_clear(&ex);
856 /* close log when verbosity is set to -1 */
857 libvlc_log_close(_p_log, &ex);
859 if( libvlc_exception_raised(&ex) )
861 _p_instance->setErrorInfo(IID_IVLCLog, libvlc_exception_get_message(&ex));
862 libvlc_exception_clear(&ex);
870 /*******************************************************************************/
872 VLCMessages::~VLCMessages()
875 _p_typeinfo->Release();
878 HRESULT VLCMessages::loadTypeInfo(void)
880 HRESULT hr = NOERROR;
881 if( NULL == _p_typeinfo )
885 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
888 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessages, &_p_typeinfo);
893 p_typelib->Release();
899 STDMETHODIMP VLCMessages::GetTypeInfoCount(UINT* pctInfo)
901 if( NULL == pctInfo )
904 if( SUCCEEDED(loadTypeInfo()) )
912 STDMETHODIMP VLCMessages::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
914 if( NULL == ppTInfo )
917 if( SUCCEEDED(loadTypeInfo()) )
919 _p_typeinfo->AddRef();
920 *ppTInfo = _p_typeinfo;
927 STDMETHODIMP VLCMessages::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
928 UINT cNames, LCID lcid, DISPID* rgDispID)
930 if( SUCCEEDED(loadTypeInfo()) )
932 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
937 STDMETHODIMP VLCMessages::Invoke(DISPID dispIdMember, REFIID riid,
938 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
939 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
941 if( SUCCEEDED(loadTypeInfo()) )
943 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
944 pVarResult, pExcepInfo, puArgErr);
949 STDMETHODIMP VLCMessages::get__NewEnum(LPUNKNOWN* _NewEnum)
951 if( NULL == _NewEnum )
959 STDMETHODIMP VLCMessages::clear()
961 libvlc_log_t *p_log = _p_vlclog->_p_log;
964 libvlc_exception_t ex;
965 libvlc_exception_init(&ex);
967 libvlc_log_clear(p_log, &ex);
968 if( libvlc_exception_raised(&ex) )
970 _p_instance->setErrorInfo(IID_IVLCMessages, libvlc_exception_get_message(&ex));
971 libvlc_exception_clear(&ex);
978 STDMETHODIMP VLCMessages::get_count(long* count)
983 libvlc_log_t *p_log = _p_vlclog->_p_log;
986 libvlc_exception_t ex;
987 libvlc_exception_init(&ex);
989 *count = libvlc_log_count(p_log, &ex);
990 if( libvlc_exception_raised(&ex) )
992 _p_instance->setErrorInfo(IID_IVLCMessages, libvlc_exception_get_message(&ex));
993 libvlc_exception_clear(&ex);
1002 STDMETHODIMP VLCMessages::iterator(IVLCMessageIterator** iter)
1007 *iter = new VLCMessageIterator(_p_instance, _p_vlclog);
1009 return *iter ? S_OK : E_OUTOFMEMORY;
1012 /*******************************************************************************/
1014 VLCMessageIterator::VLCMessageIterator(VLCPlugin *p_instance, VLCLog* p_vlclog ) :
1015 _p_instance(p_instance),
1020 if( p_vlclog->_p_log )
1022 _p_iter = libvlc_log_get_iterator(p_vlclog->_p_log, NULL);
1028 VLCMessageIterator::~VLCMessageIterator()
1031 libvlc_log_iterator_free(_p_iter, NULL);
1034 _p_typeinfo->Release();
1037 HRESULT VLCMessageIterator::loadTypeInfo(void)
1039 HRESULT hr = NOERROR;
1040 if( NULL == _p_typeinfo )
1042 ITypeLib *p_typelib;
1044 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1047 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessageIterator, &_p_typeinfo);
1052 p_typelib->Release();
1058 STDMETHODIMP VLCMessageIterator::GetTypeInfoCount(UINT* pctInfo)
1060 if( NULL == pctInfo )
1061 return E_INVALIDARG;
1063 if( SUCCEEDED(loadTypeInfo()) )
1071 STDMETHODIMP VLCMessageIterator::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1073 if( NULL == ppTInfo )
1074 return E_INVALIDARG;
1076 if( SUCCEEDED(loadTypeInfo()) )
1078 _p_typeinfo->AddRef();
1079 *ppTInfo = _p_typeinfo;
1086 STDMETHODIMP VLCMessageIterator::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1087 UINT cNames, LCID lcid, DISPID* rgDispID)
1089 if( SUCCEEDED(loadTypeInfo()) )
1091 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1096 STDMETHODIMP VLCMessageIterator::Invoke(DISPID dispIdMember, REFIID riid,
1097 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1098 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1100 if( SUCCEEDED(loadTypeInfo()) )
1102 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1103 pVarResult, pExcepInfo, puArgErr);
1108 STDMETHODIMP VLCMessageIterator::get_hasNext(VARIANT_BOOL* hasNext)
1110 if( NULL == hasNext )
1113 if( _p_iter && _p_vlclog->_p_log )
1115 libvlc_exception_t ex;
1116 libvlc_exception_init(&ex);
1118 *hasNext = libvlc_log_iterator_has_next(_p_iter, &ex) ? VARIANT_TRUE : VARIANT_FALSE;
1119 if( libvlc_exception_raised(&ex) )
1121 _p_instance->setErrorInfo(IID_IVLCMessageIterator, libvlc_exception_get_message(&ex));
1122 libvlc_exception_clear(&ex);
1128 *hasNext = VARIANT_FALSE;
1133 STDMETHODIMP VLCMessageIterator::next(IVLCMessage** message)
1135 if( NULL == message )
1138 if( _p_iter && _p_vlclog->_p_log )
1140 struct libvlc_log_message_t buffer;
1142 buffer.sizeof_msg = sizeof(buffer);
1144 libvlc_exception_t ex;
1145 libvlc_exception_init(&ex);
1147 libvlc_log_iterator_next(_p_iter, &buffer, &ex);
1148 if( libvlc_exception_raised(&ex) )
1150 _p_instance->setErrorInfo(IID_IVLCMessageIterator, libvlc_exception_get_message(&ex));
1151 libvlc_exception_clear(&ex);
1154 *message = new VLCMessage(_p_instance, buffer);
1155 return *message ? NOERROR : E_OUTOFMEMORY;
1160 /*******************************************************************************/
1162 VLCMessage::~VLCMessage()
1165 _p_typeinfo->Release();
1168 HRESULT VLCMessage::loadTypeInfo(void)
1170 HRESULT hr = NOERROR;
1171 if( NULL == _p_typeinfo )
1173 ITypeLib *p_typelib;
1175 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1178 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCMessage, &_p_typeinfo);
1183 p_typelib->Release();
1189 STDMETHODIMP VLCMessage::GetTypeInfoCount(UINT* pctInfo)
1191 if( NULL == pctInfo )
1192 return E_INVALIDARG;
1194 if( SUCCEEDED(loadTypeInfo()) )
1202 STDMETHODIMP VLCMessage::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1204 if( NULL == ppTInfo )
1205 return E_INVALIDARG;
1207 if( SUCCEEDED(loadTypeInfo()) )
1209 _p_typeinfo->AddRef();
1210 *ppTInfo = _p_typeinfo;
1217 STDMETHODIMP VLCMessage::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1218 UINT cNames, LCID lcid, DISPID* rgDispID)
1220 if( SUCCEEDED(loadTypeInfo()) )
1222 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1227 STDMETHODIMP VLCMessage::Invoke(DISPID dispIdMember, REFIID riid,
1228 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1229 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1231 if( SUCCEEDED(loadTypeInfo()) )
1233 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1234 pVarResult, pExcepInfo, puArgErr);
1239 inline const char *msgSeverity(int sev)
1254 STDMETHODIMP VLCMessage::get__Value(VARIANT* _Value)
1256 if( NULL == _Value )
1261 snprintf(buffer, sizeof(buffer), "%s %s %s: %s",
1262 _msg.psz_type, _msg.psz_name, msgSeverity(_msg.i_severity), _msg.psz_message);
1264 V_VT(_Value) = VT_BSTR;
1265 V_BSTR(_Value) = BSTRFromCStr(CP_UTF8, buffer);
1270 STDMETHODIMP VLCMessage::get_severity(long* level)
1275 *level = _msg.i_severity;
1280 STDMETHODIMP VLCMessage::get_type(BSTR* type)
1285 *type = BSTRFromCStr(CP_UTF8, _msg.psz_type);
1290 STDMETHODIMP VLCMessage::get_name(BSTR* name)
1295 *name = BSTRFromCStr(CP_UTF8, _msg.psz_name);
1300 STDMETHODIMP VLCMessage::get_header(BSTR* header)
1302 if( NULL == header )
1305 *header = BSTRFromCStr(CP_UTF8, _msg.psz_header);
1310 STDMETHODIMP VLCMessage::get_message(BSTR* message)
1312 if( NULL == message )
1315 *message = BSTRFromCStr(CP_UTF8, _msg.psz_message);
1320 /*******************************************************************************/
1322 VLCPlaylistItems::~VLCPlaylistItems()
1325 _p_typeinfo->Release();
1328 HRESULT VLCPlaylistItems::loadTypeInfo(void)
1330 HRESULT hr = NOERROR;
1331 if( NULL == _p_typeinfo )
1333 ITypeLib *p_typelib;
1335 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1338 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCPlaylistItems, &_p_typeinfo);
1343 p_typelib->Release();
1349 STDMETHODIMP VLCPlaylistItems::GetTypeInfoCount(UINT* pctInfo)
1351 if( NULL == pctInfo )
1352 return E_INVALIDARG;
1354 if( SUCCEEDED(loadTypeInfo()) )
1362 STDMETHODIMP VLCPlaylistItems::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1364 if( NULL == ppTInfo )
1365 return E_INVALIDARG;
1367 if( SUCCEEDED(loadTypeInfo()) )
1369 _p_typeinfo->AddRef();
1370 *ppTInfo = _p_typeinfo;
1377 STDMETHODIMP VLCPlaylistItems::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1378 UINT cNames, LCID lcid, DISPID* rgDispID)
1380 if( SUCCEEDED(loadTypeInfo()) )
1382 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1387 STDMETHODIMP VLCPlaylistItems::Invoke(DISPID dispIdMember, REFIID riid,
1388 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1389 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1391 if( SUCCEEDED(loadTypeInfo()) )
1393 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1394 pVarResult, pExcepInfo, puArgErr);
1399 STDMETHODIMP VLCPlaylistItems::get_count(long* count)
1404 libvlc_instance_t* p_libvlc;
1405 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1408 libvlc_exception_t ex;
1409 libvlc_exception_init(&ex);
1411 *count = libvlc_playlist_items_count(p_libvlc, &ex);
1412 if( libvlc_exception_raised(&ex) )
1414 _p_instance->setErrorInfo(IID_IVLCPlaylistItems,
1415 libvlc_exception_get_message(&ex));
1416 libvlc_exception_clear(&ex);
1424 STDMETHODIMP VLCPlaylistItems::clear()
1426 libvlc_instance_t* p_libvlc;
1427 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1430 libvlc_exception_t ex;
1431 libvlc_exception_init(&ex);
1433 libvlc_playlist_clear(p_libvlc, &ex);
1434 if( libvlc_exception_raised(&ex) )
1436 _p_instance->setErrorInfo(IID_IVLCPlaylistItems,
1437 libvlc_exception_get_message(&ex));
1438 libvlc_exception_clear(&ex);
1446 STDMETHODIMP VLCPlaylistItems::remove(long item)
1448 libvlc_instance_t* p_libvlc;
1449 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1452 libvlc_exception_t ex;
1453 libvlc_exception_init(&ex);
1455 libvlc_playlist_delete_item(p_libvlc, item, &ex);
1456 if( libvlc_exception_raised(&ex) )
1458 _p_instance->setErrorInfo(IID_IVLCPlaylistItems,
1459 libvlc_exception_get_message(&ex));
1460 libvlc_exception_clear(&ex);
1468 /*******************************************************************************/
1470 VLCPlaylist::~VLCPlaylist()
1472 delete _p_vlcplaylistitems;
1474 _p_typeinfo->Release();
1477 HRESULT VLCPlaylist::loadTypeInfo(void)
1479 HRESULT hr = NOERROR;
1480 if( NULL == _p_typeinfo )
1482 ITypeLib *p_typelib;
1484 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1487 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCPlaylist, &_p_typeinfo);
1492 p_typelib->Release();
1498 STDMETHODIMP VLCPlaylist::GetTypeInfoCount(UINT* pctInfo)
1500 if( NULL == pctInfo )
1501 return E_INVALIDARG;
1503 if( SUCCEEDED(loadTypeInfo()) )
1511 STDMETHODIMP VLCPlaylist::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1513 if( NULL == ppTInfo )
1514 return E_INVALIDARG;
1516 if( SUCCEEDED(loadTypeInfo()) )
1518 _p_typeinfo->AddRef();
1519 *ppTInfo = _p_typeinfo;
1526 STDMETHODIMP VLCPlaylist::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1527 UINT cNames, LCID lcid, DISPID* rgDispID)
1529 if( SUCCEEDED(loadTypeInfo()) )
1531 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1536 STDMETHODIMP VLCPlaylist::Invoke(DISPID dispIdMember, REFIID riid,
1537 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1538 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1540 if( SUCCEEDED(loadTypeInfo()) )
1542 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1543 pVarResult, pExcepInfo, puArgErr);
1548 STDMETHODIMP VLCPlaylist::get_itemCount(long* count)
1553 libvlc_instance_t* p_libvlc;
1554 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1557 libvlc_exception_t ex;
1558 libvlc_exception_init(&ex);
1560 *count = libvlc_playlist_items_count(p_libvlc, &ex);
1561 if( libvlc_exception_raised(&ex) )
1563 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1564 libvlc_exception_get_message(&ex));
1565 libvlc_exception_clear(&ex);
1573 STDMETHODIMP VLCPlaylist::get_isPlaying(VARIANT_BOOL* isPlaying)
1575 if( NULL == isPlaying )
1578 libvlc_instance_t* p_libvlc;
1579 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1582 libvlc_exception_t ex;
1583 libvlc_exception_init(&ex);
1585 *isPlaying = libvlc_playlist_isplaying(p_libvlc, &ex) ? VARIANT_TRUE: VARIANT_FALSE;
1586 if( libvlc_exception_raised(&ex) )
1588 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1589 libvlc_exception_get_message(&ex));
1590 libvlc_exception_clear(&ex);
1598 STDMETHODIMP VLCPlaylist::add(BSTR uri, VARIANT name, VARIANT options, long* item)
1603 if( 0 == SysStringLen(uri) )
1604 return E_INVALIDARG;
1606 libvlc_instance_t* p_libvlc;
1607 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1610 libvlc_exception_t ex;
1611 libvlc_exception_init(&ex);
1613 char *psz_uri = NULL;
1614 if( SysStringLen(_p_instance->getBaseURL()) > 0 )
1617 ** if the MRL a relative URL, we should end up with an absolute URL
1619 LPWSTR abs_url = CombineURL(_p_instance->getBaseURL(), uri);
1620 if( NULL != abs_url )
1622 psz_uri = CStrFromWSTR(CP_UTF8, abs_url, wcslen(abs_url));
1623 CoTaskMemFree(abs_url);
1627 psz_uri = CStrFromBSTR(CP_UTF8, uri);
1633 ** baseURL is empty, assume MRL is absolute
1635 psz_uri = CStrFromBSTR(CP_UTF8, uri);
1638 if( NULL == psz_uri )
1640 return E_OUTOFMEMORY;
1644 char **ppsz_options;
1646 hr = VLCControl::CreateTargetOptions(CP_UTF8, &options, &ppsz_options, &i_options);
1649 CoTaskMemFree(psz_uri);
1653 char *psz_name = NULL;
1655 VariantInit(&v_name);
1656 if( SUCCEEDED(VariantChangeType(&v_name, &name, 0, VT_BSTR)) )
1658 if( SysStringLen(V_BSTR(&v_name)) > 0 )
1659 psz_name = CStrFromBSTR(CP_UTF8, V_BSTR(&v_name));
1661 VariantClear(&v_name);
1664 *item = libvlc_playlist_add_extended(p_libvlc,
1668 const_cast<const char **>(ppsz_options),
1671 VLCControl::FreeTargetOptions(ppsz_options, i_options);
1672 CoTaskMemFree(psz_uri);
1674 CoTaskMemFree(psz_name);
1675 if( libvlc_exception_raised(&ex) )
1677 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1678 libvlc_exception_get_message(&ex));
1679 libvlc_exception_clear(&ex);
1687 STDMETHODIMP VLCPlaylist::play()
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 libvlc_playlist_play(p_libvlc, -1, 0, NULL, &ex);
1697 if( libvlc_exception_raised(&ex) )
1699 libvlc_exception_clear(&ex);
1707 STDMETHODIMP VLCPlaylist::playItem(long item)
1709 libvlc_instance_t* p_libvlc;
1710 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1713 libvlc_exception_t ex;
1714 libvlc_exception_init(&ex);
1716 libvlc_playlist_play(p_libvlc, item, 0, NULL, &ex);
1717 if( libvlc_exception_raised(&ex) )
1719 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1720 libvlc_exception_get_message(&ex));
1721 libvlc_exception_clear(&ex);
1729 STDMETHODIMP VLCPlaylist::togglePause()
1731 libvlc_instance_t* p_libvlc;
1732 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1735 libvlc_exception_t ex;
1736 libvlc_exception_init(&ex);
1738 libvlc_playlist_pause(p_libvlc, &ex);
1739 if( libvlc_exception_raised(&ex) )
1741 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1742 libvlc_exception_get_message(&ex));
1743 libvlc_exception_clear(&ex);
1751 STDMETHODIMP VLCPlaylist::stop()
1753 libvlc_instance_t* p_libvlc;
1754 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1757 libvlc_exception_t ex;
1758 libvlc_exception_init(&ex);
1760 libvlc_playlist_stop(p_libvlc, &ex);
1761 if( libvlc_exception_raised(&ex) )
1763 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1764 libvlc_exception_get_message(&ex));
1765 libvlc_exception_clear(&ex);
1773 STDMETHODIMP VLCPlaylist::next()
1775 libvlc_instance_t* p_libvlc;
1776 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1779 libvlc_exception_t ex;
1780 libvlc_exception_init(&ex);
1782 libvlc_playlist_next(p_libvlc, &ex);
1783 if( libvlc_exception_raised(&ex) )
1785 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1786 libvlc_exception_get_message(&ex));
1787 libvlc_exception_clear(&ex);
1795 STDMETHODIMP VLCPlaylist::prev()
1797 libvlc_instance_t* p_libvlc;
1798 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1801 libvlc_exception_t ex;
1802 libvlc_exception_init(&ex);
1804 libvlc_playlist_prev(p_libvlc, &ex);
1805 if( libvlc_exception_raised(&ex) )
1807 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1808 libvlc_exception_get_message(&ex));
1809 libvlc_exception_clear(&ex);
1817 STDMETHODIMP VLCPlaylist::clear()
1819 libvlc_instance_t* p_libvlc;
1820 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1823 libvlc_exception_t ex;
1824 libvlc_exception_init(&ex);
1826 libvlc_playlist_clear(p_libvlc, &ex);
1827 if( libvlc_exception_raised(&ex) )
1829 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1830 libvlc_exception_get_message(&ex));
1831 libvlc_exception_clear(&ex);
1839 STDMETHODIMP VLCPlaylist::removeItem(long item)
1841 libvlc_instance_t* p_libvlc;
1842 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1845 libvlc_exception_t ex;
1846 libvlc_exception_init(&ex);
1848 libvlc_playlist_delete_item(p_libvlc, item, &ex);
1849 if( libvlc_exception_raised(&ex) )
1851 _p_instance->setErrorInfo(IID_IVLCPlaylist,
1852 libvlc_exception_get_message(&ex));
1853 libvlc_exception_clear(&ex);
1861 STDMETHODIMP VLCPlaylist::get_items(IVLCPlaylistItems** obj)
1866 *obj = _p_vlcplaylistitems;
1867 if( NULL != _p_vlcplaylistitems )
1869 _p_vlcplaylistitems->AddRef();
1872 return E_OUTOFMEMORY;
1875 /*******************************************************************************/
1877 VLCVideo::~VLCVideo()
1880 _p_typeinfo->Release();
1883 HRESULT VLCVideo::loadTypeInfo(void)
1885 HRESULT hr = NOERROR;
1886 if( NULL == _p_typeinfo )
1888 ITypeLib *p_typelib;
1890 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1893 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCVideo, &_p_typeinfo);
1898 p_typelib->Release();
1904 STDMETHODIMP VLCVideo::GetTypeInfoCount(UINT* pctInfo)
1906 if( NULL == pctInfo )
1907 return E_INVALIDARG;
1909 if( SUCCEEDED(loadTypeInfo()) )
1917 STDMETHODIMP VLCVideo::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1919 if( NULL == ppTInfo )
1920 return E_INVALIDARG;
1922 if( SUCCEEDED(loadTypeInfo()) )
1924 _p_typeinfo->AddRef();
1925 *ppTInfo = _p_typeinfo;
1932 STDMETHODIMP VLCVideo::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1933 UINT cNames, LCID lcid, DISPID* rgDispID)
1935 if( SUCCEEDED(loadTypeInfo()) )
1937 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1942 STDMETHODIMP VLCVideo::Invoke(DISPID dispIdMember, REFIID riid,
1943 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1944 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1946 if( SUCCEEDED(loadTypeInfo()) )
1948 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1949 pVarResult, pExcepInfo, puArgErr);
1954 STDMETHODIMP VLCVideo::get_fullscreen(VARIANT_BOOL* fullscreen)
1956 if( NULL == fullscreen )
1959 libvlc_instance_t* p_libvlc;
1960 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1963 libvlc_exception_t ex;
1964 libvlc_exception_init(&ex);
1966 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
1967 if( ! libvlc_exception_raised(&ex) )
1969 *fullscreen = libvlc_get_fullscreen(p_input, &ex) ? VARIANT_TRUE : VARIANT_FALSE;
1970 libvlc_input_free(p_input);
1971 if( ! libvlc_exception_raised(&ex) )
1976 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
1977 libvlc_exception_clear(&ex);
1983 STDMETHODIMP VLCVideo::put_fullscreen(VARIANT_BOOL fullscreen)
1985 libvlc_instance_t* p_libvlc;
1986 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1989 libvlc_exception_t ex;
1990 libvlc_exception_init(&ex);
1992 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
1993 if( ! libvlc_exception_raised(&ex) )
1995 libvlc_set_fullscreen(p_input, VARIANT_FALSE != fullscreen, &ex);
1996 libvlc_input_free(p_input);
1997 if( ! libvlc_exception_raised(&ex) )
2002 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2003 libvlc_exception_clear(&ex);
2009 STDMETHODIMP VLCVideo::get_width(long* width)
2014 libvlc_instance_t* p_libvlc;
2015 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2018 libvlc_exception_t ex;
2019 libvlc_exception_init(&ex);
2021 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
2022 if( ! libvlc_exception_raised(&ex) )
2024 *width = libvlc_video_get_width(p_input, &ex);
2025 libvlc_input_free(p_input);
2026 if( ! libvlc_exception_raised(&ex) )
2031 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2032 libvlc_exception_clear(&ex);
2038 STDMETHODIMP VLCVideo::get_height(long* height)
2040 if( NULL == height )
2043 libvlc_instance_t* p_libvlc;
2044 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2047 libvlc_exception_t ex;
2048 libvlc_exception_init(&ex);
2050 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
2051 if( ! libvlc_exception_raised(&ex) )
2053 *height = libvlc_video_get_height(p_input, &ex);
2054 libvlc_input_free(p_input);
2055 if( ! libvlc_exception_raised(&ex) )
2060 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2061 libvlc_exception_clear(&ex);
2067 STDMETHODIMP VLCVideo::get_aspectRatio(BSTR* aspect)
2069 if( NULL == aspect )
2072 libvlc_instance_t* p_libvlc;
2073 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2076 libvlc_exception_t ex;
2077 libvlc_exception_init(&ex);
2079 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
2080 if( ! libvlc_exception_raised(&ex) )
2082 char *psz_aspect = libvlc_video_get_aspect_ratio(p_input, &ex);
2084 libvlc_input_free(p_input);
2085 if( ! libvlc_exception_raised(&ex) )
2087 if( NULL == psz_aspect )
2088 return E_OUTOFMEMORY;
2090 *aspect = SysAllocStringByteLen(psz_aspect, strlen(psz_aspect));
2095 if( psz_aspect ) free( psz_aspect );
2097 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2098 libvlc_exception_clear(&ex);
2104 STDMETHODIMP VLCVideo::put_aspectRatio(BSTR aspect)
2106 if( NULL == aspect )
2109 if( 0 == SysStringLen(aspect) )
2110 return E_INVALIDARG;
2112 libvlc_instance_t* p_libvlc;
2113 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2116 char *psz_aspect = NULL;
2117 libvlc_exception_t ex;
2118 libvlc_exception_init(&ex);
2120 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
2121 if( ! libvlc_exception_raised(&ex) )
2123 psz_aspect = CStrFromBSTR(CP_UTF8, aspect);
2124 if( NULL == psz_aspect )
2126 return E_OUTOFMEMORY;
2129 libvlc_video_set_aspect_ratio(p_input, psz_aspect, &ex);
2131 CoTaskMemFree(psz_aspect);
2132 libvlc_input_free(p_input);
2133 if( libvlc_exception_raised(&ex) )
2135 _p_instance->setErrorInfo(IID_IVLCVideo,
2136 libvlc_exception_get_message(&ex));
2137 libvlc_exception_clear(&ex);
2146 STDMETHODIMP VLCVideo::toggleFullscreen()
2148 libvlc_instance_t* p_libvlc;
2149 HRESULT hr = _p_instance->getVLC(&p_libvlc);
2152 libvlc_exception_t ex;
2153 libvlc_exception_init(&ex);
2155 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
2156 if( ! libvlc_exception_raised(&ex) )
2158 libvlc_toggle_fullscreen(p_input, &ex);
2159 libvlc_input_free(p_input);
2160 if( ! libvlc_exception_raised(&ex) )
2165 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
2166 libvlc_exception_clear(&ex);
2172 /*******************************************************************************/
2174 VLCControl2::VLCControl2(VLCPlugin *p_instance) :
2175 _p_instance(p_instance),
2179 _p_vlcplaylist(NULL),
2182 _p_vlcaudio = new VLCAudio(p_instance);
2183 _p_vlcinput = new VLCInput(p_instance);
2184 _p_vlclog = new VLCLog(p_instance);
2185 _p_vlcplaylist = new VLCPlaylist(p_instance);
2186 _p_vlcvideo = new VLCVideo(p_instance);
2189 VLCControl2::~VLCControl2()
2192 delete _p_vlcplaylist;
2197 _p_typeinfo->Release();
2200 HRESULT VLCControl2::loadTypeInfo(void)
2202 HRESULT hr = NOERROR;
2203 if( NULL == _p_typeinfo )
2205 ITypeLib *p_typelib;
2207 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
2210 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCControl2, &_p_typeinfo);
2215 p_typelib->Release();
2221 STDMETHODIMP VLCControl2::GetTypeInfoCount(UINT* pctInfo)
2223 if( NULL == pctInfo )
2224 return E_INVALIDARG;
2226 if( SUCCEEDED(loadTypeInfo()) )
2234 STDMETHODIMP VLCControl2::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
2236 if( NULL == ppTInfo )
2237 return E_INVALIDARG;
2239 if( SUCCEEDED(loadTypeInfo()) )
2241 _p_typeinfo->AddRef();
2242 *ppTInfo = _p_typeinfo;
2249 STDMETHODIMP VLCControl2::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
2250 UINT cNames, LCID lcid, DISPID* rgDispID)
2252 if( SUCCEEDED(loadTypeInfo()) )
2254 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
2259 STDMETHODIMP VLCControl2::Invoke(DISPID dispIdMember, REFIID riid,
2260 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
2261 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
2263 if( SUCCEEDED(loadTypeInfo()) )
2265 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
2266 pVarResult, pExcepInfo, puArgErr);
2271 STDMETHODIMP VLCControl2::get_AutoLoop(VARIANT_BOOL *autoloop)
2273 if( NULL == autoloop )
2276 *autoloop = _p_instance->getAutoLoop() ? VARIANT_TRUE: VARIANT_FALSE;
2280 STDMETHODIMP VLCControl2::put_AutoLoop(VARIANT_BOOL autoloop)
2282 _p_instance->setAutoLoop((VARIANT_FALSE != autoloop) ? TRUE: FALSE);
2286 STDMETHODIMP VLCControl2::get_AutoPlay(VARIANT_BOOL *autoplay)
2288 if( NULL == autoplay )
2291 *autoplay = _p_instance->getAutoPlay() ? VARIANT_TRUE: VARIANT_FALSE;
2295 STDMETHODIMP VLCControl2::put_AutoPlay(VARIANT_BOOL autoplay)
2297 _p_instance->setAutoPlay((VARIANT_FALSE != autoplay) ? TRUE: FALSE);
2301 STDMETHODIMP VLCControl2::get_BaseURL(BSTR *url)
2306 *url = SysAllocStringLen(_p_instance->getBaseURL(),
2307 SysStringLen(_p_instance->getBaseURL()));
2311 STDMETHODIMP VLCControl2::put_BaseURL(BSTR mrl)
2313 _p_instance->setBaseURL(mrl);
2318 STDMETHODIMP VLCControl2::get_MRL(BSTR *mrl)
2323 *mrl = SysAllocStringLen(_p_instance->getMRL(),
2324 SysStringLen(_p_instance->getMRL()));
2328 STDMETHODIMP VLCControl2::put_MRL(BSTR mrl)
2330 _p_instance->setMRL(mrl);
2335 STDMETHODIMP VLCControl2::get_StartTime(long *seconds)
2337 if( NULL == seconds )
2340 *seconds = _p_instance->getStartTime();
2345 STDMETHODIMP VLCControl2::put_StartTime(long seconds)
2347 _p_instance->setStartTime(seconds);
2352 STDMETHODIMP VLCControl2::get_VersionInfo(BSTR *version)
2354 if( NULL == version )
2357 const char *versionStr = VLC_Version();
2358 if( NULL != versionStr )
2360 *version = BSTRFromCStr(CP_UTF8, versionStr);
2362 return NULL == *version ? E_OUTOFMEMORY : NOERROR;
2368 STDMETHODIMP VLCControl2::get_Visible(VARIANT_BOOL *isVisible)
2370 if( NULL == isVisible )
2373 *isVisible = _p_instance->getVisible() ? VARIANT_TRUE : VARIANT_FALSE;
2378 STDMETHODIMP VLCControl2::put_Visible(VARIANT_BOOL isVisible)
2380 _p_instance->setVisible(isVisible != VARIANT_FALSE);
2385 STDMETHODIMP VLCControl2::get_Volume(long *volume)
2387 if( NULL == volume )
2390 *volume = _p_instance->getVolume();
2394 STDMETHODIMP VLCControl2::put_Volume(long volume)
2396 _p_instance->setVolume(volume);
2400 STDMETHODIMP VLCControl2::get_audio(IVLCAudio** obj)
2406 if( NULL != _p_vlcaudio )
2408 _p_vlcaudio->AddRef();
2411 return E_OUTOFMEMORY;
2414 STDMETHODIMP VLCControl2::get_input(IVLCInput** obj)
2420 if( NULL != _p_vlcinput )
2422 _p_vlcinput->AddRef();
2425 return E_OUTOFMEMORY;
2428 STDMETHODIMP VLCControl2::get_log(IVLCLog** obj)
2434 if( NULL != _p_vlclog )
2436 _p_vlclog->AddRef();
2439 return E_OUTOFMEMORY;
2442 STDMETHODIMP VLCControl2::get_playlist(IVLCPlaylist** obj)
2447 *obj = _p_vlcplaylist;
2448 if( NULL != _p_vlcplaylist )
2450 _p_vlcplaylist->AddRef();
2453 return E_OUTOFMEMORY;
2456 STDMETHODIMP VLCControl2::get_video(IVLCVideo** obj)
2462 if( NULL != _p_vlcvideo )
2464 _p_vlcvideo->AddRef();
2467 return E_OUTOFMEMORY;