/* This file is part of the KDE project
   Copyright (C) 2007 Shane King

   This program is free software; you can redistribute it and/or
   modify it under the terms of the GNU Library General Public
   License as published by the Free Software Foundation; either
   version 2 of the License, or (at your option) any later version.

   This program 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
   Library General Public License for more details.

   You should have received a copy of the GNU Library General Public License
   along with this program; see the file COPYING.  If not, write to
   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
   Boston, MA 02110-1301, USA.
*/

import "unknwn.idl";
import "strmif.idl";

typedef DWORD MP_TIMEDATA;
typedef DWORD MP_CAPS;
typedef DWORD MP_FLAGS;
typedef float MP_DATA;

typedef enum _MP_Type {
    MPT_INT,
    MPT_FLOAT,
    MPT_BOOL,
    MPT_ENUM,
    MPT_MAX,
} MP_TYPE;

typedef enum _MP_CURVE_TYPE {
    MP_CURVE_JUMP       = 0x0001, 
    MP_CURVE_LINEAR     = 0x0002, 
    MP_CURVE_SQUARE     = 0x0004, 
    MP_CURVE_INVSQUARE  = 0x0008, 
    MP_CURVE_SINE       = 0x0010, 
} MP_CURVE_TYPE;

typedef struct _MP_PARAMINFO {
    MP_TYPE    mpType;
    MP_CAPS    mopCaps;
    MP_DATA    mpdMinValue;
    MP_DATA    mpdMaxValue;
    MP_DATA    mpdNeutralValue;
    WCHAR      szUnitText[32];
    WCHAR      szLabel[32]; 
} MP_PARAMINFO;

typedef struct _MP_ENVELOPE_SEGMENT {
    REFERENCE_TIME   rtStart;
    REFERENCE_TIME   rtEnd;
    MP_DATA          valStart;
    MP_DATA          valEnd;
    MP_CURVE_TYPE    iCurve;
    MP_FLAGS         flags;
} MP_ENVELOPE_SEGMENT;

const MP_CAPS MP_CAPS_CURVE_JUMP        = MP_CURVE_JUMP;
const MP_CAPS MP_CAPS_CURVE_LINEAR      = MP_CURVE_LINEAR;
const MP_CAPS MP_CAPS_CURVE_SQUARE      = MP_CURVE_SQUARE;
const MP_CAPS MP_CAPS_CURVE_INVSQUARE   = MP_CURVE_INVSQUARE;
const MP_CAPS MP_CAPS_CURVE_SINE        = MP_CURVE_SINE;

[
    object,
    uuid(6d6cbb61-a223-44aa-842f-a2f06750be6e)
]
interface IMediaParams : IUnknown
{
    HRESULT AddEnvelope(
        DWORD dwParamIndex,
        DWORD cPoints,
        MP_ENVELOPE_SEGMENT *pEnvelope
    );

    HRESULT FlushEnvelope(
        DWORD dwParamIndex,
        REFERENCE_TIME refTimeStart,
        REFERENCE_TIME refTimeEnd
    );

    HRESULT GetParam(
        DWORD dwParamIndex,
        MP_DATA *pValue
    );

    HRESULT SetParam(
        DWORD dwParamIndex,
        MP_DATA value
    );

    HRESULT SetTimeFormat(
        GUID guidTimeFormat,
        MP_TIMEDATA mpTimeData
    );
}

[
    object,
    uuid(6d6cbb60-a223-44aa-842f-a2f06750be6d)
]
interface IMediaParamInfo : IUnknown
{
    HRESULT GetParamCount(
        DWORD *pdwParams
    );
    
    HRESULT GetParamInfo(
        DWORD dwParamIndex,
        MP_PARAMINFO *pInfo
    );
    
    HRESULT GetParamText(
        DWORD dwParamIndex,
        WCHAR **ppwchText
    );   
   
    HRESULT GetNumTimeFormats(
        DWORD *pdwNumTimeFormats
    );
 
    HRESULT GetSupportedTimeFormat(
        DWORD dwFormatIndex,
        GUID *pguidTimeFormat
    );
    
    HRESULT GetCurrentTimeFormat(
        GUID *pguidTimeFormat,
        MP_TIMEDATA *pTimeData
    );    
}