1 /*****************************************************************************
2 * vlccontrol2.cpp: ActiveX control for VLC
3 *****************************************************************************
4 * Copyright (C) 2006 the VideoLAN team
6 * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
21 *****************************************************************************/
24 #include "vlccontrol2.h"
25 #include "vlccontrol.h"
34 _p_typeinfo->Release();
37 HRESULT VLCAudio::loadTypeInfo(void)
40 if( NULL == _p_typeinfo )
44 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
47 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCAudio, &_p_typeinfo);
58 STDMETHODIMP VLCAudio::GetTypeInfoCount(UINT* pctInfo)
63 if( SUCCEEDED(loadTypeInfo()) )
71 STDMETHODIMP VLCAudio::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
76 if( SUCCEEDED(loadTypeInfo()) )
78 _p_typeinfo->AddRef();
79 *ppTInfo = _p_typeinfo;
86 STDMETHODIMP VLCAudio::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
87 UINT cNames, LCID lcid, DISPID* rgDispID)
89 if( SUCCEEDED(loadTypeInfo()) )
91 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
96 STDMETHODIMP VLCAudio::Invoke(DISPID dispIdMember, REFIID riid,
97 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
98 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
100 if( SUCCEEDED(loadTypeInfo()) )
102 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
103 pVarResult, pExcepInfo, puArgErr);
108 STDMETHODIMP VLCAudio::get_mute(VARIANT_BOOL* mute)
113 libvlc_instance_t* p_libvlc;
114 HRESULT hr = _p_instance->getVLC(&p_libvlc);
117 libvlc_exception_t ex;
118 libvlc_exception_init(&ex);
120 *mute = libvlc_audio_get_mute(p_libvlc, &ex) ? VARIANT_TRUE : VARIANT_FALSE;
121 if( libvlc_exception_raised(&ex) )
123 _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex));
124 libvlc_exception_clear(&ex);
132 STDMETHODIMP VLCAudio::put_mute(VARIANT_BOOL mute)
134 libvlc_instance_t* p_libvlc;
135 HRESULT hr = _p_instance->getVLC(&p_libvlc);
138 libvlc_exception_t ex;
139 libvlc_exception_init(&ex);
141 libvlc_audio_set_mute(p_libvlc, VARIANT_FALSE != mute, &ex);
142 if( libvlc_exception_raised(&ex) )
144 _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex));
145 libvlc_exception_clear(&ex);
153 STDMETHODIMP VLCAudio::get_volume(int* volume)
158 libvlc_instance_t* p_libvlc;
159 HRESULT hr = _p_instance->getVLC(&p_libvlc);
162 libvlc_exception_t ex;
163 libvlc_exception_init(&ex);
165 *volume = libvlc_audio_get_volume(p_libvlc, &ex);
166 if( libvlc_exception_raised(&ex) )
168 _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex));
169 libvlc_exception_clear(&ex);
177 STDMETHODIMP VLCAudio::put_volume(int volume)
179 libvlc_instance_t* p_libvlc;
180 HRESULT hr = _p_instance->getVLC(&p_libvlc);
183 libvlc_exception_t ex;
184 libvlc_exception_init(&ex);
186 libvlc_audio_set_volume(p_libvlc, volume, &ex);
187 if( libvlc_exception_raised(&ex) )
189 _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex));
190 libvlc_exception_clear(&ex);
198 STDMETHODIMP VLCAudio::toggleMute()
200 libvlc_instance_t* p_libvlc;
201 HRESULT hr = _p_instance->getVLC(&p_libvlc);
204 libvlc_exception_t ex;
205 libvlc_exception_init(&ex);
207 libvlc_audio_toggle_mute(p_libvlc, &ex);
208 if( libvlc_exception_raised(&ex) )
210 _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex));
211 libvlc_exception_clear(&ex);
219 /*******************************************************************************/
221 VLCInput::~VLCInput()
224 _p_typeinfo->Release();
227 HRESULT VLCInput::loadTypeInfo(void)
229 HRESULT hr = NOERROR;
230 if( NULL == _p_typeinfo )
234 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
237 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCInput, &_p_typeinfo);
242 p_typelib->Release();
248 STDMETHODIMP VLCInput::GetTypeInfoCount(UINT* pctInfo)
250 if( NULL == pctInfo )
253 if( SUCCEEDED(loadTypeInfo()) )
261 STDMETHODIMP VLCInput::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
263 if( NULL == ppTInfo )
266 if( SUCCEEDED(loadTypeInfo()) )
268 _p_typeinfo->AddRef();
269 *ppTInfo = _p_typeinfo;
276 STDMETHODIMP VLCInput::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
277 UINT cNames, LCID lcid, DISPID* rgDispID)
279 if( SUCCEEDED(loadTypeInfo()) )
281 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
286 STDMETHODIMP VLCInput::Invoke(DISPID dispIdMember, REFIID riid,
287 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
288 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
290 if( SUCCEEDED(loadTypeInfo()) )
292 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
293 pVarResult, pExcepInfo, puArgErr);
298 STDMETHODIMP VLCInput::get_length(double* length)
303 libvlc_instance_t* p_libvlc;
304 HRESULT hr = _p_instance->getVLC(&p_libvlc);
307 libvlc_exception_t ex;
308 libvlc_exception_init(&ex);
310 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
311 if( ! libvlc_exception_raised(&ex) )
313 *length = (double)libvlc_input_get_length(p_input, &ex);
314 libvlc_input_free(p_input);
315 if( ! libvlc_exception_raised(&ex) )
320 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
321 libvlc_exception_clear(&ex);
327 STDMETHODIMP VLCInput::get_position(float* position)
329 if( NULL == position )
332 libvlc_instance_t* p_libvlc;
333 HRESULT hr = _p_instance->getVLC(&p_libvlc);
336 libvlc_exception_t ex;
337 libvlc_exception_init(&ex);
339 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
340 if( ! libvlc_exception_raised(&ex) )
342 *position = libvlc_input_get_position(p_input, &ex);
343 libvlc_input_free(p_input);
344 if( ! libvlc_exception_raised(&ex) )
349 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
350 libvlc_exception_clear(&ex);
356 STDMETHODIMP VLCInput::put_position(float position)
358 libvlc_instance_t* p_libvlc;
359 HRESULT hr = _p_instance->getVLC(&p_libvlc);
362 libvlc_exception_t ex;
363 libvlc_exception_init(&ex);
365 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
366 if( ! libvlc_exception_raised(&ex) )
368 libvlc_input_set_position(p_input, position, &ex);
369 libvlc_input_free(p_input);
370 if( ! libvlc_exception_raised(&ex) )
375 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
376 libvlc_exception_clear(&ex);
382 STDMETHODIMP VLCInput::get_time(double* time)
387 libvlc_instance_t* p_libvlc;
388 HRESULT hr = _p_instance->getVLC(&p_libvlc);
391 libvlc_exception_t ex;
392 libvlc_exception_init(&ex);
394 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
395 if( ! libvlc_exception_raised(&ex) )
397 *time = (double)libvlc_input_get_time(p_input, &ex);
398 libvlc_input_free(p_input);
399 if( ! libvlc_exception_raised(&ex) )
404 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
405 libvlc_exception_clear(&ex);
411 STDMETHODIMP VLCInput::put_time(double time)
413 libvlc_instance_t* p_libvlc;
414 HRESULT hr = _p_instance->getVLC(&p_libvlc);
417 libvlc_exception_t ex;
418 libvlc_exception_init(&ex);
420 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
421 if( ! libvlc_exception_raised(&ex) )
423 libvlc_input_set_time(p_input, (vlc_int64_t)time, &ex);
424 libvlc_input_free(p_input);
425 if( ! libvlc_exception_raised(&ex) )
430 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
431 libvlc_exception_clear(&ex);
437 STDMETHODIMP VLCInput::get_state(int* state)
442 libvlc_instance_t* p_libvlc;
443 HRESULT hr = _p_instance->getVLC(&p_libvlc);
446 libvlc_exception_t ex;
447 libvlc_exception_init(&ex);
449 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
450 if( ! libvlc_exception_raised(&ex) )
452 *state = libvlc_input_get_state(p_input, &ex);
453 libvlc_input_free(p_input);
454 if( ! libvlc_exception_raised(&ex) )
459 libvlc_exception_clear(&ex);
460 // don't fail, just return the idle state
467 STDMETHODIMP VLCInput::get_rate(float* rate)
472 libvlc_instance_t* p_libvlc;
473 HRESULT hr = _p_instance->getVLC(&p_libvlc);
476 libvlc_exception_t ex;
477 libvlc_exception_init(&ex);
479 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
480 if( ! libvlc_exception_raised(&ex) )
482 *rate = libvlc_input_get_rate(p_input, &ex);
483 libvlc_input_free(p_input);
484 if( ! libvlc_exception_raised(&ex) )
489 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
490 libvlc_exception_clear(&ex);
496 STDMETHODIMP VLCInput::put_rate(float rate)
498 libvlc_instance_t* p_libvlc;
499 HRESULT hr = _p_instance->getVLC(&p_libvlc);
502 libvlc_exception_t ex;
503 libvlc_exception_init(&ex);
505 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
506 if( ! libvlc_exception_raised(&ex) )
508 libvlc_input_set_rate(p_input, rate, &ex);
509 libvlc_input_free(p_input);
510 if( ! libvlc_exception_raised(&ex) )
515 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
516 libvlc_exception_clear(&ex);
522 STDMETHODIMP VLCInput::get_fps(float* fps)
527 libvlc_instance_t* p_libvlc;
528 HRESULT hr = _p_instance->getVLC(&p_libvlc);
531 libvlc_exception_t ex;
532 libvlc_exception_init(&ex);
534 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
535 if( ! libvlc_exception_raised(&ex) )
537 *fps = libvlc_input_get_fps(p_input, &ex);
538 libvlc_input_free(p_input);
539 if( ! libvlc_exception_raised(&ex) )
544 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
545 libvlc_exception_clear(&ex);
551 STDMETHODIMP VLCInput::get_hasVout(VARIANT_BOOL* hasVout)
553 if( NULL == hasVout )
556 libvlc_instance_t* p_libvlc;
557 HRESULT hr = _p_instance->getVLC(&p_libvlc);
560 libvlc_exception_t ex;
561 libvlc_exception_init(&ex);
563 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
564 if( ! libvlc_exception_raised(&ex) )
566 *hasVout = libvlc_input_has_vout(p_input, &ex) ? VARIANT_TRUE : VARIANT_FALSE;
567 libvlc_input_free(p_input);
568 if( ! libvlc_exception_raised(&ex) )
573 _p_instance->setErrorInfo(IID_IVLCInput, libvlc_exception_get_message(&ex));
574 libvlc_exception_clear(&ex);
580 /*******************************************************************************/
582 VLCPlaylist::~VLCPlaylist()
585 _p_typeinfo->Release();
588 HRESULT VLCPlaylist::loadTypeInfo(void)
590 HRESULT hr = NOERROR;
591 if( NULL == _p_typeinfo )
595 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
598 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCPlaylist, &_p_typeinfo);
603 p_typelib->Release();
609 STDMETHODIMP VLCPlaylist::GetTypeInfoCount(UINT* pctInfo)
611 if( NULL == pctInfo )
614 if( SUCCEEDED(loadTypeInfo()) )
622 STDMETHODIMP VLCPlaylist::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
624 if( NULL == ppTInfo )
627 if( SUCCEEDED(loadTypeInfo()) )
629 _p_typeinfo->AddRef();
630 *ppTInfo = _p_typeinfo;
637 STDMETHODIMP VLCPlaylist::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
638 UINT cNames, LCID lcid, DISPID* rgDispID)
640 if( SUCCEEDED(loadTypeInfo()) )
642 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
647 STDMETHODIMP VLCPlaylist::Invoke(DISPID dispIdMember, REFIID riid,
648 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
649 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
651 if( SUCCEEDED(loadTypeInfo()) )
653 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
654 pVarResult, pExcepInfo, puArgErr);
659 STDMETHODIMP VLCPlaylist::get_itemCount(int* count)
664 libvlc_instance_t* p_libvlc;
665 HRESULT hr = _p_instance->getVLC(&p_libvlc);
668 libvlc_exception_t ex;
669 libvlc_exception_init(&ex);
671 *count = libvlc_playlist_items_count(p_libvlc, &ex);
672 if( libvlc_exception_raised(&ex) )
674 _p_instance->setErrorInfo(IID_IVLCPlaylist,
675 libvlc_exception_get_message(&ex));
676 libvlc_exception_clear(&ex);
684 STDMETHODIMP VLCPlaylist::get_isPlaying(VARIANT_BOOL* isPlaying)
686 if( NULL == isPlaying )
689 libvlc_instance_t* p_libvlc;
690 HRESULT hr = _p_instance->getVLC(&p_libvlc);
693 libvlc_exception_t ex;
694 libvlc_exception_init(&ex);
696 *isPlaying = libvlc_playlist_isplaying(p_libvlc, &ex) ? VARIANT_TRUE: VARIANT_FALSE;
697 if( libvlc_exception_raised(&ex) )
699 _p_instance->setErrorInfo(IID_IVLCPlaylist,
700 libvlc_exception_get_message(&ex));
701 libvlc_exception_clear(&ex);
709 STDMETHODIMP VLCPlaylist::add(BSTR uri, VARIANT name, VARIANT options, int* item)
714 if( 0 == SysStringLen(uri) )
717 libvlc_instance_t* p_libvlc;
718 HRESULT hr = _p_instance->getVLC(&p_libvlc);
721 libvlc_exception_t ex;
722 libvlc_exception_init(&ex);
727 hr = VLCControl::CreateTargetOptions(CP_UTF8, &options, &ppsz_options, &i_options);
731 char *psz_uri = CStrFromBSTR(CP_UTF8, uri);
732 if( NULL == psz_uri )
734 VLCControl::FreeTargetOptions(ppsz_options, i_options);
735 return E_OUTOFMEMORY;
738 char *psz_name = NULL;
740 VariantInit(&v_name);
741 if( SUCCEEDED(VariantChangeType(&v_name, &name, 0, VT_BSTR)) )
743 if( SysStringLen(V_BSTR(&v_name)) > 0 )
744 psz_name = CStrFromBSTR(CP_UTF8, V_BSTR(&v_name));
746 VariantClear(&v_name);
749 *item = libvlc_playlist_add_extended(p_libvlc,
753 const_cast<const char **>(ppsz_options),
756 VLCControl::FreeTargetOptions(ppsz_options, i_options);
757 CoTaskMemFree(psz_uri);
759 CoTaskMemFree(psz_name);
760 if( libvlc_exception_raised(&ex) )
762 _p_instance->setErrorInfo(IID_IVLCPlaylist,
763 libvlc_exception_get_message(&ex));
764 libvlc_exception_clear(&ex);
772 STDMETHODIMP VLCPlaylist::play()
774 libvlc_instance_t* p_libvlc;
775 HRESULT hr = _p_instance->getVLC(&p_libvlc);
778 libvlc_exception_t ex;
779 libvlc_exception_init(&ex);
781 libvlc_playlist_play(p_libvlc, -1, 0, NULL, &ex);
782 if( libvlc_exception_raised(&ex) )
784 libvlc_exception_clear(&ex);
792 STDMETHODIMP VLCPlaylist::playItem(int item)
794 libvlc_instance_t* p_libvlc;
795 HRESULT hr = _p_instance->getVLC(&p_libvlc);
798 libvlc_exception_t ex;
799 libvlc_exception_init(&ex);
801 libvlc_playlist_play(p_libvlc, item, 0, NULL, &ex);
802 if( libvlc_exception_raised(&ex) )
804 _p_instance->setErrorInfo(IID_IVLCPlaylist,
805 libvlc_exception_get_message(&ex));
806 libvlc_exception_clear(&ex);
814 STDMETHODIMP VLCPlaylist::togglePause()
816 libvlc_instance_t* p_libvlc;
817 HRESULT hr = _p_instance->getVLC(&p_libvlc);
820 libvlc_exception_t ex;
821 libvlc_exception_init(&ex);
823 libvlc_playlist_pause(p_libvlc, &ex);
824 if( libvlc_exception_raised(&ex) )
826 _p_instance->setErrorInfo(IID_IVLCPlaylist,
827 libvlc_exception_get_message(&ex));
828 libvlc_exception_clear(&ex);
836 STDMETHODIMP VLCPlaylist::stop()
838 libvlc_instance_t* p_libvlc;
839 HRESULT hr = _p_instance->getVLC(&p_libvlc);
842 libvlc_exception_t ex;
843 libvlc_exception_init(&ex);
845 libvlc_playlist_stop(p_libvlc, &ex);
846 if( libvlc_exception_raised(&ex) )
848 _p_instance->setErrorInfo(IID_IVLCPlaylist,
849 libvlc_exception_get_message(&ex));
850 libvlc_exception_clear(&ex);
858 STDMETHODIMP VLCPlaylist::next()
860 libvlc_instance_t* p_libvlc;
861 HRESULT hr = _p_instance->getVLC(&p_libvlc);
864 libvlc_exception_t ex;
865 libvlc_exception_init(&ex);
867 libvlc_playlist_next(p_libvlc, &ex);
868 if( libvlc_exception_raised(&ex) )
870 _p_instance->setErrorInfo(IID_IVLCPlaylist,
871 libvlc_exception_get_message(&ex));
872 libvlc_exception_clear(&ex);
880 STDMETHODIMP VLCPlaylist::prev()
882 libvlc_instance_t* p_libvlc;
883 HRESULT hr = _p_instance->getVLC(&p_libvlc);
886 libvlc_exception_t ex;
887 libvlc_exception_init(&ex);
889 libvlc_playlist_prev(p_libvlc, &ex);
890 if( libvlc_exception_raised(&ex) )
892 _p_instance->setErrorInfo(IID_IVLCPlaylist,
893 libvlc_exception_get_message(&ex));
894 libvlc_exception_clear(&ex);
902 STDMETHODIMP VLCPlaylist::clear()
904 libvlc_instance_t* p_libvlc;
905 HRESULT hr = _p_instance->getVLC(&p_libvlc);
908 libvlc_exception_t ex;
909 libvlc_exception_init(&ex);
911 libvlc_playlist_clear(p_libvlc, &ex);
912 if( libvlc_exception_raised(&ex) )
914 _p_instance->setErrorInfo(IID_IVLCPlaylist,
915 libvlc_exception_get_message(&ex));
916 libvlc_exception_clear(&ex);
924 STDMETHODIMP VLCPlaylist::removeItem(int item)
926 libvlc_instance_t* p_libvlc;
927 HRESULT hr = _p_instance->getVLC(&p_libvlc);
930 libvlc_exception_t ex;
931 libvlc_exception_init(&ex);
933 libvlc_playlist_delete_item(p_libvlc, item, &ex);
934 if( libvlc_exception_raised(&ex) )
936 _p_instance->setErrorInfo(IID_IVLCPlaylist,
937 libvlc_exception_get_message(&ex));
938 libvlc_exception_clear(&ex);
946 /*******************************************************************************/
948 VLCVideo::~VLCVideo()
951 _p_typeinfo->Release();
954 HRESULT VLCVideo::loadTypeInfo(void)
956 HRESULT hr = NOERROR;
957 if( NULL == _p_typeinfo )
961 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
964 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCVideo, &_p_typeinfo);
969 p_typelib->Release();
975 STDMETHODIMP VLCVideo::GetTypeInfoCount(UINT* pctInfo)
977 if( NULL == pctInfo )
980 if( SUCCEEDED(loadTypeInfo()) )
988 STDMETHODIMP VLCVideo::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
990 if( NULL == ppTInfo )
993 if( SUCCEEDED(loadTypeInfo()) )
995 _p_typeinfo->AddRef();
996 *ppTInfo = _p_typeinfo;
1003 STDMETHODIMP VLCVideo::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1004 UINT cNames, LCID lcid, DISPID* rgDispID)
1006 if( SUCCEEDED(loadTypeInfo()) )
1008 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1013 STDMETHODIMP VLCVideo::Invoke(DISPID dispIdMember, REFIID riid,
1014 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1015 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1017 if( SUCCEEDED(loadTypeInfo()) )
1019 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1020 pVarResult, pExcepInfo, puArgErr);
1025 STDMETHODIMP VLCVideo::get_fullscreen(VARIANT_BOOL* fullscreen)
1027 if( NULL == fullscreen )
1030 libvlc_instance_t* p_libvlc;
1031 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1034 libvlc_exception_t ex;
1035 libvlc_exception_init(&ex);
1037 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
1038 if( ! libvlc_exception_raised(&ex) )
1040 *fullscreen = libvlc_get_fullscreen(p_input, &ex) ? VARIANT_TRUE : VARIANT_FALSE;
1041 libvlc_input_free(p_input);
1042 if( ! libvlc_exception_raised(&ex) )
1047 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
1048 libvlc_exception_clear(&ex);
1054 STDMETHODIMP VLCVideo::put_fullscreen(VARIANT_BOOL fullscreen)
1056 libvlc_instance_t* p_libvlc;
1057 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1060 libvlc_exception_t ex;
1061 libvlc_exception_init(&ex);
1063 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
1064 if( ! libvlc_exception_raised(&ex) )
1066 libvlc_set_fullscreen(p_input, VARIANT_FALSE != fullscreen, &ex);
1067 libvlc_input_free(p_input);
1068 if( ! libvlc_exception_raised(&ex) )
1073 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
1074 libvlc_exception_clear(&ex);
1080 STDMETHODIMP VLCVideo::get_width(int* width)
1085 libvlc_instance_t* p_libvlc;
1086 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1089 libvlc_exception_t ex;
1090 libvlc_exception_init(&ex);
1092 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
1093 if( ! libvlc_exception_raised(&ex) )
1095 *width = libvlc_video_get_width(p_input, &ex);
1096 libvlc_input_free(p_input);
1097 if( ! libvlc_exception_raised(&ex) )
1102 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
1103 libvlc_exception_clear(&ex);
1109 STDMETHODIMP VLCVideo::get_height(int* height)
1111 if( NULL == height )
1114 libvlc_instance_t* p_libvlc;
1115 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1118 libvlc_exception_t ex;
1119 libvlc_exception_init(&ex);
1121 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
1122 if( ! libvlc_exception_raised(&ex) )
1124 *height = libvlc_video_get_height(p_input, &ex);
1125 libvlc_input_free(p_input);
1126 if( ! libvlc_exception_raised(&ex) )
1131 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
1132 libvlc_exception_clear(&ex);
1138 STDMETHODIMP VLCVideo::toggleFullscreen()
1140 libvlc_instance_t* p_libvlc;
1141 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1144 libvlc_exception_t ex;
1145 libvlc_exception_init(&ex);
1147 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
1148 if( ! libvlc_exception_raised(&ex) )
1150 libvlc_toggle_fullscreen(p_input, &ex);
1151 libvlc_input_free(p_input);
1152 if( ! libvlc_exception_raised(&ex) )
1157 _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
1158 libvlc_exception_clear(&ex);
1164 /*******************************************************************************/
1166 VLCControl2::VLCControl2(VLCPlugin *p_instance) :
1167 _p_instance(p_instance),
1171 _p_vlcplaylist(NULL),
1174 _p_vlcaudio = new VLCAudio(p_instance);
1175 _p_vlcinput = new VLCInput(p_instance);
1176 _p_vlcplaylist = new VLCPlaylist(p_instance);
1177 _p_vlcvideo = new VLCVideo(p_instance);
1180 VLCControl2::~VLCControl2()
1183 delete _p_vlcplaylist;
1187 _p_typeinfo->Release();
1190 HRESULT VLCControl2::loadTypeInfo(void)
1192 HRESULT hr = NOERROR;
1193 if( NULL == _p_typeinfo )
1195 ITypeLib *p_typelib;
1197 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1200 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCControl2, &_p_typeinfo);
1205 p_typelib->Release();
1211 STDMETHODIMP VLCControl2::GetTypeInfoCount(UINT* pctInfo)
1213 if( NULL == pctInfo )
1214 return E_INVALIDARG;
1216 if( SUCCEEDED(loadTypeInfo()) )
1224 STDMETHODIMP VLCControl2::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1226 if( NULL == ppTInfo )
1227 return E_INVALIDARG;
1229 if( SUCCEEDED(loadTypeInfo()) )
1231 _p_typeinfo->AddRef();
1232 *ppTInfo = _p_typeinfo;
1239 STDMETHODIMP VLCControl2::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1240 UINT cNames, LCID lcid, DISPID* rgDispID)
1242 if( SUCCEEDED(loadTypeInfo()) )
1244 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1249 STDMETHODIMP VLCControl2::Invoke(DISPID dispIdMember, REFIID riid,
1250 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1251 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1253 if( SUCCEEDED(loadTypeInfo()) )
1255 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1256 pVarResult, pExcepInfo, puArgErr);
1261 STDMETHODIMP VLCControl2::get_AutoLoop(VARIANT_BOOL *autoloop)
1263 if( NULL == autoloop )
1266 *autoloop = _p_instance->getAutoLoop() ? VARIANT_TRUE: VARIANT_FALSE;
1270 STDMETHODIMP VLCControl2::put_AutoLoop(VARIANT_BOOL autoloop)
1272 _p_instance->setAutoLoop((VARIANT_FALSE != autoloop) ? TRUE: FALSE);
1276 STDMETHODIMP VLCControl2::get_AutoPlay(VARIANT_BOOL *autoplay)
1278 if( NULL == autoplay )
1281 *autoplay = _p_instance->getAutoPlay() ? VARIANT_TRUE: VARIANT_FALSE;
1285 STDMETHODIMP VLCControl2::put_AutoPlay(VARIANT_BOOL autoplay)
1287 _p_instance->setAutoPlay((VARIANT_FALSE != autoplay) ? TRUE: FALSE);
1291 STDMETHODIMP VLCControl2::get_BaseURL(BSTR *url)
1296 *url = SysAllocStringLen(_p_instance->getBaseURL(),
1297 SysStringLen(_p_instance->getBaseURL()));
1301 STDMETHODIMP VLCControl2::put_BaseURL(BSTR mrl)
1303 _p_instance->setBaseURL(mrl);
1308 STDMETHODIMP VLCControl2::get_MRL(BSTR *mrl)
1313 *mrl = SysAllocStringLen(_p_instance->getMRL(),
1314 SysStringLen(_p_instance->getMRL()));
1318 STDMETHODIMP VLCControl2::put_MRL(BSTR mrl)
1320 _p_instance->setMRL(mrl);
1325 STDMETHODIMP VLCControl2::get_StartTime(int *seconds)
1327 if( NULL == seconds )
1330 *seconds = _p_instance->getStartTime();
1335 STDMETHODIMP VLCControl2::put_StartTime(int seconds)
1337 _p_instance->setStartTime(seconds);
1342 STDMETHODIMP VLCControl2::get_VersionInfo(BSTR *version)
1344 if( NULL == version )
1347 const char *versionStr = VLC_Version();
1348 if( NULL != versionStr )
1350 *version = BSTRFromCStr(_p_instance->getCodePage(), versionStr);
1352 return NULL == *version ? E_OUTOFMEMORY : NOERROR;
1358 STDMETHODIMP VLCControl2::get_Visible(VARIANT_BOOL *isVisible)
1360 if( NULL == isVisible )
1363 *isVisible = _p_instance->getVisible() ? VARIANT_TRUE : VARIANT_FALSE;
1368 STDMETHODIMP VLCControl2::put_Visible(VARIANT_BOOL isVisible)
1370 _p_instance->setVisible(isVisible != VARIANT_FALSE);
1375 STDMETHODIMP VLCControl2::get_Volume(int *volume)
1377 if( NULL == volume )
1380 *volume = _p_instance->getVolume();
1384 STDMETHODIMP VLCControl2::put_Volume(int volume)
1386 _p_instance->setVolume(volume);
1390 STDMETHODIMP VLCControl2::get_audio(IVLCAudio** obj)
1396 if( NULL != _p_vlcaudio )
1398 _p_vlcaudio->AddRef();
1401 return E_OUTOFMEMORY;
1404 STDMETHODIMP VLCControl2::get_input(IVLCInput** obj)
1410 if( NULL != _p_vlcinput )
1412 _p_vlcinput->AddRef();
1415 return E_OUTOFMEMORY;
1418 STDMETHODIMP VLCControl2::get_playlist(IVLCPlaylist** obj)
1423 *obj = _p_vlcplaylist;
1424 if( NULL != _p_vlcplaylist )
1426 _p_vlcplaylist->AddRef();
1429 return E_OUTOFMEMORY;
1432 STDMETHODIMP VLCControl2::get_video(IVLCVideo** obj)
1438 if( NULL != _p_vlcvideo )
1440 _p_vlcvideo->AddRef();
1443 return E_OUTOFMEMORY;