]> git.sesse.net Git - vlc/commitdiff
activex plugin: move deinterlace to own video subobject.
authorJP Dinger <jpd@videolan.org>
Tue, 26 Jan 2010 16:28:26 +0000 (17:28 +0100)
committerJP Dinger <jpd@videolan.org>
Fri, 29 Jan 2010 15:51:32 +0000 (16:51 +0100)
projects/activex/axvlc.idl
projects/activex/axvlc.tlb
projects/activex/axvlc_idl.c
projects/activex/axvlc_idl.h
projects/activex/test.html
projects/activex/vlccontrol2.cpp
projects/activex/vlccontrol2.h

index 4a2371bb304e11de8b14a70a363dc292948e8aca..a1846f0ca485df1415fb8844ce8748b3851a633c 100644 (file)
@@ -41,6 +41,7 @@ library AXVLC
     interface IVLCAudio;\r
     interface IVLCInput;\r
     interface IVLCLogo;\r
+    interface IVLCDeinterlace;\r
     interface IVLCMarquee;\r
     interface IVLCPlaylist;\r
     interface IVLCSubtitle;\r
@@ -442,6 +443,21 @@ library AXVLC
         [propput, helpstring("Picture y offset.")]\r
         HRESULT y([in] long val);\r
 \r
+    };\r
+    [\r
+      odl,\r
+      uuid(bc97469f-cb11-4037-8dce-5fc9f5f85307),\r
+      helpstring("VLC Deinterlace Filter"),\r
+      dual,\r
+      oleautomation\r
+    ]\r
+    interface IVLCDeinterlace : IDispatch\r
+    {\r
+        [helpstring("Enable deinterlace filter and set method.")]\r
+        HRESULT enable([in] BSTR mode);\r
+        [helpstring("Disable deinterlace filter.")]\r
+        HRESULT disable();\r
+\r
     };\r
 \r
     [\r
@@ -485,11 +501,6 @@ library AXVLC
         [propput, helpstring("Sets teletext page to use.")]\r
         HRESULT teletext([in] long page);\r
 \r
-        [helpstring("Enable deinterlace filter.")]\r
-        HRESULT deinterlaceEnable([in] BSTR mode);\r
-        [helpstring("Disable deinterlace filter.")]\r
-        HRESULT deinterlaceDisable();\r
-\r
         [helpstring("toggle fullscreen/windowed state.")]\r
         HRESULT toggleFullscreen();\r
 \r
@@ -504,6 +515,9 @@ library AXVLC
 \r
         [propget, helpstring("Returns the logo object.")]\r
         HRESULT logo([out, retval] IVLCLogo** obj);\r
+\r
+        [propget, helpstring("Returns the logo object.")]\r
+        HRESULT deinterlace([out, retval] IVLCDeinterlace** obj);\r
     };\r
 \r
     [\r
index 1bdb298465b0ba458f267e534466c16871d9b238..5ddd2e11a13df28993252d91185dad036c75c64b 100644 (file)
Binary files a/projects/activex/axvlc.tlb and b/projects/activex/axvlc.tlb differ
index 4c34b7d94a51753c3ea1b03560ce0967dbe7f646..7b1a9ba901805e6915f840cd9eda24f49794576b 100644 (file)
@@ -1,4 +1,4 @@
-/*** Autogenerated by WIDL 1.1.32 from axvlc.idl - Do not edit ***/
+/*** Autogenerated by WIDL 1.1.23 from axvlc.idl - Do not edit ***/
 
 #include <rpc.h>
 #include <rpcndr.h>
@@ -19,6 +19,7 @@ DEFINE_GUID(IID_IVLCPlaylist, 0x54613049, 0x40bf, 0x4035, 0x9e,0x70, 0x0a,0x93,0
 DEFINE_GUID(IID_IVLCSubtitle, 0x465e787a, 0x0556, 0x452f, 0x94,0x77, 0x95,0x4e,0x4a,0x94,0x00,0x03);
 DEFINE_GUID(IID_IVLCMarquee, 0x8d076ad6, 0x9b6f, 0x4150, 0xa0,0xfd, 0x5d,0x7e,0x8c,0x8c,0xb0,0x2c);
 DEFINE_GUID(IID_IVLCLogo, 0x8a4a20c2, 0x93f3, 0x44e8, 0x86,0x44, 0xbe,0xb2,0xe3,0x48,0x7e,0x84);
+DEFINE_GUID(IID_IVLCDeinterlace, 0xbc97469f, 0xcb11, 0x4037, 0x8d,0xce, 0x5f,0xc9,0xf5,0xf8,0x53,0x07);
 DEFINE_GUID(IID_IVLCVideo, 0x0aaedf0b, 0xd333, 0x4b27, 0xa0,0xc6, 0xbb,0xf3,0x14,0x13,0xa4,0x2e);
 DEFINE_GUID(IID_IVLCControl2, 0x2d719729, 0x5333, 0x406c, 0xbf,0x12, 0x8d,0xe7,0x87,0xfd,0x65,0xe3);
 DEFINE_GUID(CLSID_VLCPlugin, 0xe23fe9c6, 0x778e, 0x49d4, 0xb5,0x37, 0x38,0xfc,0xde,0x48,0x87,0xd8);
index b6230849040e8d180cb9289f5b7780da5a54b433..705ef9b762e99d6837f4243aced8a95a7c3e1692 100644 (file)
@@ -1,4 +1,4 @@
-/*** Autogenerated by WIDL 1.1.32 from axvlc.idl - Do not edit ***/
+/*** Autogenerated by WIDL 1.1.23 from axvlc.idl - Do not edit ***/
 
 #include <rpc.h>
 #include <rpcndr.h>
@@ -61,6 +61,11 @@ typedef interface IVLCMarquee IVLCMarquee;
 typedef interface IVLCLogo IVLCLogo;
 #endif
 
+#ifndef __IVLCDeinterlace_FWD_DEFINED__
+#define __IVLCDeinterlace_FWD_DEFINED__
+typedef interface IVLCDeinterlace IVLCDeinterlace;
+#endif
+
 #ifndef __IVLCVideo_FWD_DEFINED__
 #define __IVLCVideo_FWD_DEFINED__
 typedef interface IVLCVideo IVLCVideo;
@@ -105,6 +110,11 @@ typedef interface IVLCInput IVLCInput;
 typedef interface IVLCLogo IVLCLogo;
 #endif
 
+#ifndef __IVLCDeinterlace_FWD_DEFINED__
+#define __IVLCDeinterlace_FWD_DEFINED__
+typedef interface IVLCDeinterlace IVLCDeinterlace;
+#endif
+
 #ifndef __IVLCMarquee_FWD_DEFINED__
 #define __IVLCMarquee_FWD_DEFINED__
 typedef interface IVLCMarquee IVLCMarquee;
@@ -2627,6 +2637,118 @@ void __RPC_STUB IVLCLogo_put_y_Stub(
 
 #endif  /* __IVLCLogo_INTERFACE_DEFINED__ */
 
+/*****************************************************************************
+ * IVLCDeinterlace interface
+ */
+#ifndef __IVLCDeinterlace_INTERFACE_DEFINED__
+#define __IVLCDeinterlace_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IVLCDeinterlace, 0xbc97469f, 0xcb11, 0x4037, 0x8d,0xce, 0x5f,0xc9,0xf5,0xf8,0x53,0x07);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+interface IVLCDeinterlace : public IDispatch
+{
+    virtual HRESULT STDMETHODCALLTYPE enable(
+        BSTR mode) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE disable(
+        ) = 0;
+
+};
+#else
+typedef struct IVLCDeinterlaceVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IVLCDeinterlace* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IVLCDeinterlace* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IVLCDeinterlace* This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IVLCDeinterlace* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IVLCDeinterlace* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IVLCDeinterlace* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IVLCDeinterlace* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IVLCDeinterlace methods ***/
+    HRESULT (STDMETHODCALLTYPE *enable)(
+        IVLCDeinterlace* This,
+        BSTR mode);
+
+    HRESULT (STDMETHODCALLTYPE *disable)(
+        IVLCDeinterlace* This);
+
+    END_INTERFACE
+} IVLCDeinterlaceVtbl;
+interface IVLCDeinterlace {
+    CONST_VTBL IVLCDeinterlaceVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+/*** IUnknown methods ***/
+#define IVLCDeinterlace_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IVLCDeinterlace_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IVLCDeinterlace_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
+#define IVLCDeinterlace_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
+#define IVLCDeinterlace_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
+#define IVLCDeinterlace_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
+#define IVLCDeinterlace_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
+/*** IVLCDeinterlace methods ***/
+#define IVLCDeinterlace_enable(This,mode) (This)->lpVtbl->enable(This,mode)
+#define IVLCDeinterlace_disable(This) (This)->lpVtbl->disable(This)
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IVLCDeinterlace_enable_Proxy(
+    IVLCDeinterlace* This,
+    BSTR mode);
+void __RPC_STUB IVLCDeinterlace_enable_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IVLCDeinterlace_disable_Proxy(
+    IVLCDeinterlace* This);
+void __RPC_STUB IVLCDeinterlace_disable_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IVLCDeinterlace_INTERFACE_DEFINED__ */
+
 /*****************************************************************************
  * IVLCVideo interface
  */
@@ -2673,12 +2795,6 @@ interface IVLCVideo : public IDispatch
     virtual HRESULT STDMETHODCALLTYPE put_teletext(
         LONG page) = 0;
 
-    virtual HRESULT STDMETHODCALLTYPE deinterlaceEnable(
-        BSTR mode) = 0;
-
-    virtual HRESULT STDMETHODCALLTYPE deinterlaceDisable(
-        ) = 0;
-
     virtual HRESULT STDMETHODCALLTYPE toggleFullscreen(
         ) = 0;
 
@@ -2694,6 +2810,9 @@ interface IVLCVideo : public IDispatch
     virtual HRESULT STDMETHODCALLTYPE get_logo(
         IVLCLogo **obj) = 0;
 
+    virtual HRESULT STDMETHODCALLTYPE get_deinterlace(
+        IVLCDeinterlace **obj) = 0;
+
 };
 #else
 typedef struct IVLCVideoVtbl {
@@ -2790,13 +2909,6 @@ typedef struct IVLCVideoVtbl {
         IVLCVideo* This,
         LONG page);
 
-    HRESULT (STDMETHODCALLTYPE *deinterlaceEnable)(
-        IVLCVideo* This,
-        BSTR mode);
-
-    HRESULT (STDMETHODCALLTYPE *deinterlaceDisable)(
-        IVLCVideo* This);
-
     HRESULT (STDMETHODCALLTYPE *toggleFullscreen)(
         IVLCVideo* This);
 
@@ -2815,6 +2927,10 @@ typedef struct IVLCVideoVtbl {
         IVLCVideo* This,
         IVLCLogo **obj);
 
+    HRESULT (STDMETHODCALLTYPE *get_deinterlace)(
+        IVLCVideo* This,
+        IVLCDeinterlace **obj);
+
     END_INTERFACE
 } IVLCVideoVtbl;
 interface IVLCVideo {
@@ -2844,13 +2960,12 @@ interface IVLCVideo {
 #define IVLCVideo_put_crop(This,geometry) (This)->lpVtbl->put_crop(This,geometry)
 #define IVLCVideo_get_teletext(This,page) (This)->lpVtbl->get_teletext(This,page)
 #define IVLCVideo_put_teletext(This,page) (This)->lpVtbl->put_teletext(This,page)
-#define IVLCVideo_deinterlaceEnable(This,mode) (This)->lpVtbl->deinterlaceEnable(This,mode)
-#define IVLCVideo_deinterlaceDisable(This) (This)->lpVtbl->deinterlaceDisable(This)
 #define IVLCVideo_toggleFullscreen(This) (This)->lpVtbl->toggleFullscreen(This)
 #define IVLCVideo_takeSnapshot(This,picture) (This)->lpVtbl->takeSnapshot(This,picture)
 #define IVLCVideo_toggleTeletext(This) (This)->lpVtbl->toggleTeletext(This)
 #define IVLCVideo_get_marquee(This,obj) (This)->lpVtbl->get_marquee(This,obj)
 #define IVLCVideo_get_logo(This,obj) (This)->lpVtbl->get_logo(This,obj)
+#define IVLCVideo_get_deinterlace(This,obj) (This)->lpVtbl->get_deinterlace(This,obj)
 #endif
 
 #endif
@@ -2951,21 +3066,6 @@ void __RPC_STUB IVLCVideo_put_teletext_Stub(
     IRpcChannelBuffer* pRpcChannelBuffer,
     PRPC_MESSAGE pRpcMessage,
     DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IVLCVideo_deinterlaceEnable_Proxy(
-    IVLCVideo* This,
-    BSTR mode);
-void __RPC_STUB IVLCVideo_deinterlaceEnable_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
-HRESULT STDMETHODCALLTYPE IVLCVideo_deinterlaceDisable_Proxy(
-    IVLCVideo* This);
-void __RPC_STUB IVLCVideo_deinterlaceDisable_Stub(
-    IRpcStubBuffer* This,
-    IRpcChannelBuffer* pRpcChannelBuffer,
-    PRPC_MESSAGE pRpcMessage,
-    DWORD* pdwStubPhase);
 HRESULT STDMETHODCALLTYPE IVLCVideo_toggleFullscreen_Proxy(
     IVLCVideo* This);
 void __RPC_STUB IVLCVideo_toggleFullscreen_Stub(
@@ -3004,6 +3104,14 @@ void __RPC_STUB IVLCVideo_get_logo_Stub(
     IRpcChannelBuffer* pRpcChannelBuffer,
     PRPC_MESSAGE pRpcMessage,
     DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IVLCVideo_get_deinterlace_Proxy(
+    IVLCVideo* This,
+    IVLCDeinterlace **obj);
+void __RPC_STUB IVLCVideo_get_deinterlace_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
 
 #endif  /* __IVLCVideo_INTERFACE_DEFINED__ */
 
index ff9645aa591fb01d5647499786ba7d67fd72bba8..2c614202705481792078ae25028c3d0686ddff6a 100644 (file)
@@ -205,9 +205,9 @@ Insert Slider widget
 </TR>\r
 <TR>\r
 <TD>Deinterlacing:\r
-    <INPUT type=button value="BLEND" onClick='getVLC("vlc").video.deinterlaceEnable("blend");'>\r
-    <INPUT type=button value="  X  " onClick='getVLC("vlc").video.deinterlaceEnable("x");'>\r
-    <INPUT type=button value="Disable" onClick='getVLC("vlc").video.deinterlaceDisable();'>\r
+    <INPUT type=button value="BLEND" onClick='getVLC("vlc").video.deinterlace.enable("blend");'>\r
+    <INPUT type=button value="  X  " onClick='getVLC("vlc").video.deinterlace.enable("x");'>\r
+    <INPUT type=button value="Disable" onClick='getVLC("vlc").video.deinterlace.disable();'>\r
 </TD>\r
 </TR>\r
 <TR>\r
index a32686f1b21e0d671840a2dfc9f976c6c3280a58..9fa4f5ea875c431ef7b3494b27485219d376a1c1 100644 (file)
@@ -65,6 +65,7 @@ BIND_INTERFACE( VLCAudio )
 BIND_INTERFACE( VLCInput )
 BIND_INTERFACE( VLCMarquee )
 BIND_INTERFACE( VLCLogo )
+BIND_INTERFACE( VLCDeinterlace )
 BIND_INTERFACE( VLCPlaylistItems )
 BIND_INTERFACE( VLCPlaylist )
 BIND_INTERFACE( VLCVideo )
@@ -288,6 +289,39 @@ STDMETHODIMP VLCAudio::toggleMute()
 
 /****************************************************************************/
 
+STDMETHODIMP VLCDeinterlace::disable()
+{
+    libvlc_media_player_t *p_md;
+    HRESULT hr = getMD(&p_md);
+    if( SUCCEEDED(hr) )
+    {
+        libvlc_exception_t ex;
+        libvlc_exception_init(&ex);
+
+        libvlc_video_set_deinterlace(p_md, 0, "", &ex);
+        hr = exception_bridge(&ex);
+    }
+    return hr;
+}
+
+STDMETHODIMP VLCDeinterlace::enable(BSTR mode)
+{
+    libvlc_media_player_t *p_md;
+    HRESULT hr = getMD(&p_md);
+    if( SUCCEEDED(hr) )
+    {
+        libvlc_exception_t ex;
+        libvlc_exception_init(&ex);
+        char *psz_mode = CStrFromBSTR(CP_UTF8, mode);
+        libvlc_video_set_deinterlace(p_md, 1, psz_mode, &ex);
+        CoTaskMemFree(psz_mode);
+        hr = exception_bridge(&ex);
+    }
+    return hr;
+}
+
+/****************************************************************************/
+
 STDMETHODIMP VLCInput::get_length(double* length)
 {
     if( NULL == length )
@@ -1177,39 +1211,6 @@ STDMETHODIMP VLCVideo::put_teletext(long page)
     return hr;
 };
 
-STDMETHODIMP VLCVideo::deinterlaceDisable()
-{
-    libvlc_media_player_t *p_md;
-    HRESULT hr = getMD(&p_md);
-    if( SUCCEEDED(hr) )
-    {
-        libvlc_exception_t ex;
-        libvlc_exception_init(&ex);
-
-        libvlc_video_set_deinterlace(p_md, 0, "", &ex);
-        hr = exception_bridge(&ex);
-    }
-    return hr;
-};
-
-STDMETHODIMP VLCVideo::deinterlaceEnable(BSTR mode)
-{
-    libvlc_media_player_t *p_md;
-    HRESULT hr = getMD(&p_md);
-    if( SUCCEEDED(hr) )
-    {
-        libvlc_exception_t ex;
-        libvlc_exception_init(&ex);
-        /* get deinterlace mode from the user */
-        char *psz_mode = CStrFromBSTR(CP_UTF8, mode);
-        /* enable deinterlace filter if possible */
-        libvlc_video_set_deinterlace(p_md, 1, psz_mode, &ex);
-        hr = exception_bridge(&ex);
-        CoTaskMemFree(psz_mode);
-    }
-    return hr;
-};
-
 STDMETHODIMP VLCVideo::takeSnapshot(LPPICTUREDISP* picture)
 {
     if( NULL == picture )
@@ -1351,6 +1352,11 @@ STDMETHODIMP VLCVideo::get_logo(IVLCLogo** obj)
     return object_get(obj,_p_vlclogo);
 }
 
+STDMETHODIMP VLCVideo::get_deinterlace(IVLCDeinterlace** obj)
+{
+    return object_get(obj,_p_vlcdeint);
+}
+
 
 /****************************************************************************/
 
index ba09f1f76105774d12af9e2b93ee19008d64ab54..a2f4117a81098c494cfd27c034d844cc7df4c09a 100644 (file)
@@ -239,6 +239,18 @@ private:
     HRESULT do_get_int(unsigned idx, LONG *val);
 };
 
+
+class VLCDeinterlace: public VLCInterface<VLCDeinterlace,IVLCDeinterlace>
+{
+public:
+    VLCDeinterlace(VLCPlugin *p):
+        VLCInterface<VLCDeinterlace,IVLCDeinterlace>(p) { }
+
+    STDMETHODIMP enable(BSTR val);
+    STDMETHODIMP disable();
+};
+
+
 class VLCPlaylistItems: public VLCInterface<VLCPlaylistItems,IVLCPlaylistItems>
 {
 public:
@@ -293,8 +305,13 @@ class VLCVideo: public VLCInterface<VLCVideo,IVLCVideo>
 {
 public:
     VLCVideo(VLCPlugin *p): VLCInterface<VLCVideo,IVLCVideo>(p),
-        _p_vlcmarquee(new VLCMarquee(p)), _p_vlclogo(new VLCLogo(p)) { }
-    virtual ~VLCVideo() { delete _p_vlcmarquee; delete _p_vlclogo; }
+        _p_vlcmarquee(new VLCMarquee(p)), _p_vlclogo(new VLCLogo(p)),
+        _p_vlcdeint(new VLCDeinterlace(p)) { }
+    virtual ~VLCVideo() {
+        delete _p_vlcmarquee;
+        delete _p_vlclogo;
+        delete _p_vlcdeint;
+    }
 
     // IVLCVideo methods
     STDMETHODIMP get_fullscreen(VARIANT_BOOL*);
@@ -311,15 +328,15 @@ public:
     STDMETHODIMP put_teletext(long);
     STDMETHODIMP get_marquee(IVLCMarquee**);
     STDMETHODIMP get_logo(IVLCLogo**);
-    STDMETHODIMP deinterlaceDisable();
-    STDMETHODIMP deinterlaceEnable(BSTR);
+    STDMETHODIMP get_deinterlace(IVLCDeinterlace**);
     STDMETHODIMP takeSnapshot(LPPICTUREDISP*);
     STDMETHODIMP toggleFullscreen();
     STDMETHODIMP toggleTeletext();
 
 private:
-    IVLCMarquee *_p_vlcmarquee;
-    IVLCLogo    *_p_vlclogo;
+    IVLCMarquee     *_p_vlcmarquee;
+    IVLCLogo        *_p_vlclogo;
+    IVLCDeinterlace *_p_vlcdeint;
 };
 
 class VLCControl2 : public IVLCControl2