IMediaParams
COM公式ドキュメント
IMediaParams インターフェイスは、オブジェクトのエンベロープ追従パラメーターを設定および取得します。
メソッド 5
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
GetParam メソッドは、指定したパラメーターの現在の値を取得します。パラメーターが現在エンベロープセグメント内にある場合、最後に処理されたサンプルにおける値が返されます。
| dwParamIndex | DWORD | in | パラメーターの 0 から始まるインデックス。 |
| pValue | FLOAT* | out | パラメーター値を受け取る MP_DATA 型の変数へのポインター。 |
戻り値
HRESULT 値を返します。取り得る値には次のものがあります。
| 戻り値 | 説明 |
|---|---|
| インデックスが範囲外です。 | |
| NULL ポインター引数です。 | |
| 成功しました。 |
解説(Remarks)
このオブジェクトがサポートするパラメーターとそのインデックス値を列挙するには、IMediaParamInfo インターフェイスを使用します。
SetParam メソッドは、パラメーターの値を設定します。
| dwParamIndex | DWORD | in | パラメーターの 0 から始まるインデックス。すべてのパラメーターに値を適用するには DWORD_ALLPARAMS を指定します。 |
| value | FLOAT | in | パラメーターの新しい値。 |
戻り値
HRESULT 値を返します。取り得る値には次のものがあります。
| 戻り値 | 説明 |
|---|---|
| インデックスが範囲外、またはパラメーター値が不正です。 | |
| 成功しました。 |
解説(Remarks)
パラメーターが現在エンベロープセグメント内にある場合、エンベロープセグメントによって新しい値は上書きされます。エンベロープセグメントを削除するには、FlushEnvelope メソッドを呼び出します。
このオブジェクトがサポートするパラメーターとそのインデックス値を列挙するには、IMediaParamInfo インターフェイスを使用します。
AddEnvelope メソッドは、パラメーターにエンベロープを追加します。
| dwParamIndex | DWORD | in | パラメーターの 0 から始まるインデックス。すべてのパラメーターにエンベロープを追加するには DWORD_ALLPARAMS を指定します。 |
| cSegments | DWORD | in | エンベロープ内のセグメント数。 |
| pEnvelopeSegments | MP_ENVELOPE_SEGMENT* | in | エンベロープセグメントを定義する MP_ENVELOPE_SEGMENT 構造体の配列へのポインター。配列のサイズは cPoints パラメーターで指定します。 |
戻り値
HRESULT 値を返します。取り得る値には次のものがあります。
| 戻り値 | 説明 |
|---|---|
| インデックスが範囲外です。 | |
|
メモリが不足しています。 |
| NULL ポインター引数です。 | |
| 成功しました。 |
解説(Remarks)
呼び出し側は、時間の昇順でエンベロープを追加する必要があります。そうしないと、再生時の結果は不定になります。あるエンベロープが別のエンベロープと重なる場合、後のエンベロープが優先されます。
このオブジェクトがサポートするパラメーターとそのインデックス値を列挙するには、IMediaParamInfo インターフェイスを使用します。
例
次のコードは、いずれも線形関数を使用する 2 つのエンベロープセグメントを設定します。
#define MSEC 10000 // One millisecond
// Define an array with two segments. Note the segments appear in
// time-ascending order.
MP_ENVELOPE_SEGMENT Segments[] =
{
{
0, // rtStart
3 * MSEC, // rtStop
0, // valStart
12, // valStop
MP_CURVE_LINEAR, // iCurve
MPF_ENVLP_STANDARD // flags
},
{
6 * MSEC,
9 * MSEC,
12,
0,
MP_CURVE_LINEAR,
MPF_ENVLP_STANDARD
}
};
// Define the number of segments in the array.
DWORD cSegments = sizeof(Segments) / sizeof(Segments[0]);
DWORD dwParam = 0; // Which parameter to set.
hr = pMediaParams->AddEnvelope(dwParam, cSegments, Segments);
この例では、呼び出し側が事前に IMediaParamInfo インターフェイスを使用して、DMO が該当パラメーターに対して MP_CURVE_LINEAR カーブをサポートしているかどうかを照会済みであることを前提としています。
FlushEnvelope メソッドは、指定した時間範囲にわたって、指定したパラメーターのエンベロープデータをフラッシュします。
| dwParamIndex | DWORD | in | パラメーターの 0 から始まるインデックス。すべてのパラメーターからエンベロープデータをフラッシュするには DWORD_ALLPARAMS を指定します。 |
| refTimeStart | LONGLONG | in | フラッシュするエンベロープデータの開始時刻。 |
| refTimeEnd | LONGLONG | in | フラッシュするエンベロープデータの終了時刻。 |
戻り値
HRESULT 値を返します。取り得る値には次のものがあります。
| 戻り値 | 説明 |
|---|---|
| インデックスが範囲外です。 | |
| 成功しました。 |
解説(Remarks)
refTimeStart と refTimeEnd で指定される時間範囲がエンベロープセグメントと重なる場合、そのセグメント全体がフラッシュされます。一方、範囲がエンベロープセグメントの境界上にある場合は、そのセグメント全体が保持されます。したがって、次のようになります。
- 開始時刻がエンベロープセグメント内にある場合、そのセグメントはフラッシュされます。
- 終了時刻がエンベロープセグメント内にある場合、そのセグメントはフラッシュされます。
- 開始時刻がエンベロープセグメントの終了時刻と等しい場合、そのセグメントは保持されます。
- 終了時刻がエンベロープセグメントの開始時刻と等しい場合、そのセグメントは保持されます。
SetTimeFormat メソッドは、オブジェクトの時間形式を指定します。
| guidTimeFormat | GUID | in | 時間形式を指定する時間形式 GUID。 |
| mpTimeData | DWORD | in | 新しい形式の測定単位を指定する MP_TIMEDATA 型の値。 |
戻り値
HRESULT 値を返します。取り得る値には次のものがあります。
| 戻り値 | 説明 |
|---|---|
| オブジェクトがこの時間形式をサポートしていません。 | |
| 成功しました。 |
解説(Remarks)
オブジェクトは複数の時間形式をサポートできます。すべてのオブジェクトは、各時間単位が 100 ナノ秒 (ns) である参照時間をサポートする必要があります。その他の形式は任意です。アプリケーションは、入力バッファーのタイムスタンプが、このメソッドで設定した時間形式に一致するようにする必要があります。
mpTimeData パラメーターの意味は、guidTimeFormat パラメーターの値によって異なります。
| 時間形式 | 時間データの意味 |
|---|---|
| GUID_TIME_MUSIC | 4 分音符あたりのパート数。 |
| GUID_TIME_REFERENCE | 無視されます。 |
| GUID_TIME_SAMPLES | 1 秒あたりのサンプル数。 |
このメソッドを呼び出すときは、FlushEnvelope メソッドも呼び出して、以前の時間形式で設定されたエンベロープをすべてフラッシュしてください。
オブジェクトがサポートする時間形式を確認するには、IMediaParamInfo::GetSupportedTimeFormat メソッドを呼び出します。現在の形式を取得するには、IMediaParamInfo::GetCurrentTimeFormat メソッドを呼び出します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IMediaParams "{6D6CBB61-A223-44AA-842F-A2F06750BE6E}" #usecom global IMediaParams IID_IMediaParams "{}" #comfunc global IMediaParams_GetParam 3 int,var #comfunc global IMediaParams_SetParam 4 int,float #comfunc global IMediaParams_AddEnvelope 5 int,int,var #comfunc global IMediaParams_FlushEnvelope 6 int,int64,int64 #comfunc global IMediaParams_SetTimeFormat 7 int,int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_IMediaParams "{6D6CBB61-A223-44AA-842F-A2F06750BE6E}" #usecom global IMediaParams IID_IMediaParams "{}" #comfunc global IMediaParams_GetParam 3 int,sptr #comfunc global IMediaParams_SetParam 4 int,float #comfunc global IMediaParams_AddEnvelope 5 int,int,sptr #comfunc global IMediaParams_FlushEnvelope 6 int,int64,int64 #comfunc global IMediaParams_SetTimeFormat 7 int,int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。