/*
 * Copyright 2014 Jacek Caban for CodeWeavers
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

import "oaidl.idl";
import "ocidl.idl";

#ifndef __WIDL__
#define threading(model)
#define progid(str)
#define vi_progid(str)
#endif

[
    helpstring("Windows Media Player"),
    version(1.0),
    uuid(6bf52a50-394a-11d3-b153-00c04f79Faa6)
]
library WMPLib {
    importlib("stdole2.tlb");

    typedef enum {
        wmposUndefined,
        wmposPlaylistChanging,
        wmposPlaylistLocating,
        wmposPlaylistConnecting,
        wmposPlaylistLoading,
        wmposPlaylistOpening,
        wmposPlaylistOpenNoMedia,
        wmposPlaylistChanged,
        wmposMediaChanging,
        wmposMediaLocating,
        wmposMediaConnecting,
        wmposMediaLoading,
        wmposMediaOpening,
        wmposMediaOpen,
        wmposBeginCodecAcquisition,
        wmposEndCodecAcquisition,
        wmposBeginLicenseAcquisition,
        wmposEndLicenseAcquisition,
        wmposBeginIndividualization,
        wmposEndIndividualization,
        wmposMediaWaiting,
        wmposOpeningUnknownURL
    } WMPOpenState;

    typedef enum {
        wmppsUndefined,
        wmppsStopped,
        wmppsPaused,
        wmppsPlaying,
        wmppsScanForward,
        wmppsScanReverse,
        wmppsBuffering,
        wmppsWaiting,
        wmppsMediaEnded,
        wmppsTransitioning,
        wmppsReady,
        wmppsReconnecting,
        wmppsLast
    } WMPPlayState;

    typedef enum {
        wmplcUnknown,
        wmplcClear,
        wmplcInfoChange,
        wmplcMove,
        wmplcDelete,
        wmplcInsert,
        wmplcAppend,
        wmplcPrivate,
        wmplcNameChange,
        wmplcMorph,
        wmplcSort,
        wmplcLast
    } WMPPlaylistChangeEventType;

    typedef enum {
        wmpdsUnknown,
        wmpdsPartnershipExists,
        wmpdsPartnershipDeclined,
        wmpdsPartnershipAnother,
        wmpdsManualDevice,
        wmpdsNewDevice,
        wmpdsLast
    } WMPDeviceStatus;

    typedef enum {
        wmpssUnknown,
        wmpssSynchronizing,
        wmpssStopped,
        wmpssEstimating,
        wmpssLast
    } WMPSyncState;

    typedef enum {
        wmprsUnknown,
        wmprsRipping,
        wmprsStopped
    } WMPRipState;

    typedef enum {
        wmpbfAudioCD,
        wmpbfDataCD
    } WMPBurnFormat;

    typedef enum {
        wmpbsUnknown,
        wmpbsBusy,
        wmpbsReady,
        wmpbsWaitingForDisc,
        wmpbsRefreshStatusPending,
        wmpbsPreparingToBurn,
        wmpbsBurning,
        wmpbsStopped,
        wmpbsErasing,
        wmpbsDownloading
    } WMPBurnState;

    typedef enum {
        wmpltUnknown,
        wmpltAll,
        wmpltLocal,
        wmpltRemote,
        wmpltDisc,
        wmpltPortableDevice
    } WMPLibraryType;

    typedef enum {
        wmpfssUnknown,
        wmpfssScanning,
        wmpfssUpdating,
        wmpfssStopped
    } WMPFolderScanState;

    typedef enum {
        wmpsccetUnknown,
        wmpsccetInsert,
        wmpsccetChange,
        wmpsccetDelete,
        wmpsccetClear,
        wmpsccetBeginUpdates,
        wmpsccetEndUpdates
    } WMPStringCollectionChangeEventType;

    interface IWMPMedia;

    [
        odl,
        uuid(d5f0f4f1-130c-11d3-b14e-00c04f79Faa6),
        dual,
        oleautomation
    ]
    interface IWMPPlaylist : IDispatch
    {
        [id(0x00c9), propget]
        HRESULT count([out, retval] long *plCount);

        [id(0x00ca), propget]
        HRESULT name([out, retval] BSTR *pbstrName);
        [id(0x00ca), propput]
        HRESULT name([in] BSTR pbstrName);

        [id(0x00d2), propget]
        HRESULT attributeCount([out, retval] long *plCount);

        [id(0x00d3), propget]
        HRESULT attributeName(
            [in] long lIndex,
            [out, retval] BSTR *pbstrAttributeName);

        [id(0x00d4), propget]
        HRESULT Item(
            [in] long lIndex,
            [out, retval] IWMPMedia** ppIWMPMedia);

        [id(0x00cb)]
        HRESULT getItemInfo(
            [in] BSTR bstrName,
            [out, retval] BSTR *pbstrVal);

        [id(0x00cc)]
        HRESULT setItemInfo(
            [in] BSTR bstrName,
            [in] BSTR bstrValue);

        [id(0x00d5), propget]
        HRESULT isIdentical(
            [in] IWMPPlaylist *pIWMPPlaylist,
            [out, retval] VARIANT_BOOL *pvbool);

        [id(0x00cd)]
        HRESULT clear();

        [id(0x00ce)]
        HRESULT insertItem(
            [in] long lIndex,
            [in] IWMPMedia *pIWMPMedia);

        [id(0x00cf)]
        HRESULT appendItem([in] IWMPMedia *pIWMPMedia);

        [id(0x00d0)]
        HRESULT removeItem([in] IWMPMedia *pIWMPMedia);

        [id(0x00d1)]
        HRESULT moveItem(
            long lIndexOld,
            long lIndexNew);
    }

    [
        odl,
        uuid(94d55e95-3Fac-11d3-b155-00c04f79faa6),
        dual,
        oleautomation
    ]
    interface IWMPMedia : IDispatch
    {
        [id(0x02fb), propget]
        HRESULT isIdentical(
            [in] IWMPMedia *pIWMPMedia,
            [out, retval] VARIANT_BOOL *pvbool);

        [id(0x02ef), propget]
        HRESULT sourceURL([out, retval] BSTR *pbstrSourceURL);

        [id(0x02fc), propget]
        HRESULT name([out, retval] BSTR *pbstrName);
        [id(0x02fc), propput]
        HRESULT name([in] BSTR pbstrName);

        [id(0x02f0), propget]
        HRESULT imageSourceWidth([out, retval] long *pWidth);

        [id(0x02f1), propget]
        HRESULT imageSourceHeight([out, retval] long *pHeight);

        [id(0x02f2), propget]
        HRESULT markerCount([out, retval] long *pMarkerCount);

        [id(0x02f3)]
        HRESULT getMarkerTime(
            [in] long MarkerNum,
            [out, retval] double *pMarkerTime);

        [id(0x02f4)]
        HRESULT getMarkerName(
            [in] long MarkerNum,
            [out, retval] BSTR *pbstrMarkerName);

        [id(0x02f5), propget]
        HRESULT duration([out, retval] double *pDuration);

        [id(0x02f6), propget]
        HRESULT durationString([out, retval] BSTR *pbstrDuration);

        [id(0x02f7), propget]
        HRESULT attributeCount([out, retval] long *plCount);

        [id(0x02f8)]
        HRESULT getAttributeName(
            [in] long lIndex,
            [out, retval] BSTR *pbstrItemName);

        [id(0x02f9)]
        HRESULT getItemInfo(
            [in] BSTR bstrItemName,
            [out, retval] BSTR *pbstrVal);

        [id(0x02fa)]
        HRESULT setItemInfo(
            [in] BSTR bstrItemName,
            [in] BSTR bstrVal);

        [id(0x02fd)]
        HRESULT getItemInfoByAtom(
            [in] long lAtom,
            [out, retval] BSTR *pbstrVal);

        [id(0x02fe)]
        HRESULT isMemberOf(
            [in] IWMPPlaylist *pPlaylist,
            [out, retval] VARIANT_BOOL *pvarfIsMemberOf);

        [id(0x02ff)]
        HRESULT isReadOnlyItem(
            [in] BSTR bstrItemName,
            [out, retval] VARIANT_BOOL *pvarfIsReadOnly);
    }

    [
        odl,
        uuid(74c09E02-f828-11d2-a74b-00a0c905f36e),
        dual,
        oleautomation
    ]
    interface IWMPControls : IDispatch {
        [id(0x003e), propget]
        HRESULT isAvailable(
            [in] BSTR bstrItem,
            [out, retval] VARIANT_BOOL *pIsAvailable);

        [id(0x0033)]
        HRESULT play();

        [id(0x0034)]
        HRESULT stop();

        [id(0x0035)]
        HRESULT pause();

        [id(0x0036)]
        HRESULT fastForward();

        [id(0x0037)]
        HRESULT fastReverse();

        [id(0x0038), propget]
        HRESULT currentPosition([out, retval] double *pdCurrentPosition);
        [id(0x0038), propput]
        HRESULT currentPosition([in] double pdCurrentPosition);

        [id(0x0039), propget]
        HRESULT currentPositionString([out, retval] BSTR *pbstrCurrentPosition);

        [id(0x003a)]
        HRESULT next();

        [id(0x003b)]
        HRESULT previous();

        [id(0x003c)]
        HRESULT currentItem([out, retval] IWMPMedia **ppIWMPMedia);

        [id(0x003c), propput]
        HRESULT currentItem([in] IWMPMedia *ppIWMPMedia);

        [id(0x003d), propget]
        HRESULT currentMarker([out, retval] long *plMarker);

        [id(0x003d), propput]
        HRESULT currentMarker([in] long plMarker);

        [id(0x003f)]
        HRESULT playItem([in] IWMPMedia *pIWMPMedia);
    }

    [
        odl,
        uuid(6f030d25-0890-480f-9775-1f7e40ab5b8e),
        dual,
        oleautomation
    ]
    interface IWMPControls2 : IWMPControls
    {
        [id(0x0040)]
        HRESULT step([in] long lStep);
    }

    [
        odl,
        uuid(cbb92747-741f-44fe-ab5b-f1a48f3b2a59),
        oleautomation
    ]
    interface IWMPRemoteMediaServices : IUnknown
    {
        HRESULT GetServiceType([out, retval] BSTR *type);

        HRESULT GetApplicationName([out, retval] BSTR *name);

        HRESULT GetScriptableObject([out, retval] BSTR *name, [out, retval] IDispatch **out);

        HRESULT GetCustomUIMode([out, retval] BSTR *file);
    }

    [
        odl,
        uuid(9104d1ab-80c9-4fed-abf0-2e6417a6df14),
        dual,
        oleautomation
    ]
    interface IWMPSettings : IDispatch
    {
        [id(0x0071), propget]
        HRESULT isAvailable(
            [in] BSTR bstrItem,
            [out, retval] VARIANT_BOOL *pIsAvailable);

        [id(0x0065), propget]
        HRESULT autoStart([out, retval] VARIANT_BOOL *pfAutoStart);
        [id(0x0065), propput]
        HRESULT autoStart([in] VARIANT_BOOL pfAutoStart);

        [id(0x006c), propget]
        HRESULT baseURL([out, retval] BSTR *pbstrBaseURL);
        [id(0x006c), propput]
        HRESULT baseURL([in] BSTR pbstrBaseURL);

        [id(0x006d), propget]
        HRESULT defaultFrame([out, retval] BSTR *pbstrDefaultFrame);
        [id(0x006d), propput]
        HRESULT defaultFrame([in] BSTR pbstrDefaultFrame);

        [id(0x0067), propget]
        HRESULT invokeURLs([out, retval] VARIANT_BOOL *pfInvokeURLs);
        [id(0x0067), propput]
        HRESULT invokeURLs([in] VARIANT_BOOL pfInvokeURLs);

        [id(0x0068), propget]
        HRESULT mute([out, retval] VARIANT_BOOL *pfMute);
        [id(0x0068), propput]
        HRESULT mute([in] VARIANT_BOOL pfMute);

        [id(0x0069), propget]
        HRESULT playCount([out, retval] long *plCount);
        [id(0x0069), propput]
        HRESULT playCount([in] long plCount);

        [id(0x006a), propget]
        HRESULT rate([out, retval] double *pdRate);
        [id(0x006a), propput]
        HRESULT rate([in] double pdRate);

        [id(0x0066), propget]
        HRESULT balance([out, retval] long *plBalance);
        [id(0x0066), propput]
        HRESULT balance([in] long plBalance);

        [id(0x006b), propget]
        HRESULT volume([out, retval] long *plVolume);
        [id(0x006b), propput]
        HRESULT volume([in] long plVolume);

        [id(0x006e)]
        HRESULT getMode(
            [in] BSTR bstrMode,
            [out, retval] VARIANT_BOOL *pvarfMode);

        [id(0x006f)]
        HRESULT setMode(
            [in] BSTR bstrMode,
            [in] VARIANT_BOOL varfMode);

        [id(0x0070), propget]
        HRESULT enableErrorDialogs([out, retval] VARIANT_BOOL *pfEnableErrorDialogs);

        [id(0x0070), propput]
        HRESULT enableErrorDialogs([in] VARIANT_BOOL pfEnableErrorDialogs);
    }

    [
        odl,
        uuid(4a976298-8c0d-11d3-b389-00c04f68574b),
        dual,
        oleautomation
    ]
    interface IWMPStringCollection : IDispatch
    {
        [id(0x0191), propget]
        HRESULT count([out, retval] long *plCount);

        [id(0x0192)]
        HRESULT Item(
            [in] long lIndex,
            [out, retval] BSTR *pbstrString);
    }

    [
        odl,
        uuid(8363bc22-b4b4-4b19-989d-1cd765749dd1),
        dual,
        oleautomation
    ]
    interface IWMPMediaCollection : IDispatch
    {
        [id(0x01c4)]
        HRESULT add(
            [in] BSTR bstrURL,
            [out, retval] IWMPMedia **ppItem);

        [id(0x01c5)]
        HRESULT getAll([out, retval] IWMPPlaylist **ppMediaItems);

        [id(0x01c6)]
        HRESULT getByName(
            [in] BSTR bstrName,
            [out, retval] IWMPPlaylist **ppMediaItems);

        [id(0x01c7)]
        HRESULT getByGenre(
            [in] BSTR bstrGenre,
            [out, retval] IWMPPlaylist **ppMediaItems);

        [id(0x01c8)]
        HRESULT getByAuthor(
            [in] BSTR bstrAuthor,
            [out, retval] IWMPPlaylist **ppMediaItems);

        [id(0x01c9)]
        HRESULT getByAlbum(
            [in] BSTR bstrAlbum,
            [out, retval] IWMPPlaylist **ppMediaItems);

        [id(0x01ca)]
        HRESULT getByAttribute(
            [in] BSTR bstrAttribute,
            [in] BSTR bstrValue,
            [out, retval] IWMPPlaylist **ppMediaItems);

        [id(0x01cb)]
        HRESULT remove(
            [in] IWMPMedia *pItem,
            [in] VARIANT_BOOL varfDeleteFile);

        [id(0x01cd)]
        HRESULT getAttributeStringCollection(
            [in] BSTR bstrAttribute,
            [in] BSTR bstrMediaType,
            [out, retval] IWMPStringCollection **ppStringCollection);

        [id(0x01d6)]
        HRESULT getMediaAtom(
            [in] BSTR bstrItemName,
            [out, retval] long *plAtom);

        [id(0x01d7)]
        HRESULT setDeleted(
            [in] IWMPMedia *pItem,
            [in] VARIANT_BOOL varfIsDeleted);

        [id(0x01d8)]
        HRESULT isDeleted(
            [in] IWMPMedia *pItem,
            [out, retval] VARIANT_BOOL *pvarfIsDeleted);
    }

    [
        odl,
        uuid(679409c0-99f7-11d3-9fb7-00105aa620bb),
        dual,
        oleautomation
    ]
    interface IWMPPlaylistArray : IDispatch
    {
        [id(0x01f5), propget]
        HRESULT count([out, retval] long *plCount);

        [id(0x01f6)]
        HRESULT Item(
            [in] long lIndex,
            [out, retval] IWMPPlaylist **ppItem);
    }

    [
        odl,
        uuid(10a13217-23a7-439b-b1c0-d847c79b7774),
        dual,
        oleautomation
    ]
    interface IWMPPlaylistCollection : IDispatch
    {
        [id(0x0228)]
        HRESULT newPlaylist(
            [in] BSTR bstrName,
            [out, retval] IWMPPlaylist **ppItem);

        [id(0x0229)]
        HRESULT getAll([out, retval] IWMPPlaylistArray **ppPlaylistArray);

        [id(0x022a)]
        HRESULT getByName(
            [in] BSTR bstrName,
            [out, retval] IWMPPlaylistArray **ppPlaylistArray);

        [id(0x022c)]
        HRESULT remove([in] IWMPPlaylist *pItem);

        [id(0x0230)]
        HRESULT setDeleted(
            [in] IWMPPlaylist *pItem,
            [in] VARIANT_BOOL varfIsDeleted);

        [id(0x0231)]
        HRESULT isDeleted(
            [in] IWMPPlaylist *pItem,
            [out, retval] VARIANT_BOOL *pvarfIsDeleted);

        [id(0x0232)]
        HRESULT importPlaylist(
            [in] IWMPPlaylist *pItem,
            [out, retval] IWMPPlaylist **ppImportedItem);
    }

    [
        odl,
        uuid(ec21b779-edef-462d-bba4-ad9dde2b29a7),
        dual,
        oleautomation
    ]
    interface IWMPNetwork : IDispatch
    {
        [id(0x0321), propget]
        HRESULT bandWidth([out, retval] long *plBandwidth);

        [id(0x0322), propget]
        HRESULT recoveredPackets([out, retval] long *plRecoveredPackets);

        [id(0x0323), propget]
        HRESULT sourceProtocol([out, retval] BSTR *pbstrSourceProtocol);

        [id(0x0324), propget]
        HRESULT receivedPackets([out, retval] long *plReceivedPackets);

        [id(0x0325), propget]
        HRESULT lostPackets([out, retval] long *plLostPackets);

        [id(0x0326), propget]
        HRESULT receptionQuality([out, retval] long *plReceptionQuality);

        [id(0x0327), propget]
        HRESULT bufferingCount([out, retval] long *plBufferingCount);

        [id(0x0328), propget]
        HRESULT bufferingProgress([out, retval] long *plBufferingProgress);

        [id(0x0329), propget]
        HRESULT bufferingTime([out, retval] long *plBufferingTime);

        [id(0x0329), propput]
        HRESULT bufferingTime([in] long plBufferingTime);

        [id(0x032a), propget]
        HRESULT frameRate([out, retval] long *plFrameRate);

        [id(0x032b), propget]
        HRESULT maxBitRate([out, retval] long *plBitRate);

        [id(0x032c), propget]
        HRESULT bitRate([out, retval] long *plBitRate);

        [id(0x032d)]
        HRESULT getProxySettings(
            [in] BSTR bstrProtocol,
            [out, retval] long *plProxySetting);

        [id(0x032e)]
        HRESULT setProxySettings(
            [in] BSTR bstrProtocol,
            [in] long lProxySetting);

        [id(0x032f)]
        HRESULT getProxyName(
            [in] BSTR bstrProtocol,
            [out, retval] BSTR *pbstrProxyName);

        [id(0x0330)]
        HRESULT setProxyName(
            [in] BSTR bstrProtocol,
            [in] BSTR bstrProxyName);

        [id(0x0331)]
        HRESULT getProxyPort(
            [in] BSTR bstrProtocol,
            [out, retval] long *lProxyPort);

        [id(0x0332)]
        HRESULT setProxyPort(
            [in] BSTR bstrProtocol,
            [in] long lProxyPort);

        [id(0x0333)]
        HRESULT getProxyExceptionList(
            [in] BSTR bstrProtocol,
            [out, retval] BSTR *pbstrExceptionList);

        [id(0x0334)]
        HRESULT setProxyExceptionList(
            [in] BSTR bstrProtocol,
            [in] BSTR pbstrExceptionList);

        [id(0x0335)]
        HRESULT getProxyBypassForLocal(
            [in] BSTR bstrProtocol,
            [out, retval] VARIANT_BOOL *pfBypassForLocal);

        [id(0x0336)]
        HRESULT setProxyBypassForLocal(
            [in] BSTR bstrProtocol,
            [in] VARIANT_BOOL fBypassForLocal);

        [id(0x0337), propget]
        HRESULT maxBandwidth([out, retval] long *lMaxBandwidth);
        [id(0x0337), propput]
        HRESULT maxBandwidth([in] long lMaxBandwidth);

        [id(0x0338), propget]
        HRESULT downloadProgress([out, retval] long *plDownloadProgress);

        [id(0x0339), propget]
        HRESULT encodedFrameRate([out, retval] long *plFrameRate);

        [id(0x033a), propget]
        HRESULT framesSkipped([out, retval] long *plFrames);
    }

    [
        odl,
        uuid(cfab6e98-8730-11d3-b388-00c04f68574b),
        dual,
        oleautomation
    ]
    interface IWMPCdrom : IDispatch
    {
        [id(0x00fb), propget]
        HRESULT driveSpecifier([out, retval] BSTR *pbstrDrive);

        [id(0x00fc), propget]
        HRESULT Playlist([out, retval] IWMPPlaylist **ppPlaylist);

        [id(0x00fd)]
        HRESULT eject();
    }

    [
        odl,
        uuid(ee4c8fe2-34b2-11d3-a3bf-006097c9b344),
        dual,
        oleautomation
    ]
    interface IWMPCdromCollection : IDispatch
    {
        [id(0x012d), propget]
        HRESULT count([out, retval] long *plCount);

        [id(0x012e)]
        HRESULT Item(
            [in] long lIndex,
            [out, retval] IWMPCdrom **ppItem);

        [id(0x012f)]
        HRESULT getByDriveSpecifier(
            [in] BSTR bstrDriveSpecifier,
            [out, retval] IWMPCdrom **ppCdrom);
    }

    [
        odl,
        uuid(8da61686-4668-4a5c-ae5d-803193293dbe),
        dual,
        oleautomation
    ]
    interface IWMPDVD : IDispatch
    {
        [id(0x03e9), propget]
        HRESULT isAvailable(
            [in] BSTR bstrItem,
            [out, retval] VARIANT_BOOL *pIsAvailable);

        [id(0x03ea), propget]
        HRESULT domain([out, retval] BSTR *strDomain);

        [id(0x03eb)]
        HRESULT topMenu();

        [id(0x03ec)]
        HRESULT titleMenu();

        [id(0x03ed)]
        HRESULT back();

        [id(0x03ee)]
        HRESULT resume();
    }

    [
        odl,
        uuid(4f2df574-c588-11d3-9ed0-00c04fb6e937),
        dual,
        oleautomation
    ]
    interface IWMPClosedCaption : IDispatch
    {
        [id(0x03b7), propget]
        HRESULT SAMIStyle([out, retval] BSTR *pbstrSAMIStyle);
        [id(0x03b7), propput]
        HRESULT SAMIStyle([in] BSTR pbstrSAMIStyle);

        [id(0x03b8), propget]
        HRESULT SAMILang([out, retval] BSTR *pbstrSAMILang);

        [id(0x03b8), propput]
        HRESULT SAMILang([in] BSTR pbstrSAMILang);

        [id(0x03b9), propget]
        HRESULT SAMIFileName([out, retval] BSTR *pbstrSAMIFileName);

        [id(0x03b9), propput]
        HRESULT SAMIFileName([in] BSTR pbstrSAMIFileName);

        [id(0x03ba), propget]
        HRESULT captioningId([out, retval] BSTR *pbstrCaptioningID);

        [id(0x03ba), propput]
        HRESULT captioningId([in] BSTR pbstrCaptioningID);
    }

    [
        odl,
        uuid(3614c646-3b3b-4de7-a81e-930e3f2127b3),
        dual,
        oleautomation
    ]
    interface IWMPErrorItem : IDispatch
    {
        [id(0x0385), propget]
        HRESULT errorCode([out, retval] long *phr);

        [id(0x0386), propget]
        HRESULT errorDescription([out, retval] BSTR *pbstrDescription);

        [id(0x0387), propget]
        HRESULT errorContext([out, retval] VARIANT *pvarContext);

        [id(0x0388), propget]
        HRESULT remedy([out, retval] long *plRemedy);

        [id(0x0389), propget]
        HRESULT customUrl([out, retval] BSTR *pbstrCustomUrl);
    }

    [
        odl,
        uuid(ab7c88bb-143e-4ea4-acc3-e4350b2106c3),
        dual,
        oleautomation
    ]
    interface IWMPMedia2 : IWMPMedia
    {
        [id(0x0300), propget]
        HRESULT error([out, retval] IWMPErrorItem **out);
    }

    [
        odl,
        uuid(f118efc7-f03a-4fb4-99c9-1c02a5c1065b),
        dual,
        oleautomation
    ]
    interface IWMPMedia3 : IWMPMedia2
    {
        [id(0x0301)]
        HRESULT getAttributeCountByType([in] BSTR type, [in] BSTR language, [out, retval] long *out);

        [id(0x0302)]
        HRESULT getItemInfoByType([in] BSTR type, [in] BSTR language, [in] long index, [out, retval] VARIANT *out);
    }

    [
        odl,
        uuid(a12dcf7d-14ab-4c1b-a8cd-63909f06025b),
        dual,
        oleautomation
    ]
    interface IWMPError : IDispatch
    {
        [id(0x0353)]
        HRESULT clearErrorQueue();

        [id(0x0354), propget]
        HRESULT errorCount([out, retval] long *plNumErrors);

        [id(0x0355), propget]
        HRESULT Item(
            [in] long dwIndex,
            [out, retval] IWMPErrorItem **ppErrorItem);

        [id(0x0356)]
        HRESULT webHelp();
    }

    [
        odl,
        uuid(40897764-ceab-47be-ad4a-8e28537f9bbf),
        dual,
        oleautomation
    ]
    interface IWMPPlayerApplication : IDispatch
    {
        [id(0x044d)]
        HRESULT switchToPlayerApplication();

        [id(0x044e)]
        HRESULT switchToControl();

        [id(0x044f), propget]
        HRESULT playerDocked([out, retval] VARIANT_BOOL* pbPlayerDocked);

        [id(0x0450), propget]
        HRESULT hasDisplay([out, retval] VARIANT_BOOL *pbHasDisplay);
    }

    [
        odl,
        uuid(d84cca99-cce2-11d2-9ecc-0000f8085981),
        dual,
        oleautomation
    ]
    interface IWMPCore : IDispatch
    {
        [id(0x0003)]
        HRESULT close();

        [id(0x0001), propget]
        HRESULT URL([out, retval] BSTR *pbstrURL);
        [id(0x0001), propput]
        HRESULT URL([in] BSTR pbstrURL);

        [id(0x0002), propget]
        HRESULT openState([out, retval] WMPOpenState *pwmpos);

        [id(0x000a), propget]
        HRESULT playState([out, retval] WMPPlayState *pwmpps);

        [id(0x0004), propget]
        HRESULT controls([out, retval] IWMPControls **ppControl);

        [id(0x0005), propget]
        HRESULT settings([out, retval] IWMPSettings **ppSettings);

        [id(0x0006), propget]
        HRESULT currentMedia([out, retval] IWMPMedia **ppMedia);
        [id(0x0006), propput]
        HRESULT currentMedia([in] IWMPMedia *ppMedia);

        [id(0x0008), propget]
        HRESULT mediaCollection([out, retval] IWMPMediaCollection **ppMediaCollection);

        [id(0x0009), propget]
        HRESULT playlistCollection([out, retval] IWMPPlaylistCollection **ppPlaylistCollection);

        [id(0x000b), propget]
        HRESULT versionInfo([out, retval] BSTR *pbstrVersionInfo);

        [id(0x000c)]
        HRESULT launchURL([in] BSTR bstrURL);

        [id(0x0007), propget]
        HRESULT network([out, retval] IWMPNetwork **ppQNI);

        [id(0x000d), propget]
        HRESULT currentPlaylist([out, retval] IWMPPlaylist **ppPL);
        [id(0x000d), propput]
        HRESULT currentPlaylist([in] IWMPPlaylist *ppPL);

        [id(0x000e), propget]
        HRESULT cdromCollection([out, retval] IWMPCdromCollection **ppCdromCollection);

        [id(0x000f), propget]
        HRESULT closedCaption([out, retval] IWMPClosedCaption **ppClosedCaption);

        [id(0x0010), propget]
        HRESULT isOnline([out, retval] VARIANT_BOOL *pfOnline);

        [id(0x0011), propget]
        HRESULT Error([out, retval] IWMPError **ppError);

        [id(0x0012), propget]
        HRESULT status([out, retval] BSTR *pbstrStatus);
    }

    [
        odl,
        uuid(bc17e5B7-7561-4c18-bb90-17d485775659),
        dual,
        oleautomation
    ]
    interface IWMPCore2 : IWMPCore {
        [id(0x0028), propget]
        HRESULT dvd([out, retval] IWMPDVD **ppDVD);
    }

    [
        odl,
        uuid(7587c667-628f-499f-88e7-6A6f4e888464),
        dual,
        oleautomation
    ]
    interface IWMPCore3 : IWMPCore2
    {
        [id(0x0029)]
        HRESULT newPlaylist(
            [in] BSTR bstrName,
            [in] BSTR bstrURL,
            [out, retval] IWMPPlaylist **ppPlaylist);

        [id(0x002a)]
        HRESULT newMedia(
            [in] BSTR bstrURL,
            [out, retval] IWMPMedia **ppMedia);
    }

    [
        odl,
        uuid(6c497d62-8919-413c-82db-e935fb3ec584),
        dual,
        oleautomation
    ]
    interface IWMPPlayer4 : IWMPCore3
    {
        [id(0x0013), propget]
        HRESULT enabled([out, retval] VARIANT_BOOL *pbEnabled);
        [id(0x0013), propput]
        HRESULT enabled([in] VARIANT_BOOL pbEnabled);

        [id(0x0015), propget]
        HRESULT fullScreen([out, retval] VARIANT_BOOL *pbFullScreen);
        [id(0x0015), propput]
        HRESULT fullScreen(VARIANT_BOOL pbFullScreen);

        [id(0x0016), propget]
        HRESULT enableContextMenu([out, retval] VARIANT_BOOL *pbEnableContextMenu);
        [id(0x0016), propput]
        HRESULT enableContextMenu(VARIANT_BOOL pbEnableContextMenu);

        [id(0x0017), propput]
        HRESULT uiMode([in] BSTR pbstrMode);
        [id(0x0017), propget]
        HRESULT uiMode([out, retval] BSTR *pbstrMode);

        [id(0x0018), propget]
        HRESULT stretchToFit([out, retval] VARIANT_BOOL *pbEnabled);
        [id(0x0018), propput]
        HRESULT stretchToFit([in] VARIANT_BOOL pbEnabled);

        [id(0x0019), propget]
        HRESULT windowlessVideo([out, retval] VARIANT_BOOL *pbEnabled);
        [id(0x0019), propput]
        HRESULT windowlessVideo([in] VARIANT_BOOL pbEnabled);

        [id(0x001a), propget]
        HRESULT isRemote([out, retval] VARIANT_BOOL *pvarfIsRemote);

        [id(0x001b), propget]
        HRESULT playerApplication([out, retval] IWMPPlayerApplication **ppIWMPPlayerApplication);

        [id(0x001c)]
        HRESULT openPlayer([in] BSTR bstrURL);
    }

    [
      odl,
      uuid(6BF52A4F-394A-11D3-B153-00C04F79FAA6),
      dual,
      oleautomation
    ]
    interface IWMPPlayer : IWMPCore {
        [id(0x00000013), propget]
        HRESULT enabled([out, retval] VARIANT_BOOL* pbEnabled);
        [id(0x00000013), propput]
        HRESULT enabled([in] VARIANT_BOOL pbEnabled);
        [id(0x00000015), propget]
        HRESULT fullScreen([out, retval] VARIANT_BOOL* pbFullScreen);
        [id(0x00000015), propput]
        HRESULT fullScreen(VARIANT_BOOL pbFullScreen);
        [id(0x00000016), propget]
        HRESULT enableContextMenu([out, retval] VARIANT_BOOL* pbEnableContextMenu);
        [id(0x00000016), propput]
        HRESULT enableContextMenu(VARIANT_BOOL pbEnableContextMenu);
        [id(0x00000017), propput]
        HRESULT uiMode([in] BSTR pbstrMode);
        [id(0x00000017), propget]
        HRESULT uiMode([out, retval] BSTR* pbstrMode);
    };

    [
        odl,
        uuid(82a2986c-0293-4fd0-b279-b21b86c058be),
        oleautomation
    ]
    interface IWMPSyncDevice : IUnknown
    {
        [propget]
        HRESULT friendlyName([out, retval] BSTR *name);

        [propput]
        HRESULT friendlyName([in] BSTR name);

        [propget]
        HRESULT deviceName([out, retval] BSTR *name);

        [propget]
        HRESULT deviceId([out, retval] BSTR *device);

        [propget]
        HRESULT partnershipIndex([out, retval] long *index);

        [propget]
        HRESULT connected([out, retval] VARIANT_BOOL *connected);

        [propget]
        HRESULT status([out, retval] WMPDeviceStatus *status);

        [propget]
        HRESULT syncState([out, retval] WMPSyncState *state);

        [propget]
        HRESULT progress([out, retval] long *progress);

        HRESULT getItemInfo(
            [in] BSTR name,
            [out, retval] BSTR *val);

        HRESULT createPartnership([in] VARIANT_BOOL showui);

        HRESULT deletePartnership();

        HRESULT start();

        HRESULT stop();

        HRESULT showSettings();

        HRESULT isIdentical(
            [in] IWMPSyncDevice *device,
            [out, retval] VARIANT_BOOL *ret);
    }

    [
        odl,
        uuid(88afb4b2-140a-44d2-91e6-4543da467cd1),
        oleautomation
    ]
    interface IWMPSyncDevice2 : IWMPSyncDevice
    {
        HRESULT setItemInfo(
            [in] BSTR name,
            [in] BSTR val);
    }

    [
      odl,
      uuid(56e2294f-69ed-4629-a869-aea72c0dcc2c),
      oleautomation
    ]
    interface IWMPCdromRip : IUnknown
    {
        [propget]
        HRESULT ripState([out, retval] WMPRipState *state);

        [propget]
        HRESULT ripProgress([out, retval] long *progress);

        HRESULT startRip();

        HRESULT stopRip();
    }

    [
        odl,
        uuid(bd94dbeb-417f-4928-aa06-087d56ed9b59),
        oleautomation
    ]
    interface IWMPCdromBurn : IUnknown
    {
        HRESULT isAvailable(
            [in] BSTR item,
            [out, retval] VARIANT_BOOL *available);

        HRESULT getItemInfo(
            [in] BSTR item,
            [out, retval] BSTR *val);

        [propget]
        HRESULT label([out, retval] BSTR *label);

        [propput]
        HRESULT label([in] BSTR label);

        [propget]
        HRESULT burnFormat([out, retval] WMPBurnFormat *format);

        [propput]
        HRESULT burnFormat([in] WMPBurnFormat format);

        [propget]
        HRESULT burnPlaylist([out, retval] IWMPPlaylist **playlist);

        [propput]
        HRESULT burnPlaylist([in] IWMPPlaylist *playlist);

        HRESULT refreshStatus();

        [propget]
        HRESULT burnState([out, retval] WMPBurnState *state);

        [propget]
        HRESULT burnProgress([out, retval] long *progress);

        HRESULT startBurn();

        HRESULT stopBurn();

        HRESULT erase();
    }

    [
        odl,
        uuid(3df47861-7df1-4c1f-a81b-4c26f0f7a7c6),
        oleautomation
    ]
    interface IWMPLibrary : IUnknown
    {
        [propget]
        HRESULT name([out, retval] BSTR *name);

        [propget]
        HRESULT type([out, retval] WMPLibraryType *type);

        [propget]
        HRESULT mediaCollection([out, retval] IWMPMediaCollection **collection);

        HRESULT isIdentical(
            [in] IWMPLibrary *wmplibrary,
            [out, retval] VARIANT_BOOL *ret);
    }

    [
        uuid(19a6627b-da9e-47c1-bb23-00b5e668236a),
        odl
    ]
    interface IWMPEvents : IUnknown
    {
        void OpenStateChange([in] long state);

        void PlayStateChange([in] long state);

        void AudioLanguageChange([in] long lang);

        void StatusChange();

        void ScriptCommand(
            [in] BSTR type,
            [in] BSTR param);

        void NewStream();

        void Disconnect([in] long result);

        void Buffering([in] VARIANT_BOOL start);

        void Error();

        void Warning(
            [in] long warning,
            [in] long param,
            [in] BSTR description);

        void EndOfStream([in] long result);

        void PositionChange(
            [in] double old_position,
            [in] double new_position);

        void MarkerHit([in] long marker);

        void DurationUnitChange([in] long duration);

        void CdromMediaChange([in] long num);

        void PlaylistChange(
            [in] IDispatch *playlist,
            [in] WMPPlaylistChangeEventType change);

        void CurrentPlaylistChange([in] WMPPlaylistChangeEventType change);

        void CurrentPlaylistItemAvailable([in] BSTR item);

        void MediaChange([in] IDispatch *item);

        void CurrentMediaItemAvailable([in] BSTR name);

        void CurrentItemChange([in] IDispatch *media);

        void MediaCollectionChange();

        void MediaCollectionAttributeStringAdded(
            [in] BSTR name,
            [in] BSTR val);

        void MediaCollectionAttributeStringRemoved(
            [in] BSTR name,
            [in] BSTR val);

        void MediaCollectionAttributeStringChanged(
            [in] BSTR name,
            [in] BSTR old_val,
            [in] BSTR new_val);

        void PlaylistCollectionChange();

        void PlaylistCollectionPlaylistAdded([in] BSTR name);

        void PlaylistCollectionPlaylistRemoved([in] BSTR name);

        void PlaylistCollectionPlaylistSetAsDeleted(
            [in] BSTR name,
            [in] VARIANT_BOOL deleted);

        void ModeChange(
            [in] BSTR ModeName,
            [in] VARIANT_BOOL value);

        void MediaError([in] IDispatch *media);

        void OpenPlaylistSwitch([in] IDispatch *item);

        void DomainChange([in] BSTR domain);

        void SwitchedToPlayerApplication();

        void SwitchedToControl();

        void PlayerDockedStateChange();

        void PlayerReconnect();

        void Click(
            [in] short button,
            [in] short shift_state,
            [in] long x,
            [in] long y);

        void DoubleClick(
            [in] short button,
            [in] short shift_state,
            [in] long fX,
            [in] long fY);

        void KeyDown(
            [in] short keycode,
            [in] short shift_state);

        void KeyPress([in] short ascii);

        void KeyUp(
            [in] short keycode,
            [in] short shift_state);

        void MouseDown(
            [in] short button,
            [in] short nShiftState,
            [in] long x,
            [in] long y);

        void MouseMove(
            [in] short button,
            [in] short shift_state,
            [in] long x,
            [in] long y);

        void MouseUp(
            [in] short button,
            [in] short shift_state,
            [in] long x,
            [in] long y);
    }

    [
        uuid(1e7601fa-47ea-4107-9ea9-9004ed9684ff),
        odl
    ]
    interface IWMPEvents2 : IWMPEvents
    {
        void DeviceConnect([in] IWMPSyncDevice *device);

        void DeviceDisconnect([in] IWMPSyncDevice *device);

        void DeviceStatusChange(
            [in] IWMPSyncDevice *device,
            [in] WMPDeviceStatus status);

        void DeviceSyncStateChange(
            [in] IWMPSyncDevice *device,
            [in] WMPSyncState state);

        void DeviceSyncError(
            [in] IWMPSyncDevice *device,
            [in] IDispatch *media);

        void CreatePartnershipComplete(
            [in] IWMPSyncDevice *device,
            [in] HRESULT result);
    }

    [
        uuid(1f504270-a66b-4223-8e96-26a06c63d69f),
        odl
    ]
    interface IWMPEvents3 : IWMPEvents2
    {
        void CdromRipStateChange(
            [in] IWMPCdromRip *rip,
            [in] WMPRipState state);

        void CdromRipMediaError(
            [in] IWMPCdromRip *rip,
            [in] IDispatch *media);

        void CdromBurnStateChange(
            [in] IWMPCdromBurn *burn,
            [in] WMPBurnState state);

        void CdromBurnMediaError(
            [in] IWMPCdromBurn *burn,
            [in] IDispatch *media);

        void CdromBurnError(
            [in] IWMPCdromBurn *burn,
            [in] HRESULT error);

        void LibraryConnect(
            [in] IWMPLibrary *wmplibrary);

        void LibraryDisconnect(
            [in] IWMPLibrary *wmplibrary);

        void FolderScanStateChange(
            [in] WMPFolderScanState state);

        void StringCollectionChange(
            [in] IDispatch *collection,
            [in] WMPStringCollectionChangeEventType change,
            [in] long index);

        void MediaCollectionMediaAdded(
            [in] IDispatch *media);

        void MediaCollectionMediaRemoved(
            [in] IDispatch *media);
    }

    [
        uuid(26dabcfa-306b-404d-9a6f-630a8405048d),
        odl
    ]
    interface IWMPEvents4 : IWMPEvents3
    {
        void DeviceEstimation(
            [in] IWMPSyncDevice *device,
            [in] HRESULT result,
            [in] LONGLONG used_space,
            [in] LONGLONG estimated_space);
    }

    [
        hidden,
        uuid(6bf52a51-394a-11d3-b153-00c04f79faa6)
    ]
    interface _WMPOCXEvents : IDispatch
    {}

    [
        helpstring("Windows Media Player"),
        threading(apartment),
        progid("WMPlayer.OCX.7"),
        vi_progid("WMPlayer.OCX"),
        uuid(6bf52a52-394a-11d3-b153-00c04f79faa6)
     ]
     coclass WindowsMediaPlayer
     {
        [default] interface IWMPPlayer4;
        /* interface IWMPPlayer3; */
        /* interface IWMPPlayer2; */
        interface IWMPPlayer;
        interface IWMPControls;
        interface IWMPSettings;
        interface IWMPPlaylist;
        interface IWMPMedia;
        interface IWMPMediaCollection;
        interface IWMPPlaylistCollection;
        interface IWMPCdromCollection;
        interface IWMPError;
        interface IWMPErrorItem;
        /* interface IWMPErrorItem2; */
        interface IWMPClosedCaption;
        interface IWMPDVD;
        interface IWMPControls2;
        interface IWMPMedia2;
        interface IWMPMedia3;
        /* interface IWMPMetadataPicture; */
        /* interface IWMPMetadataText; */
        /* interface IWMPSettings2; */
        /* interface IWMPControls3; */
        /* interface IWMPClosedCaption2; */
        /* interface IWMPMediaCollection2; */
        /* interface IWMPStringCollection2; */
        [default, source] dispinterface _WMPOCXEvents;
     }
}
