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 libvlc_exception_clear(&ex);
131 STDMETHODIMP VLCAudio::put_mute(VARIANT_BOOL mute)
133 libvlc_instance_t* p_libvlc;
134 HRESULT hr = _p_instance->getVLC(&p_libvlc);
137 libvlc_exception_t ex;
138 libvlc_exception_init(&ex);
140 libvlc_audio_set_mute(p_libvlc, VARIANT_FALSE != mute, &ex);
141 if( libvlc_exception_raised(&ex) )
143 libvlc_exception_clear(&ex);
151 STDMETHODIMP VLCAudio::get_volume(int* volume)
156 libvlc_instance_t* p_libvlc;
157 HRESULT hr = _p_instance->getVLC(&p_libvlc);
160 libvlc_exception_t ex;
161 libvlc_exception_init(&ex);
163 *volume = libvlc_audio_get_volume(p_libvlc, &ex);
164 if( libvlc_exception_raised(&ex) )
166 libvlc_exception_clear(&ex);
174 STDMETHODIMP VLCAudio::put_volume(int volume)
176 libvlc_instance_t* p_libvlc;
177 HRESULT hr = _p_instance->getVLC(&p_libvlc);
180 libvlc_exception_t ex;
181 libvlc_exception_init(&ex);
183 libvlc_audio_set_volume(p_libvlc, volume, &ex);
184 if( libvlc_exception_raised(&ex) )
186 libvlc_exception_clear(&ex);
194 STDMETHODIMP VLCAudio::toggleMute()
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_toggle_mute(p_libvlc, &ex);
204 if( libvlc_exception_raised(&ex) )
206 libvlc_exception_clear(&ex);
214 /*******************************************************************************/
216 VLCInput::~VLCInput()
219 _p_typeinfo->Release();
222 HRESULT VLCInput::loadTypeInfo(void)
224 HRESULT hr = NOERROR;
225 if( NULL == _p_typeinfo )
229 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
232 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCInput, &_p_typeinfo);
237 p_typelib->Release();
243 STDMETHODIMP VLCInput::GetTypeInfoCount(UINT* pctInfo)
245 if( NULL == pctInfo )
248 if( SUCCEEDED(loadTypeInfo()) )
256 STDMETHODIMP VLCInput::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
258 if( NULL == ppTInfo )
261 if( SUCCEEDED(loadTypeInfo()) )
263 _p_typeinfo->AddRef();
264 *ppTInfo = _p_typeinfo;
271 STDMETHODIMP VLCInput::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
272 UINT cNames, LCID lcid, DISPID* rgDispID)
274 if( SUCCEEDED(loadTypeInfo()) )
276 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
281 STDMETHODIMP VLCInput::Invoke(DISPID dispIdMember, REFIID riid,
282 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
283 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
285 if( SUCCEEDED(loadTypeInfo()) )
287 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
288 pVarResult, pExcepInfo, puArgErr);
293 STDMETHODIMP VLCInput::get_length(double* length)
298 libvlc_instance_t* p_libvlc;
299 HRESULT hr = _p_instance->getVLC(&p_libvlc);
302 libvlc_exception_t ex;
303 libvlc_exception_init(&ex);
305 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
306 if( ! libvlc_exception_raised(&ex) )
308 *length = (double)libvlc_input_get_length(p_input, &ex);
309 libvlc_input_free(p_input);
310 if( ! libvlc_exception_raised(&ex) )
315 libvlc_exception_clear(&ex);
321 STDMETHODIMP VLCInput::get_position(float* position)
323 if( NULL == position )
326 libvlc_instance_t* p_libvlc;
327 HRESULT hr = _p_instance->getVLC(&p_libvlc);
330 libvlc_exception_t ex;
331 libvlc_exception_init(&ex);
333 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
334 if( ! libvlc_exception_raised(&ex) )
336 *position = libvlc_input_get_position(p_input, &ex);
337 libvlc_input_free(p_input);
338 if( ! libvlc_exception_raised(&ex) )
343 libvlc_exception_clear(&ex);
349 STDMETHODIMP VLCInput::put_position(float position)
351 libvlc_instance_t* p_libvlc;
352 HRESULT hr = _p_instance->getVLC(&p_libvlc);
355 libvlc_exception_t ex;
356 libvlc_exception_init(&ex);
358 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
359 if( ! libvlc_exception_raised(&ex) )
361 libvlc_input_set_position(p_input, position, &ex);
362 libvlc_input_free(p_input);
363 if( ! libvlc_exception_raised(&ex) )
368 libvlc_exception_clear(&ex);
374 STDMETHODIMP VLCInput::get_time(double* time)
379 libvlc_instance_t* p_libvlc;
380 HRESULT hr = _p_instance->getVLC(&p_libvlc);
383 libvlc_exception_t ex;
384 libvlc_exception_init(&ex);
386 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
387 if( ! libvlc_exception_raised(&ex) )
389 *time = (double)libvlc_input_get_time(p_input, &ex);
390 libvlc_input_free(p_input);
391 if( ! libvlc_exception_raised(&ex) )
396 libvlc_exception_clear(&ex);
402 STDMETHODIMP VLCInput::put_time(double time)
404 libvlc_instance_t* p_libvlc;
405 HRESULT hr = _p_instance->getVLC(&p_libvlc);
408 libvlc_exception_t ex;
409 libvlc_exception_init(&ex);
411 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
412 if( ! libvlc_exception_raised(&ex) )
414 libvlc_input_set_time(p_input, (vlc_int64_t)time, &ex);
415 libvlc_input_free(p_input);
416 if( ! libvlc_exception_raised(&ex) )
421 libvlc_exception_clear(&ex);
427 STDMETHODIMP VLCInput::get_state(int* state)
432 libvlc_instance_t* p_libvlc;
433 HRESULT hr = _p_instance->getVLC(&p_libvlc);
436 libvlc_exception_t ex;
437 libvlc_exception_init(&ex);
439 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
440 if( ! libvlc_exception_raised(&ex) )
442 *state = libvlc_input_get_state(p_input, &ex);
443 libvlc_input_free(p_input);
444 if( ! libvlc_exception_raised(&ex) )
449 libvlc_exception_clear(&ex);
450 // don't fail, just return the idle state
457 STDMETHODIMP VLCInput::get_rate(float* rate)
462 libvlc_instance_t* p_libvlc;
463 HRESULT hr = _p_instance->getVLC(&p_libvlc);
466 libvlc_exception_t ex;
467 libvlc_exception_init(&ex);
469 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
470 if( ! libvlc_exception_raised(&ex) )
472 *rate = libvlc_input_get_rate(p_input, &ex);
473 libvlc_input_free(p_input);
474 if( ! libvlc_exception_raised(&ex) )
479 libvlc_exception_clear(&ex);
485 STDMETHODIMP VLCInput::put_rate(float rate)
487 libvlc_instance_t* p_libvlc;
488 HRESULT hr = _p_instance->getVLC(&p_libvlc);
491 libvlc_exception_t ex;
492 libvlc_exception_init(&ex);
494 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
495 if( ! libvlc_exception_raised(&ex) )
497 libvlc_input_set_rate(p_input, rate, &ex);
498 libvlc_input_free(p_input);
499 if( ! libvlc_exception_raised(&ex) )
504 libvlc_exception_clear(&ex);
510 STDMETHODIMP VLCInput::get_fps(float* fps)
515 libvlc_instance_t* p_libvlc;
516 HRESULT hr = _p_instance->getVLC(&p_libvlc);
519 libvlc_exception_t ex;
520 libvlc_exception_init(&ex);
522 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
523 if( ! libvlc_exception_raised(&ex) )
525 *fps = libvlc_input_get_fps(p_input, &ex);
526 libvlc_input_free(p_input);
527 if( ! libvlc_exception_raised(&ex) )
532 libvlc_exception_clear(&ex);
538 STDMETHODIMP VLCInput::get_hasVout(VARIANT_BOOL* hasVout)
540 if( NULL == hasVout )
543 libvlc_instance_t* p_libvlc;
544 HRESULT hr = _p_instance->getVLC(&p_libvlc);
547 libvlc_exception_t ex;
548 libvlc_exception_init(&ex);
550 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
551 if( ! libvlc_exception_raised(&ex) )
553 *hasVout = libvlc_input_has_vout(p_input, &ex) ? VARIANT_TRUE : VARIANT_FALSE;
554 libvlc_input_free(p_input);
555 if( ! libvlc_exception_raised(&ex) )
560 libvlc_exception_clear(&ex);
566 /*******************************************************************************/
568 VLCPlaylist::~VLCPlaylist()
571 _p_typeinfo->Release();
574 HRESULT VLCPlaylist::loadTypeInfo(void)
576 HRESULT hr = NOERROR;
577 if( NULL == _p_typeinfo )
581 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
584 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCPlaylist, &_p_typeinfo);
589 p_typelib->Release();
595 STDMETHODIMP VLCPlaylist::GetTypeInfoCount(UINT* pctInfo)
597 if( NULL == pctInfo )
600 if( SUCCEEDED(loadTypeInfo()) )
608 STDMETHODIMP VLCPlaylist::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
610 if( NULL == ppTInfo )
613 if( SUCCEEDED(loadTypeInfo()) )
615 _p_typeinfo->AddRef();
616 *ppTInfo = _p_typeinfo;
623 STDMETHODIMP VLCPlaylist::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
624 UINT cNames, LCID lcid, DISPID* rgDispID)
626 if( SUCCEEDED(loadTypeInfo()) )
628 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
633 STDMETHODIMP VLCPlaylist::Invoke(DISPID dispIdMember, REFIID riid,
634 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
635 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
637 if( SUCCEEDED(loadTypeInfo()) )
639 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
640 pVarResult, pExcepInfo, puArgErr);
645 STDMETHODIMP VLCPlaylist::get_itemCount(int* count)
650 libvlc_instance_t* p_libvlc;
651 HRESULT hr = _p_instance->getVLC(&p_libvlc);
654 libvlc_exception_t ex;
655 libvlc_exception_init(&ex);
657 *count = libvlc_playlist_items_count(p_libvlc, &ex);
658 if( libvlc_exception_raised(&ex) )
660 libvlc_exception_clear(&ex);
668 STDMETHODIMP VLCPlaylist::get_isPlaying(VARIANT_BOOL* isPlaying)
670 if( NULL == isPlaying )
673 libvlc_instance_t* p_libvlc;
674 HRESULT hr = _p_instance->getVLC(&p_libvlc);
677 libvlc_exception_t ex;
678 libvlc_exception_init(&ex);
680 *isPlaying = libvlc_playlist_isplaying(p_libvlc, &ex) ? VARIANT_TRUE: VARIANT_FALSE;
681 if( libvlc_exception_raised(&ex) )
683 libvlc_exception_clear(&ex);
691 STDMETHODIMP VLCPlaylist::add(BSTR uri, VARIANT name, VARIANT options, int* item)
696 if( 0 == SysStringLen(uri) )
699 libvlc_instance_t* p_libvlc;
700 HRESULT hr = _p_instance->getVLC(&p_libvlc);
703 libvlc_exception_t ex;
704 libvlc_exception_init(&ex);
709 hr = VLCControl::CreateTargetOptions(CP_UTF8, &options, &ppsz_options, &i_options);
713 char *psz_uri = CStrFromBSTR(CP_UTF8, uri);
714 if( NULL == psz_uri )
716 VLCControl::FreeTargetOptions(ppsz_options, i_options);
717 return E_OUTOFMEMORY;
720 char *psz_name = NULL;
722 VariantInit(&v_name);
723 if( SUCCEEDED(VariantChangeType(&v_name, &name, 0, VT_BSTR)) )
725 if( SysStringLen(V_BSTR(&v_name)) > 0 )
726 psz_name = CStrFromBSTR(CP_UTF8, V_BSTR(&v_name));
728 VariantClear(&v_name);
731 *item = libvlc_playlist_add_extended(p_libvlc,
735 const_cast<const char **>(ppsz_options),
738 VLCControl::FreeTargetOptions(ppsz_options, i_options);
739 CoTaskMemFree(psz_uri);
741 CoTaskMemFree(psz_name);
742 if( libvlc_exception_raised(&ex) )
744 libvlc_exception_clear(&ex);
752 STDMETHODIMP VLCPlaylist::play()
754 libvlc_instance_t* p_libvlc;
755 HRESULT hr = _p_instance->getVLC(&p_libvlc);
758 libvlc_exception_t ex;
759 libvlc_exception_init(&ex);
761 libvlc_playlist_play(p_libvlc, -1, 0, NULL, &ex);
762 if( libvlc_exception_raised(&ex) )
764 libvlc_exception_clear(&ex);
772 STDMETHODIMP VLCPlaylist::playItem(int item)
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, item, 0, NULL, &ex);
782 if( libvlc_exception_raised(&ex) )
784 libvlc_exception_clear(&ex);
792 STDMETHODIMP VLCPlaylist::togglePause()
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_pause(p_libvlc, &ex);
802 if( libvlc_exception_raised(&ex) )
804 libvlc_exception_clear(&ex);
812 STDMETHODIMP VLCPlaylist::stop()
814 libvlc_instance_t* p_libvlc;
815 HRESULT hr = _p_instance->getVLC(&p_libvlc);
818 libvlc_exception_t ex;
819 libvlc_exception_init(&ex);
821 libvlc_playlist_stop(p_libvlc, &ex);
822 if( libvlc_exception_raised(&ex) )
824 libvlc_exception_clear(&ex);
832 STDMETHODIMP VLCPlaylist::next()
834 libvlc_instance_t* p_libvlc;
835 HRESULT hr = _p_instance->getVLC(&p_libvlc);
838 libvlc_exception_t ex;
839 libvlc_exception_init(&ex);
841 libvlc_playlist_next(p_libvlc, &ex);
842 if( libvlc_exception_raised(&ex) )
844 libvlc_exception_clear(&ex);
852 STDMETHODIMP VLCPlaylist::prev()
854 libvlc_instance_t* p_libvlc;
855 HRESULT hr = _p_instance->getVLC(&p_libvlc);
858 libvlc_exception_t ex;
859 libvlc_exception_init(&ex);
861 libvlc_playlist_prev(p_libvlc, &ex);
862 if( libvlc_exception_raised(&ex) )
864 libvlc_exception_clear(&ex);
872 STDMETHODIMP VLCPlaylist::clear()
874 libvlc_instance_t* p_libvlc;
875 HRESULT hr = _p_instance->getVLC(&p_libvlc);
878 libvlc_exception_t ex;
879 libvlc_exception_init(&ex);
881 libvlc_playlist_clear(p_libvlc, &ex);
882 if( libvlc_exception_raised(&ex) )
884 libvlc_exception_clear(&ex);
892 STDMETHODIMP VLCPlaylist::removeItem(int item)
894 libvlc_instance_t* p_libvlc;
895 HRESULT hr = _p_instance->getVLC(&p_libvlc);
898 libvlc_exception_t ex;
899 libvlc_exception_init(&ex);
901 libvlc_playlist_delete_item(p_libvlc, item, &ex);
902 if( libvlc_exception_raised(&ex) )
904 libvlc_exception_clear(&ex);
912 /*******************************************************************************/
914 VLCVideo::~VLCVideo()
917 _p_typeinfo->Release();
920 HRESULT VLCVideo::loadTypeInfo(void)
922 HRESULT hr = NOERROR;
923 if( NULL == _p_typeinfo )
927 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
930 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCVideo, &_p_typeinfo);
935 p_typelib->Release();
941 STDMETHODIMP VLCVideo::GetTypeInfoCount(UINT* pctInfo)
943 if( NULL == pctInfo )
946 if( SUCCEEDED(loadTypeInfo()) )
954 STDMETHODIMP VLCVideo::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
956 if( NULL == ppTInfo )
959 if( SUCCEEDED(loadTypeInfo()) )
961 _p_typeinfo->AddRef();
962 *ppTInfo = _p_typeinfo;
969 STDMETHODIMP VLCVideo::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
970 UINT cNames, LCID lcid, DISPID* rgDispID)
972 if( SUCCEEDED(loadTypeInfo()) )
974 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
979 STDMETHODIMP VLCVideo::Invoke(DISPID dispIdMember, REFIID riid,
980 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
981 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
983 if( SUCCEEDED(loadTypeInfo()) )
985 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
986 pVarResult, pExcepInfo, puArgErr);
991 STDMETHODIMP VLCVideo::get_fullscreen(VARIANT_BOOL* fullscreen)
993 if( NULL == fullscreen )
996 libvlc_instance_t* p_libvlc;
997 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1000 libvlc_exception_t ex;
1001 libvlc_exception_init(&ex);
1003 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
1004 if( ! libvlc_exception_raised(&ex) )
1006 *fullscreen = libvlc_get_fullscreen(p_input, &ex) ? VARIANT_TRUE : VARIANT_FALSE;
1007 libvlc_input_free(p_input);
1008 if( ! libvlc_exception_raised(&ex) )
1013 libvlc_exception_clear(&ex);
1019 STDMETHODIMP VLCVideo::put_fullscreen(VARIANT_BOOL fullscreen)
1021 libvlc_instance_t* p_libvlc;
1022 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1025 libvlc_exception_t ex;
1026 libvlc_exception_init(&ex);
1028 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
1029 if( ! libvlc_exception_raised(&ex) )
1031 libvlc_set_fullscreen(p_input, VARIANT_FALSE != fullscreen, &ex);
1032 libvlc_input_free(p_input);
1033 if( ! libvlc_exception_raised(&ex) )
1038 libvlc_exception_clear(&ex);
1044 STDMETHODIMP VLCVideo::get_width(int* width)
1049 libvlc_instance_t* p_libvlc;
1050 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1053 libvlc_exception_t ex;
1054 libvlc_exception_init(&ex);
1056 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
1057 if( ! libvlc_exception_raised(&ex) )
1059 *width = libvlc_video_get_width(p_input, &ex);
1060 libvlc_input_free(p_input);
1061 if( ! libvlc_exception_raised(&ex) )
1066 libvlc_exception_clear(&ex);
1072 STDMETHODIMP VLCVideo::get_height(int* height)
1074 if( NULL == height )
1077 libvlc_instance_t* p_libvlc;
1078 HRESULT hr = _p_instance->getVLC(&p_libvlc);
1081 libvlc_exception_t ex;
1082 libvlc_exception_init(&ex);
1084 libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
1085 if( ! libvlc_exception_raised(&ex) )
1087 *height = libvlc_video_get_height(p_input, &ex);
1088 libvlc_input_free(p_input);
1089 if( ! libvlc_exception_raised(&ex) )
1094 libvlc_exception_clear(&ex);
1100 /*******************************************************************************/
1102 VLCControl2::VLCControl2(VLCPlugin *p_instance) :
1103 _p_instance(p_instance),
1107 _p_vlcplaylist(NULL),
1110 _p_vlcaudio = new VLCAudio(p_instance);
1111 _p_vlcinput = new VLCInput(p_instance);
1112 _p_vlcplaylist = new VLCPlaylist(p_instance);
1113 _p_vlcvideo = new VLCVideo(p_instance);
1116 VLCControl2::~VLCControl2()
1119 delete _p_vlcplaylist;
1123 _p_typeinfo->Release();
1126 HRESULT VLCControl2::loadTypeInfo(void)
1128 HRESULT hr = NOERROR;
1129 if( NULL == _p_typeinfo )
1131 ITypeLib *p_typelib;
1133 hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
1136 hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCControl2, &_p_typeinfo);
1141 p_typelib->Release();
1147 STDMETHODIMP VLCControl2::GetTypeInfoCount(UINT* pctInfo)
1149 if( NULL == pctInfo )
1150 return E_INVALIDARG;
1152 if( SUCCEEDED(loadTypeInfo()) )
1160 STDMETHODIMP VLCControl2::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
1162 if( NULL == ppTInfo )
1163 return E_INVALIDARG;
1165 if( SUCCEEDED(loadTypeInfo()) )
1167 _p_typeinfo->AddRef();
1168 *ppTInfo = _p_typeinfo;
1175 STDMETHODIMP VLCControl2::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
1176 UINT cNames, LCID lcid, DISPID* rgDispID)
1178 if( SUCCEEDED(loadTypeInfo()) )
1180 return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
1185 STDMETHODIMP VLCControl2::Invoke(DISPID dispIdMember, REFIID riid,
1186 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
1187 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
1189 if( SUCCEEDED(loadTypeInfo()) )
1191 return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
1192 pVarResult, pExcepInfo, puArgErr);
1197 STDMETHODIMP VLCControl2::get_AutoLoop(VARIANT_BOOL *autoloop)
1199 if( NULL == autoloop )
1202 *autoloop = _p_instance->getAutoLoop() ? VARIANT_TRUE: VARIANT_FALSE;
1206 STDMETHODIMP VLCControl2::put_AutoLoop(VARIANT_BOOL autoloop)
1208 _p_instance->setAutoLoop((VARIANT_FALSE != autoloop) ? TRUE: FALSE);
1212 STDMETHODIMP VLCControl2::get_AutoPlay(VARIANT_BOOL *autoplay)
1214 if( NULL == autoplay )
1217 *autoplay = _p_instance->getAutoPlay() ? VARIANT_TRUE: VARIANT_FALSE;
1221 STDMETHODIMP VLCControl2::put_AutoPlay(VARIANT_BOOL autoplay)
1223 _p_instance->setAutoPlay((VARIANT_FALSE != autoplay) ? TRUE: FALSE);
1227 STDMETHODIMP VLCControl2::get_BaseURL(BSTR *url)
1232 *url = SysAllocStringLen(_p_instance->getBaseURL(),
1233 SysStringLen(_p_instance->getBaseURL()));
1237 STDMETHODIMP VLCControl2::put_BaseURL(BSTR mrl)
1239 _p_instance->setBaseURL(mrl);
1244 STDMETHODIMP VLCControl2::get_MRL(BSTR *mrl)
1249 *mrl = SysAllocStringLen(_p_instance->getMRL(),
1250 SysStringLen(_p_instance->getMRL()));
1254 STDMETHODIMP VLCControl2::put_MRL(BSTR mrl)
1256 _p_instance->setMRL(mrl);
1261 STDMETHODIMP VLCControl2::get_StartTime(int *seconds)
1263 if( NULL == seconds )
1266 *seconds = _p_instance->getStartTime();
1271 STDMETHODIMP VLCControl2::put_StartTime(int seconds)
1273 _p_instance->setStartTime(seconds);
1278 STDMETHODIMP VLCControl2::get_VersionInfo(BSTR *version)
1280 if( NULL == version )
1283 const char *versionStr = VLC_Version();
1284 if( NULL != versionStr )
1286 *version = BSTRFromCStr(_p_instance->getCodePage(), versionStr);
1288 return NULL == *version ? E_OUTOFMEMORY : NOERROR;
1294 STDMETHODIMP VLCControl2::get_Visible(VARIANT_BOOL *isVisible)
1296 if( NULL == isVisible )
1299 *isVisible = _p_instance->getVisible() ? VARIANT_TRUE : VARIANT_FALSE;
1304 STDMETHODIMP VLCControl2::put_Visible(VARIANT_BOOL isVisible)
1306 _p_instance->setVisible(isVisible != VARIANT_FALSE);
1311 STDMETHODIMP VLCControl2::get_Volume(int *volume)
1313 if( NULL == volume )
1316 *volume = _p_instance->getVolume();
1320 STDMETHODIMP VLCControl2::put_Volume(int volume)
1322 _p_instance->setVolume(volume);
1326 STDMETHODIMP VLCControl2::get_audio(IVLCAudio** obj)
1332 if( NULL != _p_vlcaudio )
1334 _p_vlcaudio->AddRef();
1337 return E_OUTOFMEMORY;
1340 STDMETHODIMP VLCControl2::get_input(IVLCInput** obj)
1346 if( NULL != _p_vlcinput )
1348 _p_vlcinput->AddRef();
1351 return E_OUTOFMEMORY;
1354 STDMETHODIMP VLCControl2::get_playlist(IVLCPlaylist** obj)
1359 *obj = _p_vlcplaylist;
1360 if( NULL != _p_vlcplaylist )
1362 _p_vlcplaylist->AddRef();
1365 return E_OUTOFMEMORY;
1368 STDMETHODIMP VLCControl2::get_video(IVLCVideo** obj)
1374 if( NULL != _p_vlcvideo )
1376 _p_vlcvideo->AddRef();
1379 return E_OUTOFMEMORY;