// -*- Mode: C++ -*-
/*++

Copyright (c) 1998 Microsoft Corporation

Abstract:

    Interface definitions for Windows Multimedia Runtime components

--*/
import "danim.idl";

cpp_quote("#include \"danim.h\"")

interface ITIMEMMBehavior;
interface ITIMEMMTimeline;
interface ITIMEMMPlayer;
interface ITIMEMMEventCB;

typedef enum {
    MM_PLAY_EVENT,
    MM_STOP_EVENT,
    MM_REPEAT_EVENT,
    MM_AUTOREVERSE_EVENT,
    MM_PAUSE_EVENT,
    MM_RESUME_EVENT,
    MM_RESET_EVENT,
} MM_EVENT_TYPE ;

typedef enum {
    MM_EVENT_SEEK = 0x00000001,
    MM_EVENT_PROPERTY_CHANGE = 0x00000002,
} MM_EVENT_FLAGS ;

[
    object,
    uuid(dc2f58e6-4ad2-11d2-b953-3078302c2030),
    pointer_default(unique)
]
interface ITIMEMMEventCB : IUnknown
{
    HRESULT OnEvent([in] double eventTime,
                    [in] ITIMEMMBehavior *,
                    [in] MM_EVENT_TYPE et,
                    [in] DWORD flags);
    HRESULT OnTick([in] double lastTime,
                   [in] double nextTime,
                   [in] ITIMEMMBehavior *,
                   [out, retval] double * newTime);
}

typedef enum {
    MM_PLAYING_STATE,
    MM_STOPPED_STATE,
    MM_PAUSED_STATE,
} MM_STATE;

typedef enum {
    MM_START_ABSOLUTE,
    MM_START_EVENT,
    MM_START_WITH,
    MM_START_AFTER,
} MM_START_TYPE;

typedef enum {
    MM_STOP_ABSOLUTE,
    MM_STOP_WITH
} MM_STOP_TYPE;

typedef enum {
    MM_LOCKED = 0x00000001,

    MM_CLOCKSOURCE = 0x00010000,
} MM_SYNC_FLAGS;

[
    object,
    uuid(18b4a8b2-5f36-11d2-b957-3078302c2030),
    pointer_default(unique)
]
interface ITIMEMMBehavior : IUnknown
{
    [propget] HRESULT ID([out, retval] BSTR *);
    [propput] HRESULT ID([in] BSTR);
    
    [propget] HRESULT StartOffset([out, retval] float *);
    [propput] HRESULT StartOffset([in] float);
    
    [propget] HRESULT Duration([out, retval] float *);
    [propput] HRESULT Duration([in] float);
    
    [propget] HRESULT Repeat([out, retval] LONG *);
    [propput] HRESULT Repeat([in] LONG);
    
    [propget] HRESULT AutoReverse([out, retval] VARIANT_BOOL *);
    [propput] HRESULT AutoReverse([in] VARIANT_BOOL);
    
    [propget] HRESULT RepeatDur([out, retval] float *);
    [propput] HRESULT RepeatDur([in] float);

    [propget] HRESULT EndOffset([out, retval] float *);
    [propput] HRESULT EndOffset([in] float);
    
    [propget] HRESULT EaseIn([out, retval] float *);
    [propput] HRESULT EaseIn([in] float);

    [propget] HRESULT EaseInStart([out, retval] float *);
    [propput] HRESULT EaseInStart([in] float);

    [propget] HRESULT EaseOut([out, retval] float *);
    [propput] HRESULT EaseOut([in] float);

    [propget] HRESULT EaseOutEnd([out, retval] float *);
    [propput] HRESULT EaseOutEnd([in] float);

    [propget] HRESULT EventCB([out, retval] ITIMEMMEventCB **);
    [propput] HRESULT EventCB([in] ITIMEMMEventCB *);

    [propget] HRESULT SyncFlags([out, retval] DWORD *);
    [propput] HRESULT SyncFlags([in] DWORD);

    [propget] HRESULT TotalTime([out, retval] float *);

    HRESULT Begin(VARIANT_BOOL bAfterOffset);
    HRESULT End();
    HRESULT Pause();
    HRESULT Run();
    HRESULT Reset(DWORD fCause);
    HRESULT ResetOnEventChanged(VARIANT_BOOL bBeginEvent);
    HRESULT Seek([in] double lTime);
    
    [propget] HRESULT LocalTime([out, retval] double * d);
	
    [propget] HRESULT LocalTimeEx([out, retval] double * d);

    [propget] HRESULT PlayState([out, retval] MM_STATE *);
    
    [propget] HRESULT DABehavior([out, retval] IDABehavior **);

    HRESULT GetDABehavior([in]REFIID riid, [out, iid_is(riid)]void **retobj);

    HRESULT GetResultantBehavior([in] REFIID riid, [out, iid_is(riid)] void **ret);

    [propget] HRESULT SegmentTime([out, retval] double * d);
    [propput] HRESULT StartType([in] MM_START_TYPE type);
}

// Flags for the endsync property.
enum {
    MM_ENDSYNC_NONE    = 0x00000000,
    MM_ENDSYNC_FIRST   = 0x00000001,
    MM_ENDSYNC_LAST    = 0x00000002,
} ;

[
    object,
    uuid(03030490-4ad3-11d2-b953-3078302c2030),
    pointer_default(unique)
]
interface ITIMEMMTimeline : ITIMEMMBehavior
{
    HRESULT AddBehavior([in] ITIMEMMBehavior * bvr,
                        [in] MM_START_TYPE st,
                        [in] ITIMEMMBehavior * basebvr);
    HRESULT RemoveBehavior([in] ITIMEMMBehavior * bvr);

    [propget] HRESULT EndSync([out, retval] DWORD * flags);
    [propput] HRESULT EndSync([in] DWORD flags);
}


[
    object,
    uuid(a415fbf4-9118-11d2-80b9-00c04fa32195),
    pointer_default(unique)
]
interface ITIMEMMView : IUnknown
{
    HRESULT Tick();
    HRESULT Draw(HDC dc, LPRECT prc);

    HRESULT OnMouseMove([in] double when,
                        [in] LONG xPos, [in] LONG yPos,
                        [in] BYTE modifiers);
    
    HRESULT OnMouseButton([in] double when,
                          [in] LONG xPos, [in] LONG yPos,
                          [in] BYTE button,
                          [in] VARIANT_BOOL bPressed,
                          [in] BYTE modifiers);
    
    HRESULT OnKey([in] double when,
                  [in] LONG key,
                  [in] VARIANT_BOOL bPressed,
                  [in] BYTE modifiers);
    
    HRESULT OnFocus([in] VARIANT_BOOL bHasFocus);
}

[
    object,
    uuid(af60ba34-91a0-11d2-80b9-00c04fa32195),
    pointer_default(unique)
]
interface ITIMEMMViewSite : IUnknown
{
    HRESULT Invalidate(LPRECT prc);
}

[
    object,
    uuid(abc4aa1c-5bbc-11d2-b957-3078302c2030),
    pointer_default(unique)
]
interface ITIMEMMPlayer : IUnknown
{
    [propget] HRESULT ID([out, retval] BSTR *);
    [propput] HRESULT ID([in] BSTR);
    
	HRESULT Shutdown();
    HRESULT Play();
    HRESULT Stop();
    HRESULT Pause();
    HRESULT Resume();
    
    [propget] HRESULT PlayerState([out, retval] MM_STATE *);
    
    [propget] HRESULT CurrentTime([out, retval] double * d);

    HRESULT SetPosition([in] double lTime);
    HRESULT SetDirection([in] VARIANT_BOOL bForward);

    [propget] HRESULT Behavior([out, retval] ITIMEMMBehavior ** bvr);

    HRESULT Tick([in] double simTime);

    HRESULT AddView([in] ITIMEMMView * view);
    HRESULT RemoveView([in] ITIMEMMView * view);
}
