//==========================================================================;
//
//  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
//  KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
//  IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
//  PURPOSE.
//
//  Copyright (c) 1992 - 2002  Microsoft Corporation.  All Rights Reserved.
//
//--------------------------------------------------------------------------;

// Neutral/English language type library for basic Quartz control interfaces

// the quartz type library defines the basic control interfaces
[
    uuid(56a868b0-0ad4-11ce-b03a-0020af0ba770),
    helpstring("ActiveMovie control type library"),
    lcid(0x0000),
    version(1.0)
]
library QuartzTypeLib
{
    importlib("STDOLE2.TLB");

    // types are restricted to be automation-compatible
    typedef double REFTIME;             // ReferenceTime
    typedef LONG_PTR OAEVENT;         // should be a HANDLE
    typedef LONG_PTR OAHWND;          // should be an hwnd

    // from strmif.idl
    typedef long OAFilterState;

    // collection interface - represents a collection of IUnknowns
    // this is used below to collect filter-info objects, registry-filters
    // pin-info objects and wrapped media type objects
    [
        uuid(56a868b9-0ad4-11ce-b03a-0020af0ba770),
        helpstring("Collection"),
        odl,
        oleautomation,
        dual
    ]
    interface IAMCollection : IDispatch
    {
        // number of items in collection
        [propget]
        HRESULT Count(
                    [out, retval] LONG* plCount);

        // return IUnknown for contained item by index
        HRESULT Item(
                    [in]  long lItem,
                    [out] IUnknown** ppUnk);

        // return IUnknown for an object that implements IEnumVARIANT on
        // this collection
        [propget]
        HRESULT _NewEnum(
                    [out, retval] IUnknown** ppUnk);
    }


    // core control providing state control
    [
        uuid(56a868b1-0ad4-11ce-b03a-0020af0ba770),
        helpstring("IMediaControl interface"),
        odl,
        oleautomation,
        dual
    ]
    interface IMediaControl : IDispatch
    {
        // methods
        HRESULT Run();
        HRESULT Pause();
        HRESULT Stop();

        //returns the state. same semantics as IMediaFilter::GetState

        HRESULT GetState(
                    [in] LONG msTimeout,
                    [out] OAFilterState* pfs);

        // adds and connects filters needed to play the specified file
        // (same as IFilterGraph::RenderFile)
        HRESULT RenderFile(
                    [in] BSTR strFilename);

        // adds to the graph the source filter that can read this file,
        // and returns an IFilterInfo object for it (actually returns
        // an IDispatch for the IFilterInfo object).
        HRESULT AddSourceFilter(
                    [in] BSTR strFilename,
                    [out] IDispatch**ppUnk);

        // get a collection of IFilterInfo objects representing the
        // filters in the graph (returns IDispatch for an object
        // that supports IAMCollection
        [propget]
        HRESULT FilterCollection(
                        [out, retval] IDispatch** ppUnk);

        // get a collection of IRegFilter objects representing the
        // filters available in the registry
        [propget]
        HRESULT RegFilterCollection(
                        [out, retval] IDispatch** ppUnk);

        HRESULT StopWhenReady();
    }


    // provides an event notification scheme passing events
    // asynchronously to applications. See also IMediaEventSink in
    // strmif.idl and sdk\h\evcodes.h.
    //
    // this interface behaves as if events are held on a queue. A call to
    // IMediaEventSink::Notify will place an event on this queue. Calling
    // GetEvent removes the first item off the queue and returns it. Items are
    // returned in the order they were queued (there is no priority scheme).
    // The event handle is in a signalled state iff the queue is non-empty.
    //
    // Apps that issue multiple Run calls without always picking up the
    // completion events are advised to call GetEvent or WaitForCompletion
    // (with a 0 timeout) repeatedly to remove all events from the queue
    // when in stopped or paused state before each Run method.
    //
    // Parameters to events are actually LONG, IUnknown* or BSTR. You need to
    // look at evcode.h for details of parameters to a specific event code.
    // In order to correctly free resources, always call FreeEventParams
    // after receiving an event.
    //

    [
        uuid(56a868b6-0ad4-11ce-b03a-0020af0ba770),
        helpstring("IMediaEvent interface"),
        odl,
        oleautomation,
        dual
    ]
    interface IMediaEvent : IDispatch
    {
        // get back the event handle. This is manual-reset
        // (don't - it's reset by the event mechanism) and remains set
        // when events are queued, and reset when the queue is empty.
        HRESULT GetEventHandle(
                        [out] OAEVENT * hEvent);

        // remove the next event notification from the head of the queue and
        // return it. Waits up to msTimeout millisecs if there are no events.
        // if a timeout occurs without any events, this method will return
        // E_ABORT, and the value of the event code and other parameters
        // is undefined.
        //
        // If this call returns successfully the caller MUST call
        // FreeEventParams(lEventCode, lParam1, lParam2) to release
        // resources held inside the event arguments
        //
        HRESULT GetEvent(
                        [out] long * lEventCode,
                        [out] LONG_PTR * lParam1,
                        [out] LONG_PTR * lParam2,
                        [in] long msTimeout
                        );

        // Calls GetEvent repeatedly discarding events until it finds a
        // completion event (EC_COMPLETE, EC_ERRORABORT, or EC_USERABORT).
        // The completion event is removed from the queue and returned
        // in pEvCode. Note that the object is still in running mode until
        // a Pause or Stop call is made.
        // If the timeout occurs, *pEvCode will be 0 and E_ABORT will be
        // returned.
        HRESULT WaitForCompletion(
                        [in] long msTimeout,
                        [out] long * pEvCode);

        // cancels any system handling of the specified event code
        // and ensures that the events are passed straight to the application
        // (via GetEvent) and not handled. A good example of this is
        // EC_REPAINT: default handling for this ensures the painting of the
        // window and does not get posted to the app.
        HRESULT CancelDefaultHandling(
                        [in] long lEvCode);

        // restore the normal system default handling that may have been
        // cancelled by CancelDefaultHandling().
        HRESULT RestoreDefaultHandling( [in] long lEvCode);

	// Free any resources associated with the parameters to an event.
        // Event parameters may be LONGs, IUnknown* or BSTR. No action
        // is taken with LONGs. IUnknown are passed addrefed and need a
        // Release call. BSTR are allocated by the task allocator and will be
        // freed by calling the task allocator.
        HRESULT FreeEventParams(
        		[in] long lEvCode,
                        [in] LONG_PTR lParam1,
                        [in] LONG_PTR lParam2
                        );
    }

    [
        uuid(56a868c0-0ad4-11ce-b03a-0020af0ba770),
        helpstring("IMediaEventEx interface"),
        odl
    ]
    interface IMediaEventEx : IMediaEvent
    {

        // Register a window to send messages to when events occur
        // Parameters:
        //
        //    hwnd - handle of window to notify -
        //           pass NULL to stop notification
        //    lMsg - Message id to pass messages with
	//    lInstanceData - will come back in lParam
        //
        // The event information must still be retrived by a call
        // to GetEvent when the window message is received.
        //
        // Multiple events may be notified with one window message.
        //
        HRESULT SetNotifyWindow(
                        [in] OAHWND hwnd,
                        [in] long lMsg,
			[in] LONG_PTR lInstanceData
                        );

        // Turn events notification on or off
        // lNoNotify = 0x00 event notification is ON
        // lNoNotify = 0x01 event notification is OFF.  The
        // handle returned by GetEventHandle will be signalled at
        // end of stream
        HRESULT SetNotifyFlags(
                        [in] long lNoNotifyFlags
                         );
        HRESULT GetNotifyFlags(
                        [out] long *lplNoNotifyFlags
                         );
    }




    // seek/cueing for positional media
    [
        uuid(56a868b2-0ad4-11ce-b03a-0020af0ba770),
        helpstring("IMediaPosition interface"),
        odl,
        oleautomation,
        dual
    ]
    interface IMediaPosition : IDispatch
    {
        // properties

        [propget]
        HRESULT Duration(
                    [out, retval] REFTIME* plength);

        [propput]
        HRESULT CurrentPosition(
                    [in] REFTIME llTime);

        [propget]
        HRESULT CurrentPosition(
                    [out, retval] REFTIME* pllTime);

        [propget]
        HRESULT StopTime(
                    [out, retval] REFTIME* pllTime);
        [propput]
        HRESULT StopTime(
                    [in] REFTIME llTime);

        [propget]
        HRESULT PrerollTime(
                    [out, retval] REFTIME* pllTime);
        [propput]
        HRESULT PrerollTime(
                    [in] REFTIME llTime);

        [propput]
        HRESULT Rate(
                    [in] double dRate);
        [propget]
        HRESULT Rate(
                    [out, retval] double * pdRate);

        HRESULT CanSeekForward([out, retval] LONG *pCanSeekForward);
        HRESULT CanSeekBackward([out, retval] LONG *pCanSeekBackward);
    }

    // basic audio-related functionality
    [
        uuid(56a868b3-0ad4-11ce-b03a-0020af0ba770),
        helpstring("IBasicAudio interface"),
        odl,
        oleautomation,
        dual
    ]
    interface IBasicAudio : IDispatch
    {
        // properties

        [propput]
        HRESULT Volume(
                    [in] long lVolume);
        [propget]
        HRESULT Volume(
                    [out, retval] long * plVolume);

        [propput]
        HRESULT Balance(
                    [in] long lBalance);
        [propget]
        HRESULT Balance(
                    [out, retval] long * plBalance);
    }

    // basic window-related functionality
    [
        uuid(56a868b4-0ad4-11ce-b03a-0020af0ba770),
        helpstring("IVideoWindow interface"),
        odl,
        oleautomation,
        dual
    ]
    interface IVideoWindow : IDispatch
    {
        // properties

        // set and get the window title caption

        [propput]
        HRESULT Caption([in] BSTR strCaption);
        [propget]
        HRESULT Caption([out, retval] BSTR *strCaption);

        // change the window styles (as per Win32)

        [propput]
        HRESULT WindowStyle([in] long WindowStyle);
        [propget]
        HRESULT WindowStyle([out, retval] long *WindowStyle);

        // change the extended window styles (as per Win32)

        [propput]
        HRESULT WindowStyleEx([in] long WindowStyleEx);
        [propget]
        HRESULT WindowStyleEx([out, retval] long *WindowStyleEx);

        [propput]
        HRESULT AutoShow([in] long AutoShow);
        [propget]
        HRESULT AutoShow([out, retval] long *AutoShow);

        // change the window state (as per Win32)

        [propput]
        HRESULT WindowState([in] long WindowState);
        [propget]
        HRESULT WindowState([out, retval] long *WindowState);

        // realise the palette in the background

        [propput]
        HRESULT BackgroundPalette([in] long BackgroundPalette);
        [propget]
        HRESULT BackgroundPalette([out, retval] long *pBackgroundPalette);

        // affect the visibility of the window

        [propput]
        HRESULT Visible([in] long Visible);
        [propget]
        HRESULT Visible([out, retval] long *pVisible);

        // change the desktop position of the video window

        [propput]
        HRESULT Left([in] long Left);
        [propget]
        HRESULT Left([out, retval] long *pLeft);

        [propput]
        HRESULT Width([in] long Width);
        [propget]
        HRESULT Width([out, retval] long *pWidth);

        [propput]
        HRESULT Top([in] long Top);
        [propget]
        HRESULT Top([out, retval] long *pTop);

        [propput]
        HRESULT Height([in] long Height);
        [propget]
        HRESULT Height([out, retval] long *pHeight);

        // change the owning window of the video

        [propput]
        HRESULT Owner([in] OAHWND Owner);
        [propget]
        HRESULT Owner([out, retval] OAHWND *Owner);

        // change the window to receive posted messages

        [propput]
        HRESULT MessageDrain([in] OAHWND Drain);
        [propget]
        HRESULT MessageDrain([out, retval] OAHWND *Drain);

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

        [propput]
        HRESULT BorderColor([in] long Color);

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

        [propput]
        HRESULT FullScreenMode([in] long FullScreenMode);

        // methods

        // ask the renderer to grab it's window the foreground
        // and optionally also give the window the input focus
        HRESULT SetWindowForeground([in] long Focus);

        // owners should pass WM_PALETTECHANGED and WM_SYSCOLORCHANGE
        // messages on the filter graph so they can be distributed
        // otherwise child renderers never see these messages go by

        HRESULT NotifyOwnerMessage([in] OAHWND hwnd,
                                   [in] long uMsg,
                                   [in] LONG_PTR wParam,
                                   [in] LONG_PTR lParam
                                   );

        // get and set the window position on the desktop

        HRESULT SetWindowPosition([in] long Left,
                                  [in] long Top,
                                  [in] long Width,
                                  [in] long Height);

        HRESULT GetWindowPosition([out] long *pLeft,
                                  [out] long *pTop,
                                  [out] long *pWidth,
                                  [out] long *pHeight);

        // get the ideal sizes for the video image playback (client) area

        HRESULT GetMinIdealImageSize([out] long *pWidth,[out] long *pHeight);
        HRESULT GetMaxIdealImageSize([out] long *pWidth,[out] long *pHeight);

        // get the restored window size when we're maximised or iconic

        HRESULT GetRestorePosition([out] long *pLeft,
                                   [out] long *pTop,
                                   [out] long *pWidth,
                                   [out] long *pHeight);

	// show and hide cursors useful when fullscreen
	HRESULT HideCursor([in] long HideCursor);
        HRESULT IsCursorHidden([out] long *CursorHidden);
    }

    // basic video-related functionality
    [
        uuid(56a868b5-0ad4-11ce-b03a-0020af0ba770),
        helpstring("IBasicVideo interface"),
        odl,
        oleautomation,
        dual
    ]
    interface IBasicVideo : IDispatch
    {
        // properties

        // Video specific (approximate) bit and frame rates

        [propget]
        HRESULT AvgTimePerFrame([out, retval] REFTIME *pAvgTimePerFrame);

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

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

        // read the native video size

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

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

        // change the source rectangle for the video

        [propput]
        HRESULT SourceLeft([in] long SourceLeft);
        [propget]
        HRESULT SourceLeft([out, retval] long *pSourceLeft);

        [propput]
        HRESULT SourceWidth([in] long SourceWidth);
        [propget]
        HRESULT SourceWidth([out, retval] long *pSourceWidth);

        [propput]
        HRESULT SourceTop([in] long SourceTop);
        [propget]
        HRESULT SourceTop([out, retval] long *pSourceTop);

        [propput]
        HRESULT SourceHeight([in] long SourceHeight);
        [propget]
        HRESULT SourceHeight([out, retval] long *pSourceHeight);

        // change the destination rectangle for the video

        [propput]
        HRESULT DestinationLeft([in] long DestinationLeft);
        [propget]
        HRESULT DestinationLeft([out, retval] long *pDestinationLeft);

        [propput]
        HRESULT DestinationWidth([in] long DestinationWidth);
        [propget]
        HRESULT DestinationWidth([out, retval] long *pDestinationWidth);

        [propput]
        HRESULT DestinationTop([in] long DestinationTop);
        [propget]
        HRESULT DestinationTop([out, retval] long *pDestinationTop);

        [propput]
        HRESULT DestinationHeight([in] long DestinationHeight);
        [propget]
        HRESULT DestinationHeight([out, retval] long *pDestinationHeight);

        // methods

        // get and set the source rectangle position

        HRESULT SetSourcePosition([in] long Left,
                                  [in] long Top,
                                  [in] long Width,
                                  [in] long Height);

        HRESULT GetSourcePosition([out] long *pLeft,
                                  [out] long *pTop,
                                  [out] long *pWidth,
                                  [out] long *pHeight);

        HRESULT SetDefaultSourcePosition();

        // get and set the destination rectangle position

        HRESULT SetDestinationPosition([in] long Left,
                                       [in] long Top,
                                       [in] long Width,
                                       [in] long Height);

        HRESULT GetDestinationPosition([out] long *pLeft,
                                       [out] long *pTop,
                                       [out] long *pWidth,
                                       [out] long *pHeight);

        HRESULT SetDefaultDestinationPosition();

        // get the native video dimensions

        HRESULT GetVideoSize([out] long *pWidth,[out] long *pHeight);

        // get all or some of the current video palette

        HRESULT GetVideoPaletteEntries([in] long StartIndex,
                                       [in] long Entries,
                                       [out] long *pRetrieved,
                                       [out] long *pPalette);

        HRESULT GetCurrentImage([in,out] long *pBufferSize,
                                [out] long *pDIBImage);

        // are we using a default source or destination

        HRESULT IsUsingDefaultSource();
        HRESULT IsUsingDefaultDestination();
    }

    // interface extension to IBasicVideo to return preferred aspect ratio
    [
        uuid(329bb360-f6ea-11d1-9038-00a0c9697298),
        helpstring("IBasicVideo2"),
        odl
    ]
    interface IBasicVideo2 : IBasicVideo
    {
        //  This may not match the native video dimensions because of
        //  non-square pixels or whatever.
        //  The video may not always be displayed in the preferred
        //  aspect ratio for performance reasons

        HRESULT GetPreferredAspectRatio([out] long *plAspectX,
                                        [out] long *plAspectY);
    }

    // interface returned to a command that has been queued via IQueueCommand
    [
        uuid(56a868b8-0ad4-11ce-b03a-0020af0ba770),
        helpstring("IDeferredCommand"),
        odl
    ]
    interface IDeferredCommand : IUnknown
    {
        HRESULT Cancel();
        HRESULT Confidence(
                    [out] LONG* pConfidence);
        HRESULT Postpone(
                    [in] REFTIME newtime);
        // return value is S_OK if completed. phrResult is set to the
        // result of the deferred command.
        HRESULT GetHResult(
                    [out] HRESULT* phrResult);
    };

    // queue an IDispatch-based command for execution at a specified time
    [
        uuid(56a868b7-0ad4-11ce-b03a-0020af0ba770),
        helpstring("IQueueCommand"),
        odl
    ]
    interface IQueueCommand  : IUnknown
    {
        HRESULT InvokeAtStreamTime(
                    [out] IDeferredCommand** pCmd,
                    [in] REFTIME time,            // at this streamtime
                    [in] GUID* iid,                   // call this interface
                    [in] long dispidMethod,         // ..and this method
                    [in] short wFlags,              // method/property
                    [in] long cArgs,                // count of args
                    [in] VARIANT* pDispParams,      // actual args
                    [in, out] VARIANT* pvarResult,  // return value
                    [out] short* puArgErr           // which arg in error
        );

        HRESULT InvokeAtPresentationTime(
                    [out] IDeferredCommand** pCmd,
                    [in] REFTIME time,            // at this presentation time
                    [in] GUID* iid,                   // call this interface
                    [in] long dispidMethod,         // ..and this method
                    [in] short wFlags,              // method/property
                    [in] long cArgs,                // count of args
                    [in] VARIANT* pDispParams,      // actual args
                    [in, out] VARIANT* pvarResult,  // return value
                    [out] short* puArgErr           // which arg in error
        );

    };



    // the filgraph object (CLSID_Filgraph)
    [
        uuid(e436ebb3-524f-11ce-9f53-0020af0ba770),
        helpstring("Filtergraph type info")
    ]
    coclass FilgraphManager
    {
        [default] interface IMediaControl;
        interface IMediaEvent;
        interface IMediaPosition;
        interface IBasicAudio;
        interface IBasicVideo;
        interface IVideoWindow;

    };


    // represents a filter (you can't QI for IBaseFilter from this object)
    [
        uuid(56a868ba-0ad4-11ce-b03a-0020af0ba770),
        helpstring("FilterInfo"),
        odl,
        oleautomation,
        dual
    ]
    interface IFilterInfo : IDispatch
    {
        // find a pin given an id - returns an object supporting
        // IPinInfo
        HRESULT FindPin(
                    [in] BSTR strPinID,
                    [out] IDispatch** ppUnk);

        // filter name
        [propget]
        HRESULT Name(
                    [out, retval] BSTR* strName);

        // Vendor info string
        [propget]
        HRESULT VendorInfo(
                    [out, retval] BSTR* strVendorInfo);

        // returns the actual filter object (supports IBaseFilter)
        [propget]
        HRESULT Filter(
                    [out, retval] IUnknown **ppUnk);

        // returns an IAMCollection object containing the PinInfo objects
        // for this filter
        [propget]
        HRESULT Pins(
                    [out, retval] IDispatch ** ppUnk);

        // returns -1 if true or 0 if false (OATRUE/FALSE)
        [propget]
        HRESULT IsFileSource(
                    [out, retval] LONG * pbIsSource);

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

        [propput]
        HRESULT Filename(
                    [in] BSTR strFilename);
    }

    [
        uuid(56a868bb-0ad4-11ce-b03a-0020af0ba770),
        helpstring("Registry Filter Info"),
        odl,
        oleautomation,
        dual
    ]
    interface IRegFilterInfo : IDispatch
    {
        // get the name of this filter
        [propget]
        HRESULT Name(
                    [out, retval] BSTR* strName);


        // make an instance of this filter, add it to the graph and
        // return an IFilterInfo for it.
        HRESULT Filter(
                    [out] IDispatch** ppUnk);
    }

    // wrapper for a media type
    [
        uuid(56a868bc-0ad4-11ce-b03a-0020af0ba770),
        helpstring("Media Type"),
        odl,
        oleautomation,
        dual
    ]
    interface IMediaTypeInfo : IDispatch
    {
        // get the major type GUID as a string
        [propget]
        HRESULT Type(
                    [out, retval] BSTR* strType);

        // get the subtype GUID as a string
        [propget]
        HRESULT Subtype(
                    [out, retval] BSTR* strType);
    }

    [
        uuid(56a868bd-0ad4-11ce-b03a-0020af0ba770),
        helpstring("Pin Info"),
        odl,
        oleautomation,
        dual
    ]
    interface IPinInfo : IDispatch
    {
        // get the pin object (IUnknown for an object that
        // supports IPin
        [propget]
        HRESULT Pin(
                    [out, retval] IUnknown** ppUnk);

        // get the PinInfo object for the pin we are connected to
        [propget]
        HRESULT ConnectedTo(
                    [out, retval] IDispatch** ppUnk);

        // get the media type on this connection - returns an
        // object supporting IMediaTypeInfo
        [propget]
        HRESULT ConnectionMediaType(
                    [out, retval] IDispatch** ppUnk);


        // return the FilterInfo object for the filter this pin
        // is part of
        [propget]
        HRESULT FilterInfo(
                    [out, retval] IDispatch** ppUnk);

        // get the name of this pin
        [propget]
        HRESULT Name(
                    [out, retval] BSTR* ppUnk);

        // pin direction
        [propget]
        HRESULT Direction(
                    [out, retval] LONG *ppDirection);

        // PinID - can pass to IFilterInfo::FindPin
        [propget]
        HRESULT PinID(
                    [out, retval] BSTR* strPinID);

        // collection of preferred media types (IAMCollection)
        [propget]
        HRESULT MediaTypes(
                    [out, retval] IDispatch** ppUnk);

        // Connect to the following pin, using other transform
        // filters as necessary. pPin can support either IPin or IPinInfo
        HRESULT Connect(
                    [in] IUnknown* pPin);

        // Connect directly to the following pin, not using any intermediate
        // filters
        HRESULT ConnectDirect(
                    [in] IUnknown* pPin);

        // Connect directly to the following pin, using the specified
        // media type only. pPin is an object that must support either
        // IPin or IPinInfo, and pMediaType must support IMediaTypeInfo.
        HRESULT ConnectWithType(
                    [in] IUnknown * pPin,
                    [in] IDispatch * pMediaType);

        // disconnect this pin and the corresponding connected pin from
        // each other. (Calls IPin::Disconnect on both pins).
        HRESULT Disconnect(void);

        // render this pin using any necessary transform and rendering filters
        HRESULT Render(void);
    }

    //--------------------------------------------------------------------
    //
    //  IAMStats - statistics
    //
    //  Note that the calls using an index are likely to be much faster
    //--------------------------------------------------------------------

    [
            uuid(bc9bcf80-dcd2-11d2-abf6-00a0c905f375),
            helpstring("Statistics"),
            odl,
            oleautomation,
            dual
    ]
    interface IAMStats : IDispatch {
        //  Reset all stats
        HRESULT Reset();

        //  Get number of stats collected
        [propget]
        HRESULT Count(
                    [out, retval] LONG* plCount);

        //  Pull out a specific value by position
        HRESULT GetValueByIndex([in] long lIndex,
                                [out] BSTR *szName,
                                [out] long *lCount,
                                [out] double *dLast,
                                [out] double *dAverage,
                                [out] double *dStdDev,
                                [out] double *dMin,
                                [out] double *dMax);

        //  Pull out a specific value by name
        HRESULT GetValueByName([in] BSTR szName,
                               [out] long *lIndex,
                               [out] long *lCount,
                                [out] double *dLast,
                               [out] double *dAverage,
                               [out] double *dStdDev,
                               [out] double *dMin,
                               [out] double *dMax);


        //  The calls below are for generators of statistics

        //  Return the index for a string - optinally create
        HRESULT GetIndex([in] BSTR szName,
                         [in] long lCreate,
                         [out] long *plIndex);

        //  Add a new value
        HRESULT AddValue([in] long lIndex,
                         [in] double dValue);
    }
};