1 /*****************************************************************************
2 * vlccontrol2.cpp: ActiveX control for VLC
3 *****************************************************************************
4 * Copyright (C) 2006 the VideoLAN team
5 * Copyright (C) 2010 M2X BV
7 * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>
8 * Jean-Paul Saman <jpsaman _at_ m2x _dot_ nl>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License along
21 * with this program; if not, write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23 *****************************************************************************/
32 #include "vlccontrol2.h"
33 #include "vlccontrol.h"
39 HRESULT
VLCInterfaceBase::loadTypeInfo(REFIID riid
)
41 // if( _ti ) return NOERROR; // unnecessairy
44 HRESULT hr
= _plug
->getTypeLib(LOCALE_USER_DEFAULT
, &p_typelib
);
47 hr
= p_typelib
->GetTypeInfoOfGuid(riid
, &_ti
);
48 if( FAILED(hr
) ) _ti
= NULL
;
54 #define BIND_INTERFACE( class ) \
55 template<> REFIID VLCInterface<class, I##class>::_riid = IID_I##class;
57 BIND_INTERFACE( VLCAudio
)
58 BIND_INTERFACE( VLCInput
)
59 BIND_INTERFACE( VLCMarquee
)
60 BIND_INTERFACE( VLCLogo
)
61 BIND_INTERFACE( VLCDeinterlace
)
62 BIND_INTERFACE( VLCPlaylistItems
)
63 BIND_INTERFACE( VLCPlaylist
)
64 BIND_INTERFACE( VLCVideo
)
65 BIND_INTERFACE( VLCSubtitle
)
69 template<class I
> static inline
70 HRESULT
object_get(I
**dst
, I
*src
)
85 VARIANT_BOOL
varbool(bool b
) { return b
? VARIANT_TRUE
: VARIANT_FALSE
; }
89 STDMETHODIMP
VLCAudio::get_mute(VARIANT_BOOL
* mute
)
94 libvlc_media_player_t
*p_md
;
95 HRESULT hr
= getMD(&p_md
);
97 *mute
= varbool( libvlc_audio_get_mute(p_md
) );
101 STDMETHODIMP
VLCAudio::put_mute(VARIANT_BOOL mute
)
103 libvlc_media_player_t
*p_md
;
104 HRESULT hr
= getMD(&p_md
);
106 libvlc_audio_set_mute(p_md
, VARIANT_FALSE
!= mute
);
110 STDMETHODIMP
VLCAudio::get_volume(long* volume
)
115 libvlc_media_player_t
*p_md
;
116 HRESULT hr
= getMD(&p_md
);
118 *volume
= libvlc_audio_get_volume(p_md
);
122 STDMETHODIMP
VLCAudio::put_volume(long volume
)
124 libvlc_media_player_t
*p_md
;
125 HRESULT hr
= getMD(&p_md
);
128 libvlc_audio_set_volume(p_md
, volume
);
133 STDMETHODIMP
VLCAudio::get_track(long* track
)
138 libvlc_media_player_t
* p_md
;
139 HRESULT hr
= getMD(&p_md
);
142 *track
= libvlc_audio_get_track(p_md
);
147 STDMETHODIMP
VLCAudio::put_track(long track
)
149 libvlc_media_player_t
*p_md
;
150 HRESULT hr
= getMD(&p_md
);
153 libvlc_audio_set_track(p_md
, track
);
158 STDMETHODIMP
VLCAudio::get_count(long* trackNumber
)
160 if( NULL
== trackNumber
)
163 libvlc_media_player_t
* p_md
;
164 HRESULT hr
= getMD(&p_md
);
167 // get the number of audio track available and return it
168 *trackNumber
= libvlc_audio_get_track_count(p_md
);
174 STDMETHODIMP
VLCAudio::description(long trackID
, BSTR
* name
)
179 libvlc_media_player_t
* p_md
;
181 HRESULT hr
= getMD(&p_md
);
185 const char *psz_name
;
186 libvlc_track_description_t
*p_trackDesc
;
188 // get tracks description
189 p_trackDesc
= libvlc_audio_get_track_description(p_md
);
193 //get the number of available track
194 i_limit
= libvlc_audio_get_track_count(p_md
);
198 // check if the number given is a good one
199 if ( ( trackID
> ( i_limit
-1 ) ) || ( trackID
< 0 ) )
202 // get the good trackDesc
203 for( i
= 0 ; i
< trackID
; i
++ )
205 p_trackDesc
= p_trackDesc
->p_next
;
207 // get the track name
208 psz_name
= p_trackDesc
->psz_name
;
211 if( psz_name
!= NULL
)
213 *name
= BSTRFromCStr(CP_UTF8
, psz_name
);
214 return (NULL
== *name
) ? E_OUTOFMEMORY
: NOERROR
;
222 STDMETHODIMP
VLCAudio::get_channel(long *channel
)
224 if( NULL
== channel
)
227 libvlc_media_player_t
*p_md
;
228 HRESULT hr
= getMD(&p_md
);
231 *channel
= libvlc_audio_get_channel(p_md
);
236 STDMETHODIMP
VLCAudio::put_channel(long channel
)
238 libvlc_media_player_t
*p_md
;
239 HRESULT hr
= getMD(&p_md
);
242 libvlc_audio_set_channel(p_md
, channel
);
247 STDMETHODIMP
VLCAudio::toggleMute()
249 libvlc_media_player_t
*p_md
;
250 HRESULT hr
= getMD(&p_md
);
252 libvlc_audio_toggle_mute(p_md
);
256 /****************************************************************************/
258 STDMETHODIMP
VLCDeinterlace::disable()
260 libvlc_media_player_t
*p_md
;
261 HRESULT hr
= getMD(&p_md
);
264 libvlc_video_set_deinterlace(p_md
, "");
269 STDMETHODIMP
VLCDeinterlace::enable(BSTR mode
)
271 libvlc_media_player_t
*p_md
;
272 HRESULT hr
= getMD(&p_md
);
275 char *psz_mode
= CStrFromBSTR(CP_UTF8
, mode
);
276 libvlc_video_set_deinterlace(p_md
, psz_mode
);
277 CoTaskMemFree(psz_mode
);
282 /****************************************************************************/
284 STDMETHODIMP
VLCInput::get_length(double* length
)
290 libvlc_media_player_t
*p_md
;
291 HRESULT hr
= getMD(&p_md
);
294 *length
= (double)libvlc_media_player_get_length(p_md
);
299 STDMETHODIMP
VLCInput::get_position(double* position
)
301 if( NULL
== position
)
305 libvlc_media_player_t
*p_md
;
306 HRESULT hr
= getMD(&p_md
);
309 *position
= libvlc_media_player_get_position(p_md
);
314 STDMETHODIMP
VLCInput::put_position(double position
)
316 libvlc_media_player_t
*p_md
;
317 HRESULT hr
= getMD(&p_md
);
320 libvlc_media_player_set_position(p_md
, position
);
325 STDMETHODIMP
VLCInput::get_time(double* time
)
330 libvlc_media_player_t
*p_md
;
331 HRESULT hr
= getMD(&p_md
);
334 *time
= (double)libvlc_media_player_get_time(p_md
);
339 STDMETHODIMP
VLCInput::put_time(double time
)
341 libvlc_media_player_t
*p_md
;
342 HRESULT hr
= getMD(&p_md
);
345 libvlc_media_player_set_time(p_md
, (int64_t)time
);
350 STDMETHODIMP
VLCInput::get_state(long* state
)
355 libvlc_media_player_t
*p_md
;
356 HRESULT hr
= getMD(&p_md
);
359 *state
= libvlc_media_player_get_state(p_md
);
364 STDMETHODIMP
VLCInput::get_rate(double* rate
)
369 libvlc_media_player_t
*p_md
;
370 HRESULT hr
= getMD(&p_md
);
373 *rate
= libvlc_media_player_get_rate(p_md
);
378 STDMETHODIMP
VLCInput::put_rate(double rate
)
380 libvlc_media_player_t
*p_md
;
381 HRESULT hr
= getMD(&p_md
);
384 libvlc_media_player_set_rate(p_md
, rate
);
389 STDMETHODIMP
VLCInput::get_fps(double* fps
)
395 libvlc_media_player_t
*p_md
;
396 HRESULT hr
= getMD(&p_md
);
399 *fps
= libvlc_media_player_get_fps(p_md
);
404 STDMETHODIMP
VLCInput::get_hasVout(VARIANT_BOOL
* hasVout
)
406 if( NULL
== hasVout
)
409 libvlc_media_player_t
*p_md
;
410 HRESULT hr
= getMD(&p_md
);
413 *hasVout
= varbool( libvlc_media_player_has_vout(p_md
) );
418 /****************************************************************************/
420 HRESULT
VLCMarquee::do_put_int(unsigned idx
, LONG val
)
422 libvlc_media_player_t
*p_md
;
423 HRESULT hr
= getMD(&p_md
);
426 libvlc_video_set_marquee_int(p_md
, idx
, val
);
431 HRESULT
VLCMarquee::do_get_int(unsigned idx
, LONG
*val
)
436 libvlc_media_player_t
*p_md
;
437 HRESULT hr
= getMD(&p_md
);
440 *val
= libvlc_video_get_marquee_int(p_md
, idx
);
445 STDMETHODIMP
VLCMarquee::get_position(BSTR
* val
)
451 HRESULT hr
= do_get_int(libvlc_marquee_Position
, &i
);
453 *val
= BSTRFromCStr(CP_UTF8
, position_bynumber(i
));
458 STDMETHODIMP
VLCMarquee::put_position(BSTR val
)
460 char *n
= CStrFromBSTR(CP_UTF8
, val
);
461 if( !n
) return E_OUTOFMEMORY
;
465 if( position_byname( n
, i
) )
466 hr
= do_put_int(libvlc_marquee_Position
,i
);
474 STDMETHODIMP
VLCMarquee::get_text(BSTR
*val
)
480 libvlc_media_player_t
*p_md
;
481 HRESULT hr
= getMD(&p_md
);
484 psz
= libvlc_video_get_marquee_string(p_md
, libvlc_marquee_Text
);
486 *val
= BSTRFromCStr(CP_UTF8
, psz
);
491 STDMETHODIMP
VLCMarquee::put_text(BSTR val
)
493 libvlc_media_player_t
*p_md
;
494 HRESULT hr
= getMD(&p_md
);
497 char *psz_text
= CStrFromBSTR(CP_UTF8
, val
);
498 libvlc_video_set_marquee_string(p_md
, libvlc_marquee_Text
, psz_text
);
499 CoTaskMemFree(psz_text
);
504 /****************************************************************************/
506 STDMETHODIMP
VLCPlaylistItems::get_count(long* count
)
511 *count
= Instance()->playlist_count();
515 STDMETHODIMP
VLCPlaylistItems::clear()
517 Instance()->playlist_clear();
521 STDMETHODIMP
VLCPlaylistItems::remove(long item
)
523 libvlc_instance_t
* p_libvlc
;
524 HRESULT hr
= getVLC(&p_libvlc
);
527 Instance()->playlist_delete_item(item
);
532 /****************************************************************************/
534 STDMETHODIMP
VLCPlaylist::get_itemCount(long* count
)
540 *count
= Instance()->playlist_count();
544 STDMETHODIMP
VLCPlaylist::get_isPlaying(VARIANT_BOOL
* isPlaying
)
546 if( NULL
== isPlaying
)
549 libvlc_media_player_t
*p_md
;
550 HRESULT hr
= getMD(&p_md
);
553 *isPlaying
= varbool( libvlc_media_player_is_playing(p_md
) );
558 STDMETHODIMP
VLCPlaylist::add(BSTR uri
, VARIANT name
, VARIANT options
, long* item
)
563 if( 0 == SysStringLen(uri
) )
566 libvlc_instance_t
* p_libvlc
;
567 HRESULT hr
= getVLC(&p_libvlc
);
570 char *psz_uri
= NULL
;
571 if( SysStringLen(Instance()->getBaseURL()) > 0 )
574 ** if the MRL a relative URL, we should end up with an absolute URL
576 LPWSTR abs_url
= CombineURL(Instance()->getBaseURL(), uri
);
577 if( NULL
!= abs_url
)
579 psz_uri
= CStrFromWSTR(CP_UTF8
, abs_url
, wcslen(abs_url
));
580 CoTaskMemFree(abs_url
);
584 psz_uri
= CStrFromBSTR(CP_UTF8
, uri
);
590 ** baseURL is empty, assume MRL is absolute
592 psz_uri
= CStrFromBSTR(CP_UTF8
, uri
);
595 if( NULL
== psz_uri
)
597 return E_OUTOFMEMORY
;
603 hr
= VLCControl::CreateTargetOptions(CP_UTF8
, &options
, &ppsz_options
, &i_options
);
606 CoTaskMemFree(psz_uri
);
610 char *psz_name
= NULL
;
612 VariantInit(&v_name
);
613 if( SUCCEEDED(VariantChangeType(&v_name
, &name
, 0, VT_BSTR
)) )
615 if( SysStringLen(V_BSTR(&v_name
)) > 0 )
616 psz_name
= CStrFromBSTR(CP_UTF8
, V_BSTR(&v_name
));
618 VariantClear(&v_name
);
621 *item
= Instance()->playlist_add_extended_untrusted(psz_uri
,
622 i_options
, const_cast<const char **>(ppsz_options
));
624 VLCControl::FreeTargetOptions(ppsz_options
, i_options
);
625 CoTaskMemFree(psz_uri
);
626 if( psz_name
) /* XXX Do we even need to check? */
627 CoTaskMemFree(psz_name
);
632 STDMETHODIMP
VLCPlaylist::play()
634 Instance()->playlist_play();
638 STDMETHODIMP
VLCPlaylist::playItem(long item
)
640 Instance()->playlist_play_item(item
);
644 STDMETHODIMP
VLCPlaylist::togglePause()
646 libvlc_media_player_t
* p_md
;
647 HRESULT hr
= getMD(&p_md
);
650 libvlc_media_player_pause(p_md
);
655 STDMETHODIMP
VLCPlaylist::stop()
657 libvlc_media_player_t
*p_md
;
658 HRESULT hr
= getMD(&p_md
);
661 libvlc_media_player_stop(p_md
);
666 STDMETHODIMP
VLCPlaylist::next()
668 Instance()->playlist_next();
672 STDMETHODIMP
VLCPlaylist::prev()
674 Instance()->playlist_prev();
678 STDMETHODIMP
VLCPlaylist::clear()
680 Instance()->playlist_clear();
684 STDMETHODIMP
VLCPlaylist::removeItem(long item
)
686 libvlc_instance_t
* p_libvlc
;
687 HRESULT hr
= getVLC(&p_libvlc
);
690 Instance()->playlist_delete_item(item
);
695 STDMETHODIMP
VLCPlaylist::get_items(IVLCPlaylistItems
** obj
)
700 *obj
= _p_vlcplaylistitems
;
701 if( NULL
!= _p_vlcplaylistitems
)
703 _p_vlcplaylistitems
->AddRef();
706 return E_OUTOFMEMORY
;
709 /****************************************************************************/
711 STDMETHODIMP
VLCSubtitle::get_track(long* spu
)
716 libvlc_media_player_t
*p_md
;
717 HRESULT hr
= getMD(&p_md
);
720 *spu
= libvlc_video_get_spu(p_md
);
725 STDMETHODIMP
VLCSubtitle::put_track(long spu
)
727 libvlc_media_player_t
*p_md
;
728 HRESULT hr
= getMD(&p_md
);
731 libvlc_video_set_spu(p_md
, spu
);
736 STDMETHODIMP
VLCSubtitle::get_count(long* spuNumber
)
738 if( NULL
== spuNumber
)
741 libvlc_media_player_t
*p_md
;
742 HRESULT hr
= getMD(&p_md
);
745 // get the number of video subtitle available and return it
746 *spuNumber
= libvlc_video_get_spu_count(p_md
);
752 STDMETHODIMP
VLCSubtitle::description(long nameID
, BSTR
* name
)
757 libvlc_media_player_t
* p_md
;
759 HRESULT hr
= getMD(&p_md
);
763 const char *psz_name
;
764 libvlc_track_description_t
*p_spuDesc
;
766 // get subtitles description
767 p_spuDesc
= libvlc_video_get_spu_description(p_md
);
771 // get the number of available subtitle
772 i_limit
= libvlc_video_get_spu_count(p_md
);
776 // check if the number given is a good one
777 if ( ( nameID
> ( i_limit
-1 ) ) || ( nameID
< 0 ) )
780 // get the good spuDesc
781 for( i
= 0 ; i
< nameID
; i
++ )
783 p_spuDesc
= p_spuDesc
->p_next
;
785 // get the subtitle name
786 psz_name
= p_spuDesc
->psz_name
;
789 if( psz_name
!= NULL
)
791 *name
= BSTRFromCStr(CP_UTF8
, psz_name
);
792 return (NULL
== *name
) ? E_OUTOFMEMORY
: NOERROR
;
800 /****************************************************************************/
802 STDMETHODIMP
VLCVideo::get_fullscreen(VARIANT_BOOL
* fullscreen
)
804 if( NULL
== fullscreen
)
807 libvlc_media_player_t
*p_md
;
808 HRESULT hr
= getMD(&p_md
);
811 *fullscreen
= varbool( libvlc_get_fullscreen(p_md
) );
816 STDMETHODIMP
VLCVideo::put_fullscreen(VARIANT_BOOL fullscreen
)
818 libvlc_media_player_t
*p_md
;
819 HRESULT hr
= getMD(&p_md
);
822 libvlc_set_fullscreen(p_md
, VARIANT_FALSE
!= fullscreen
);
827 STDMETHODIMP
VLCVideo::get_width(long* width
)
832 libvlc_media_player_t
*p_md
;
833 HRESULT hr
= getMD(&p_md
);
836 *width
= libvlc_video_get_width(p_md
);
841 STDMETHODIMP
VLCVideo::get_height(long* height
)
846 libvlc_media_player_t
*p_md
;
847 HRESULT hr
= getMD(&p_md
);
850 *height
= libvlc_video_get_height(p_md
);
855 STDMETHODIMP
VLCVideo::get_aspectRatio(BSTR
* aspect
)
860 libvlc_media_player_t
*p_md
;
861 HRESULT hr
= getMD(&p_md
);
864 char *psz_aspect
= libvlc_video_get_aspect_ratio(p_md
);
868 *aspect
= BSTRFromCStr(CP_UTF8
, psz_aspect
);
869 if( NULL
== *aspect
)
871 } else if( NULL
== psz_aspect
)
878 STDMETHODIMP
VLCVideo::put_aspectRatio(BSTR aspect
)
883 libvlc_media_player_t
*p_md
;
884 HRESULT hr
= getMD(&p_md
);
887 char *psz_aspect
= CStrFromBSTR(CP_UTF8
, aspect
);
890 return E_OUTOFMEMORY
;
893 libvlc_video_set_aspect_ratio(p_md
, psz_aspect
);
895 CoTaskMemFree(psz_aspect
);
900 STDMETHODIMP
VLCVideo::get_subtitle(long* spu
)
905 libvlc_media_player_t
*p_md
;
906 HRESULT hr
= getMD(&p_md
);
909 *spu
= libvlc_video_get_spu(p_md
);
914 STDMETHODIMP
VLCVideo::put_subtitle(long spu
)
916 libvlc_media_player_t
*p_md
;
917 HRESULT hr
= getMD(&p_md
);
920 libvlc_video_set_spu(p_md
, spu
);
925 STDMETHODIMP
VLCVideo::get_crop(BSTR
* geometry
)
927 if( NULL
== geometry
)
930 libvlc_media_player_t
*p_md
;
931 HRESULT hr
= getMD(&p_md
);
934 char *psz_geometry
= libvlc_video_get_crop_geometry(p_md
);
937 *geometry
= BSTRFromCStr(CP_UTF8
, psz_geometry
);
940 } else if( !psz_geometry
)
942 free( psz_geometry
);
947 STDMETHODIMP
VLCVideo::put_crop(BSTR geometry
)
949 if( NULL
== geometry
)
952 if( 0 == SysStringLen(geometry
) )
955 libvlc_media_player_t
*p_md
;
956 HRESULT hr
= getMD(&p_md
);
959 char *psz_geometry
= CStrFromBSTR(CP_UTF8
, geometry
);
962 return E_OUTOFMEMORY
;
965 libvlc_video_set_crop_geometry(p_md
, psz_geometry
);
967 CoTaskMemFree(psz_geometry
);
972 STDMETHODIMP
VLCVideo::get_teletext(long* page
)
977 libvlc_media_player_t
*p_md
;
978 HRESULT hr
= getMD(&p_md
);
981 *page
= libvlc_video_get_teletext(p_md
);
987 STDMETHODIMP
VLCVideo::put_teletext(long page
)
989 libvlc_media_player_t
*p_md
;
990 HRESULT hr
= getMD(&p_md
);
994 libvlc_video_set_teletext(p_md
, page
);
999 STDMETHODIMP
VLCVideo::takeSnapshot(LPPICTUREDISP
* picture
)
1001 if( NULL
== picture
)
1004 libvlc_media_player_t
*p_md
;
1005 HRESULT hr
= getMD(&p_md
);
1008 static int uniqueId
= 0;
1009 TCHAR path
[MAX_PATH
+1];
1011 int pathlen
= GetTempPath(MAX_PATH
-24, path
);
1012 if( (0 == pathlen
) || (pathlen
> (MAX_PATH
-24)) )
1015 /* check temp directory path by openning it */
1017 HANDLE dirHandle
= CreateFile(path
, GENERIC_READ
,
1018 FILE_SHARE_READ
|FILE_SHARE_WRITE
|FILE_SHARE_DELETE
,
1019 NULL
, OPEN_EXISTING
, FILE_FLAG_BACKUP_SEMANTICS
, NULL
);
1020 if( INVALID_HANDLE_VALUE
== dirHandle
)
1022 Instance()->setErrorInfo(IID_IVLCVideo
,
1023 "Invalid temporary directory for snapshot images, check values of TMP, TEMP envars.");
1028 BY_HANDLE_FILE_INFORMATION bhfi
;
1029 BOOL res
= GetFileInformationByHandle(dirHandle
, &bhfi
);
1030 CloseHandle(dirHandle
);
1031 if( !res
|| !(bhfi
.dwFileAttributes
& FILE_ATTRIBUTE_DIRECTORY
) )
1033 Instance()->setErrorInfo(IID_IVLCVideo
,
1034 "Invalid temporary directory for snapshot images, check values of TMP, TEMP envars.");
1040 TCHAR filepath
[MAX_PATH
+1];
1042 _stprintf(filepath
, TEXT("%sAXVLC%lXS%lX.bmp"),
1043 path
, GetCurrentProcessId(), ++uniqueId
);
1046 /* reuse path storage for UTF8 string */
1047 char *psz_filepath
= (char *)path
;
1048 WCHAR
* wpath
= filepath
;
1050 char *psz_filepath
= path
;
1051 /* first convert to unicode using current code page */
1052 WCHAR wpath
[MAX_PATH
+1];
1053 if( 0 == MultiByteToWideChar(CP_ACP
, 0, filepath
, -1,
1054 wpath
, sizeof(wpath
)/sizeof(WCHAR
)) )
1057 /* convert to UTF8 */
1058 pathlen
= WideCharToMultiByte(CP_UTF8
, 0, wpath
, -1,
1059 psz_filepath
, sizeof(path
), NULL
, NULL
);
1060 // fail if path is 0 or too short (i.e pathlen is the same as
1063 if( (0 == pathlen
) || (sizeof(path
) == pathlen
) )
1066 /* take snapshot into file */
1067 if( libvlc_video_take_snapshot(p_md
, 0, psz_filepath
, 0, 0) == 0 )
1069 /* open snapshot file */
1070 HANDLE snapPic
= LoadImage(NULL
, filepath
, IMAGE_BITMAP
, 0, 0,
1071 LR_CREATEDIBSECTION
|LR_LOADFROMFILE
);
1076 snapDesc
.cbSizeofstruct
= sizeof(PICTDESC
);
1077 snapDesc
.picType
= PICTYPE_BITMAP
;
1078 snapDesc
.bmp
.hbitmap
= (HBITMAP
)snapPic
;
1079 snapDesc
.bmp
.hpal
= NULL
;
1081 hr
= OleCreatePictureIndirect(&snapDesc
, IID_IPictureDisp
,
1082 TRUE
, (LPVOID
*)picture
);
1086 DeleteObject(snapPic
);
1089 DeleteFile(filepath
);
1095 STDMETHODIMP
VLCVideo::toggleFullscreen()
1097 libvlc_media_player_t
*p_md
;
1098 HRESULT hr
= getMD(&p_md
);
1101 libvlc_toggle_fullscreen(p_md
);
1106 STDMETHODIMP
VLCVideo::toggleTeletext()
1108 libvlc_media_player_t
*p_md
;
1109 HRESULT hr
= getMD(&p_md
);
1112 libvlc_toggle_teletext(p_md
);
1117 STDMETHODIMP
VLCVideo::get_marquee(IVLCMarquee
** obj
)
1119 return object_get(obj
,_p_vlcmarquee
);
1122 STDMETHODIMP
VLCVideo::get_logo(IVLCLogo
** obj
)
1124 return object_get(obj
,_p_vlclogo
);
1127 STDMETHODIMP
VLCVideo::get_deinterlace(IVLCDeinterlace
** obj
)
1129 return object_get(obj
,_p_vlcdeint
);
1132 /****************************************************************************/
1134 HRESULT
VLCLogo::do_put_int(unsigned idx
, LONG val
)
1136 libvlc_media_player_t
*p_md
;
1137 HRESULT hr
= getMD(&p_md
);
1140 libvlc_video_set_logo_int(p_md
, idx
, val
);
1145 HRESULT
VLCLogo::do_get_int(unsigned idx
, LONG
*val
)
1150 libvlc_media_player_t
*p_md
;
1151 HRESULT hr
= getMD(&p_md
);
1154 *val
= libvlc_video_get_logo_int(p_md
, idx
);
1159 STDMETHODIMP
VLCLogo::file(BSTR fname
)
1161 libvlc_media_player_t
*p_md
;
1162 HRESULT hr
= getMD(&p_md
);
1164 char *n
= CStrFromBSTR(CP_UTF8
, fname
);
1165 if( !n
) hr
= E_OUTOFMEMORY
;
1169 libvlc_video_set_logo_string(p_md
, libvlc_logo_file
, n
);
1176 STDMETHODIMP
VLCLogo::get_position(BSTR
* val
)
1182 HRESULT hr
= do_get_int(libvlc_logo_position
, &i
);
1185 *val
= BSTRFromCStr(CP_UTF8
, position_bynumber(i
));
1190 STDMETHODIMP
VLCLogo::put_position(BSTR val
)
1192 char *n
= CStrFromBSTR(CP_UTF8
, val
);
1193 if( !n
) return E_OUTOFMEMORY
;
1197 if( position_byname( n
, i
) )
1198 hr
= do_put_int(libvlc_logo_position
,i
);
1206 /****************************************************************************/
1208 VLCControl2::VLCControl2(VLCPlugin
*p_instance
) :
1209 _p_instance(p_instance
),
1211 _p_vlcaudio(new VLCAudio(p_instance
)),
1212 _p_vlcinput(new VLCInput(p_instance
)),
1213 _p_vlcplaylist(new VLCPlaylist(p_instance
)),
1214 _p_vlcsubtitle(new VLCSubtitle(p_instance
)),
1215 _p_vlcvideo(new VLCVideo(p_instance
))
1219 VLCControl2::~VLCControl2()
1222 delete _p_vlcsubtitle
;
1223 delete _p_vlcplaylist
;
1227 _p_typeinfo
->Release();
1230 HRESULT
VLCControl2::loadTypeInfo(void)
1232 HRESULT hr
= NOERROR
;
1233 if( NULL
== _p_typeinfo
)
1235 ITypeLib
*p_typelib
;
1237 hr
= _p_instance
->getTypeLib(LOCALE_USER_DEFAULT
, &p_typelib
);
1240 hr
= p_typelib
->GetTypeInfoOfGuid(IID_IVLCControl2
, &_p_typeinfo
);
1245 p_typelib
->Release();
1251 STDMETHODIMP
VLCControl2::GetTypeInfoCount(UINT
* pctInfo
)
1253 if( NULL
== pctInfo
)
1254 return E_INVALIDARG
;
1256 if( SUCCEEDED(loadTypeInfo()) )
1264 STDMETHODIMP
VLCControl2::GetTypeInfo(UINT iTInfo
, LCID lcid
, LPTYPEINFO
* ppTInfo
)
1266 if( NULL
== ppTInfo
)
1267 return E_INVALIDARG
;
1269 if( SUCCEEDED(loadTypeInfo()) )
1271 _p_typeinfo
->AddRef();
1272 *ppTInfo
= _p_typeinfo
;
1279 STDMETHODIMP
VLCControl2::GetIDsOfNames(REFIID riid
, LPOLESTR
* rgszNames
,
1280 UINT cNames
, LCID lcid
, DISPID
* rgDispID
)
1282 if( SUCCEEDED(loadTypeInfo()) )
1284 return DispGetIDsOfNames(_p_typeinfo
, rgszNames
, cNames
, rgDispID
);
1289 STDMETHODIMP
VLCControl2::Invoke(DISPID dispIdMember
, REFIID riid
,
1290 LCID lcid
, WORD wFlags
, DISPPARAMS
* pDispParams
,
1291 VARIANT
* pVarResult
, EXCEPINFO
* pExcepInfo
, UINT
* puArgErr
)
1293 if( SUCCEEDED(loadTypeInfo()) )
1295 return DispInvoke(this, _p_typeinfo
, dispIdMember
, wFlags
, pDispParams
,
1296 pVarResult
, pExcepInfo
, puArgErr
);
1301 STDMETHODIMP
VLCControl2::get_AutoLoop(VARIANT_BOOL
*autoloop
)
1303 if( NULL
== autoloop
)
1306 *autoloop
= varbool( _p_instance
->getAutoLoop() );
1310 STDMETHODIMP
VLCControl2::put_AutoLoop(VARIANT_BOOL autoloop
)
1312 _p_instance
->setAutoLoop((VARIANT_FALSE
!= autoloop
) ? TRUE
: FALSE
);
1316 STDMETHODIMP
VLCControl2::get_AutoPlay(VARIANT_BOOL
*autoplay
)
1318 if( NULL
== autoplay
)
1321 *autoplay
= varbool( _p_instance
->getAutoPlay() );
1325 STDMETHODIMP
VLCControl2::put_AutoPlay(VARIANT_BOOL autoplay
)
1327 _p_instance
->setAutoPlay((VARIANT_FALSE
!= autoplay
) ? TRUE
: FALSE
);
1331 STDMETHODIMP
VLCControl2::get_BaseURL(BSTR
*url
)
1336 *url
= SysAllocStringLen(_p_instance
->getBaseURL(),
1337 SysStringLen(_p_instance
->getBaseURL()));
1341 STDMETHODIMP
VLCControl2::put_BaseURL(BSTR mrl
)
1343 _p_instance
->setBaseURL(mrl
);
1348 STDMETHODIMP
VLCControl2::get_MRL(BSTR
*mrl
)
1353 *mrl
= SysAllocStringLen(_p_instance
->getMRL(),
1354 SysStringLen(_p_instance
->getMRL()));
1358 STDMETHODIMP
VLCControl2::put_MRL(BSTR mrl
)
1360 _p_instance
->setMRL(mrl
);
1366 STDMETHODIMP
VLCControl2::get_Toolbar(VARIANT_BOOL
*visible
)
1368 if( NULL
== visible
)
1372 * Note to developers
1374 * Returning the _b_toolbar is closer to the method specification.
1375 * But returning True when toolbar is not implemented so not displayed
1376 * could be bad for ActiveX users which rely on this value to show their
1377 * own toolbar if not provided by the ActiveX.
1379 * This is the reason why FALSE is returned, until toolbar get implemented.
1382 /* DISABLED for now */
1383 // *visible = varbool( _p_instance->getShowToolbar() );
1385 *visible
= VARIANT_FALSE
;
1390 STDMETHODIMP
VLCControl2::put_Toolbar(VARIANT_BOOL visible
)
1392 _p_instance
->setShowToolbar((VARIANT_FALSE
!= visible
) ? TRUE
: FALSE
);
1397 STDMETHODIMP
VLCControl2::get_StartTime(long *seconds
)
1399 if( NULL
== seconds
)
1402 *seconds
= _p_instance
->getStartTime();
1406 STDMETHODIMP
VLCControl2::put_StartTime(long seconds
)
1408 _p_instance
->setStartTime(seconds
);
1412 STDMETHODIMP
VLCControl2::get_VersionInfo(BSTR
*version
)
1414 if( NULL
== version
)
1417 const char *versionStr
= libvlc_get_version();
1418 if( NULL
!= versionStr
)
1420 *version
= BSTRFromCStr(CP_UTF8
, versionStr
);
1422 return (NULL
== *version
) ? E_OUTOFMEMORY
: NOERROR
;
1428 STDMETHODIMP
VLCControl2::get_Visible(VARIANT_BOOL
*isVisible
)
1430 if( NULL
== isVisible
)
1433 *isVisible
= varbool( _p_instance
->getVisible() );
1438 STDMETHODIMP
VLCControl2::put_Visible(VARIANT_BOOL isVisible
)
1440 _p_instance
->setVisible(isVisible
!= VARIANT_FALSE
);
1444 STDMETHODIMP
VLCControl2::get_Volume(long *volume
)
1446 if( NULL
== volume
)
1449 *volume
= _p_instance
->getVolume();
1453 STDMETHODIMP
VLCControl2::put_Volume(long volume
)
1455 _p_instance
->setVolume(volume
);
1459 STDMETHODIMP
VLCControl2::get_BackColor(OLE_COLOR
*backcolor
)
1461 if( NULL
== backcolor
)
1464 *backcolor
= _p_instance
->getBackColor();
1468 STDMETHODIMP
VLCControl2::put_BackColor(OLE_COLOR backcolor
)
1470 _p_instance
->setBackColor(backcolor
);
1474 STDMETHODIMP
VLCControl2::get_audio(IVLCAudio
** obj
)
1476 return object_get(obj
,_p_vlcaudio
);
1479 STDMETHODIMP
VLCControl2::get_input(IVLCInput
** obj
)
1481 return object_get(obj
,_p_vlcinput
);
1484 STDMETHODIMP
VLCControl2::get_playlist(IVLCPlaylist
** obj
)
1486 return object_get(obj
,_p_vlcplaylist
);
1489 STDMETHODIMP
VLCControl2::get_subtitle(IVLCSubtitle
** obj
)
1491 return object_get(obj
,_p_vlcsubtitle
);
1494 STDMETHODIMP
VLCControl2::get_video(IVLCVideo
** obj
)
1496 return object_get(obj
,_p_vlcvideo
);