//==========================================================================;
//
//  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 - 1996  Microsoft Corporation.  All Rights Reserved.
//
//--------------------------------------------------------------------------;

[
object,
uuid(359ace10-7688-11cf-8b23-00805f6cef60),
pointer_default(unique)
]
interface IAMovie : IFilterGraph
{
        // IGraphBuilder
        // Connect these two pins directly or indirectly, using transform filters
        // if necessary.

        HRESULT Connect
        ( [in] IPin * ppinOut,    // the output pin
          [in] IPin * ppinIn      // the input pin
        );


        // Connect this output pin directly or indirectly, using transform filters
        // if necessary to something that will render it.

        HRESULT Render
        ( [in] IPin * ppinOut     // the output pin
        );


        // IMediaControl methods
        HRESULT Run();
        HRESULT Pause();
        HRESULT Stop();

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

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

        // adds and connects filters needed to play the specified file
        HRESULT RenderFile(
                    [in] LPCWSTR strFilename);

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

        // 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] HEVENT * 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.
        HRESULT GetEvent(
                        [out] long * lEventCode,
                        [out] long * lParam1,
                        [out] long * 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);

        // properties
        HRESULT get_Duration(
                    [out] REFTIME* plength);

        HRESULT put_CurrentPosition(
                    [in] REFTIME llTime);

        HRESULT get_CurrentPosition(
                    [out] REFTIME* pllTime);

        HRESULT get_StopTime(
                    [out] REFTIME* pllTime);

        HRESULT put_StopTime(
                    [in] REFTIME llTime);

        HRESULT get_PrerollTime(
                    [out] REFTIME* pllTime);
        HRESULT put_PrerollTime(
                    [in] REFTIME llTime);

        HRESULT put_Rate(
                    [in] double dRate);
        HRESULT get_Rate(
                    [out] double * pdRate);

	/* New methods */
	HRESULT RemoveAllFilters();
	HRESULT Play();
	HRESULT PlayFile([in] LPCWSTR strFilename);
	HRESULT EnumFiltersByInterface( [in] REFIID riid, [out] IEnumFilters ** ppEnum );
	HRESULT EnumPins( [out] IEnumPins ** ppEnum );
	HRESULT EnumPinsIn( [out] IEnumPins ** ppEnum );
	HRESULT EnumPinsOut( [out] IEnumPins ** ppEnum );
	HRESULT RenderAll();
	HRESULT RenderNewFile( [in] LPCWSTR strFilename);

	// 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 lParam1,
                        [in] long lParam2);
}

