/* 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
    );    
}
