1 /*****************************************************************************
2 * vlccontrol.h: 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 *****************************************************************************/
25 #ifndef _VLCCONTROL2_H_
26 #define _VLCCONTROL2_H_
28 #include "axvlc_idl.h"
30 #include <vlc/libvlc.h>
33 class VLCInterfaceBase {
35 VLCInterfaceBase(VLCPlugin *p): _plug(p), _ti(NULL) { }
36 virtual ~VLCInterfaceBase() { if( _ti ) _ti->Release(); }
38 VLCPlugin *Instance() const { return _plug; }
39 HRESULT getVLC(libvlc_instance_t **pp) const { return _plug->getVLC(pp); }
40 HRESULT getMD(libvlc_media_player_t **pp) const { return _plug->getMD(pp); }
43 HRESULT loadTypeInfo(REFIID riid);
44 ITypeInfo *TypeInfo() const { return _ti; }
46 STDMETHODIMP_(ULONG) AddRef(void) { return _plug->pUnkOuter->AddRef(); };
47 STDMETHODIMP_(ULONG) Release(void) { return _plug->pUnkOuter->Release(); };
53 template<class T,class I>
54 class VLCInterface: public I, private VLCInterfaceBase
57 typedef VLCInterfaceBase Base;
58 T *This() { return static_cast< T *>(this); }
59 const T *This() const { return static_cast<const T *>(this); }
61 HRESULT loadTypeInfo()
63 return TypeInfo() ? NOERROR : Base::loadTypeInfo(_riid);
67 VLCInterface(VLCPlugin *p): Base(p) { }
68 VLCPlugin *Instance() const { return Base::Instance(); }
70 HRESULT getVLC(libvlc_instance_t **pp) const { return Base::getVLC(pp); }
71 HRESULT getMD(libvlc_media_player_t **pp) const { return Base::getMD(pp); }
73 STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
75 if( NULL == ppv ) return E_POINTER;
77 if( (IID_IUnknown == riid)
78 || (IID_IDispatch == riid)
82 *ppv = reinterpret_cast<LPVOID>(This());
85 // behaves as a standalone object
89 STDMETHODIMP GetTypeInfoCount(UINT* pctInfo)
93 *pctInfo = SUCCEEDED(loadTypeInfo()) ? 1 : 0;
96 STDMETHODIMP GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
101 if( SUCCEEDED(loadTypeInfo()) )
103 (*ppTInfo = TypeInfo())->AddRef();
110 STDMETHODIMP GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
111 UINT cNames, LCID lcid, DISPID* rgDispID)
113 return FAILED(loadTypeInfo()) ? E_NOTIMPL :
114 DispGetIDsOfNames(TypeInfo(), rgszNames, cNames, rgDispID);
117 STDMETHODIMP Invoke(DISPID dispIdMember, REFIID riid,
118 LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
119 VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
121 return FAILED(loadTypeInfo()) ? E_NOTIMPL :
122 DispInvoke(This(), TypeInfo(), dispIdMember, wFlags,
123 pDispParams, pVarResult, pExcepInfo, puArgErr);
126 STDMETHODIMP_(ULONG) AddRef(void) { return Base::AddRef(); };
127 STDMETHODIMP_(ULONG) Release(void) { return Base::Release(); };
132 class VLCAudio : public VLCInterface<VLCAudio,IVLCAudio>
135 VLCAudio(VLCPlugin *p): VLCInterface<VLCAudio,IVLCAudio>(p) { }
138 STDMETHODIMP get_mute(VARIANT_BOOL*);
139 STDMETHODIMP put_mute(VARIANT_BOOL);
140 STDMETHODIMP get_volume(long*);
141 STDMETHODIMP put_volume(long);
142 STDMETHODIMP get_track(long*);
143 STDMETHODIMP put_track(long);
144 STDMETHODIMP get_count(long*);
145 STDMETHODIMP get_channel(long*);
146 STDMETHODIMP put_channel(long);
147 STDMETHODIMP toggleMute();
148 STDMETHODIMP description(long, BSTR*);
151 class VLCInput: public VLCInterface<VLCInput,IVLCInput>
154 VLCInput(VLCPlugin *p): VLCInterface<VLCInput,IVLCInput>(p) { }
157 STDMETHODIMP get_length(double*);
158 STDMETHODIMP get_position(double*);
159 STDMETHODIMP put_position(double);
160 STDMETHODIMP get_time(double*);
161 STDMETHODIMP put_time(double);
162 STDMETHODIMP get_state(long*);
163 STDMETHODIMP get_rate(double*);
164 STDMETHODIMP put_rate(double);
165 STDMETHODIMP get_fps(double*);
166 STDMETHODIMP get_hasVout(VARIANT_BOOL*);
169 class VLCMarquee: public VLCInterface<VLCMarquee,IVLCMarquee>
172 VLCMarquee(VLCPlugin *p): VLCInterface<VLCMarquee,IVLCMarquee>(p) { }
174 // IVLCMarquee methods
175 STDMETHODIMP enable() { return do_put_int(libvlc_marquee_Enable, true); }
176 STDMETHODIMP disable() { return do_put_int(libvlc_marquee_Enable, false); }
178 STDMETHODIMP get_text(BSTR *);
179 STDMETHODIMP put_text(BSTR);
180 STDMETHODIMP get_position(BSTR *);
181 STDMETHODIMP put_position(BSTR);
183 #define PROP_INT( a, b ) \
184 STDMETHODIMP get_##a(LONG *val) { return do_get_int(b,val); } \
185 STDMETHODIMP put_##a(LONG val) { return do_put_int(b,val); }
187 PROP_INT( color, libvlc_marquee_Color )
188 PROP_INT( opacity, libvlc_marquee_Opacity )
189 PROP_INT( refresh, libvlc_marquee_Refresh )
190 PROP_INT( size, libvlc_marquee_Size )
191 PROP_INT( timeout, libvlc_marquee_Timeout )
192 PROP_INT( x, libvlc_marquee_X )
193 PROP_INT( y, libvlc_marquee_Y )
198 HRESULT do_put_int(unsigned idx, LONG val);
199 HRESULT do_get_int(unsigned idx, LONG *val);
202 class VLCLogo: public VLCInterface<VLCLogo,IVLCLogo>
205 VLCLogo(VLCPlugin *p): VLCInterface<VLCLogo,IVLCLogo>(p) { }
207 STDMETHODIMP enable() { return do_put_int(libvlc_logo_enable, true); }
208 STDMETHODIMP disable() { return do_put_int(libvlc_logo_enable, false); }
210 STDMETHODIMP file(BSTR fname);
212 #define PROP_INT( a ) \
213 STDMETHODIMP get_##a(LONG *val) \
214 { return do_get_int(libvlc_logo_##a,val); } \
215 STDMETHODIMP put_##a(LONG val) \
216 { return do_put_int(libvlc_logo_##a,val); }
226 STDMETHODIMP get_position(BSTR* val);
227 STDMETHODIMP put_position(BSTR val);
230 HRESULT do_put_int(unsigned idx, LONG val);
231 HRESULT do_get_int(unsigned idx, LONG *val);
234 class VLCDeinterlace: public VLCInterface<VLCDeinterlace,IVLCDeinterlace>
237 VLCDeinterlace(VLCPlugin *p):
238 VLCInterface<VLCDeinterlace,IVLCDeinterlace>(p) { }
240 STDMETHODIMP enable(BSTR val);
241 STDMETHODIMP disable();
244 class VLCPlaylistItems: public VLCInterface<VLCPlaylistItems,IVLCPlaylistItems>
247 VLCPlaylistItems(VLCPlugin *p):
248 VLCInterface<VLCPlaylistItems,IVLCPlaylistItems>(p) { }
250 // IVLCPlaylistItems methods
251 STDMETHODIMP get_count(long*);
252 STDMETHODIMP clear();
253 STDMETHODIMP remove(long);
256 class VLCPlaylist: public VLCInterface<VLCPlaylist,IVLCPlaylist>
259 VLCPlaylist(VLCPlugin *p):
260 VLCInterface<VLCPlaylist,IVLCPlaylist>(p),
261 _p_vlcplaylistitems(new VLCPlaylistItems(p)) { }
262 virtual ~VLCPlaylist() { delete _p_vlcplaylistitems; }
264 // IVLCPlaylist methods
265 STDMETHODIMP get_itemCount(long*);
266 STDMETHODIMP get_isPlaying(VARIANT_BOOL*);
267 STDMETHODIMP add(BSTR, VARIANT, VARIANT, long*);
269 STDMETHODIMP playItem(long);
270 STDMETHODIMP togglePause();
274 STDMETHODIMP clear();
275 STDMETHODIMP removeItem(long);
276 STDMETHODIMP get_items(IVLCPlaylistItems**);
279 VLCPlaylistItems* _p_vlcplaylistitems;
282 class VLCSubtitle: public VLCInterface<VLCSubtitle,IVLCSubtitle>
285 VLCSubtitle(VLCPlugin *p): VLCInterface<VLCSubtitle,IVLCSubtitle>(p) { }
287 // IVLCSubtitle methods
288 STDMETHODIMP get_track(long*);
289 STDMETHODIMP put_track(long);
290 STDMETHODIMP get_count(long*);
291 STDMETHODIMP description(long, BSTR*);
294 class VLCVideo: public VLCInterface<VLCVideo,IVLCVideo>
297 VLCVideo(VLCPlugin *p): VLCInterface<VLCVideo,IVLCVideo>(p),
298 _p_vlcmarquee(new VLCMarquee(p)), _p_vlclogo(new VLCLogo(p)),
299 _p_vlcdeint(new VLCDeinterlace(p)) { }
300 virtual ~VLCVideo() {
301 delete _p_vlcmarquee;
307 STDMETHODIMP get_fullscreen(VARIANT_BOOL*);
308 STDMETHODIMP put_fullscreen(VARIANT_BOOL);
309 STDMETHODIMP get_width(long*);
310 STDMETHODIMP get_height(long*);
311 STDMETHODIMP get_aspectRatio(BSTR*);
312 STDMETHODIMP put_aspectRatio(BSTR);
313 STDMETHODIMP get_subtitle(long*);
314 STDMETHODIMP put_subtitle(long);
315 STDMETHODIMP get_crop(BSTR*);
316 STDMETHODIMP put_crop(BSTR);
317 STDMETHODIMP get_teletext(long*);
318 STDMETHODIMP put_teletext(long);
319 STDMETHODIMP get_marquee(IVLCMarquee**);
320 STDMETHODIMP get_logo(IVLCLogo**);
321 STDMETHODIMP get_deinterlace(IVLCDeinterlace**);
322 STDMETHODIMP takeSnapshot(LPPICTUREDISP*);
323 STDMETHODIMP toggleFullscreen();
324 STDMETHODIMP toggleTeletext();
327 IVLCMarquee *_p_vlcmarquee;
328 IVLCLogo *_p_vlclogo;
329 IVLCDeinterlace *_p_vlcdeint;
332 class VLCControl2 : public IVLCControl2
336 VLCControl2(VLCPlugin *p_instance);
337 virtual ~VLCControl2();
340 STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
344 if( (IID_IUnknown == riid)
345 || (IID_IDispatch == riid)
346 || (IID_IVLCControl2 == riid) )
349 *ppv = reinterpret_cast<LPVOID>(this);
352 return _p_instance->pUnkOuter->QueryInterface(riid, ppv);
355 STDMETHODIMP_(ULONG) AddRef(void) { return _p_instance->pUnkOuter->AddRef(); };
356 STDMETHODIMP_(ULONG) Release(void) { return _p_instance->pUnkOuter->Release(); };
359 STDMETHODIMP GetTypeInfoCount(UINT*);
360 STDMETHODIMP GetTypeInfo(UINT, LCID, LPTYPEINFO*);
361 STDMETHODIMP GetIDsOfNames(REFIID,LPOLESTR*,UINT,LCID,DISPID*);
362 STDMETHODIMP Invoke(DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*);
364 // IVLCControl2 methods
365 STDMETHODIMP get_AutoLoop(VARIANT_BOOL *autoloop);
366 STDMETHODIMP put_AutoLoop(VARIANT_BOOL autoloop);
367 STDMETHODIMP get_AutoPlay(VARIANT_BOOL *autoplay);
368 STDMETHODIMP put_AutoPlay(VARIANT_BOOL autoplay);
369 STDMETHODIMP get_BaseURL(BSTR *url);
370 STDMETHODIMP put_BaseURL(BSTR url);
371 STDMETHODIMP get_MRL(BSTR *mrl);
372 STDMETHODIMP put_MRL(BSTR mrl);
373 STDMETHODIMP get_Toolbar(VARIANT_BOOL *visible);
374 STDMETHODIMP put_Toolbar(VARIANT_BOOL visible);
375 STDMETHODIMP get_StartTime(long *seconds);
376 STDMETHODIMP put_StartTime(long seconds);
377 STDMETHODIMP get_VersionInfo(BSTR *version);
378 STDMETHODIMP get_Visible(VARIANT_BOOL *visible);
379 STDMETHODIMP put_Visible(VARIANT_BOOL visible);
380 STDMETHODIMP get_Volume(long *volume);
381 STDMETHODIMP put_Volume(long volume);
382 STDMETHODIMP get_BackColor(OLE_COLOR *backcolor);
383 STDMETHODIMP put_BackColor(OLE_COLOR backcolor);
385 STDMETHODIMP get_audio(IVLCAudio**);
386 STDMETHODIMP get_input(IVLCInput**);
387 STDMETHODIMP get_playlist(IVLCPlaylist**);
388 STDMETHODIMP get_subtitle(IVLCSubtitle**);
389 STDMETHODIMP get_video(IVLCVideo**);
392 HRESULT loadTypeInfo();
395 VLCPlugin *_p_instance;
396 ITypeInfo *_p_typeinfo;
398 IVLCAudio *_p_vlcaudio;
399 IVLCInput *_p_vlcinput;
400 IVLCPlaylist *_p_vlcplaylist;
401 IVLCSubtitle *_p_vlcsubtitle;
402 IVLCVideo *_p_vlcvideo;