Microsoft DirectX 8.0 |
1 つの出力ピンを持つソース フィルタで、シークを実装する抽象クラス。
宣言 : Ctlutil.h
このクラスは、IMediaSeeking インターフェイスをサポートし、すべての IMediaSeeking メソッドにデフォルトの実装を提供する。プロテクト メンバ変数は、開始タイム、終了タイム、および現在のレートを格納する。デフォルトでは、このクラスによってサポートされる唯一のタイム フォーマットは、TIME_FORMAT_MEDIA_TIME (100 ナノ秒単位) である。
CSourceSeeking オブジェクトは、開始位置、停止位置、または再生レートが変更されるたびに、次のように対応する純粋仮想メソッドを呼び出す。
派生クラスは、これらのメソッドを実装しなければならない。シーク処理後、フィルタは次のことを行う必要がある。
ワーカー スレッドがブロックされ、サンプル出力の待機状態になっている場合は、BeginFlush を呼び出してワーカー スレッドを解放する。
ステップ 2 で、スレッドによるデータの送信が停止したことを確認する。実装によっては、スレッドが終了するのを待つか、またはスレッドがなんらかの応答を示すまで待つ必要がある。フィルタで CSourceStream クラスを使っている場合、CSourceStream::Stop メソッドは、ワーカー スレッドが応答するまで待機状態となる。
理想的には、新しいセグメント (ステップ 5) がワーカー スレッドから提供されることが望ましい。これは、フィルタがサンプルを使って継続して処理する限り、CSourceSeeking オブジェクトによっても実行できる。
次の例は、可能な実装を示している。ここでは、ソース フィルタの出力ピンが CSourceSeeking と CSourceStream から派生することを想定している。この例では、ステップ 1 〜 4 を実行するヘルパー メソッド UpdateFromSeek を定義している。CSourceStream::OnThreadStartPlay メソッドはオーバーライドされ、新しいセグメントを送るとともに、非連続を示すフラグを設定する。ワーカー スレッドはこのフラグをピックアップし、IMediaSample::SetDiscontinuity を呼び出す。
void CMyStream::UpdateFromSeek() { if (ThreadExists()) { DeliverBeginFlush(); Stop(); DeliverEndFlush(); Run(); } } HRESULT CMyStream::OnThreadStartPlay() { m_bDiscontinuity = TRUE; return DeliverNewSegment(m_rtStart, m_rtStop, m_dRateSeeking); }
プロテクト メンバ変数 | |
---|---|
m_rtDuration | ストリームが再生される時間。 |
m_rtStart | 開始タイム。 |
m_rtStop | 終了タイム。 |
m_dRateSeeking | 再生レート。 |
m_dwSeekingCaps | シーク能力。 |
m_pLock | ロックのためのクリティカル セクション オブジェクトへのポインタ。 |
プロテクト メソッド | |
CSourceSeeking | コンストラクタ メソッド。 |
純粋仮想メソッド | |
ChangeRate | 再生レートが変更されたときに呼び出される。 |
ChangeStart | 開始位置が変更されたときに呼び出される。 |
ChangeStop | 停止位置が変更されたときに呼び出される。 |
IMediaSeeking メソッド | |
IsFormatSupported | 指定されたタイム フォーマットがサポートされているかどうかを判定する。 |
QueryPreferredFormat | オブジェクトの優先タイム フォーマットを取得する。 |
SetTimeFormat | タイム フォーマットを設定する。 |
IsUsingTimeFormat | 指定されたタイム フォーマットが、現在使用されているフォーマットかどうかを判定する。 |
GetTimeFormat | 現在のタイム フォーマットを取得する。 |
GetDuration | ストリームの時間幅を取得する。 |
GetStopPosition | ストリームの時間幅に対して、再生が停止するタイムを取得する。 |
GetCurrentPosition | ストリームの合計時間幅に対する、現在の位置を取得する。 |
GetCapabilities | ストリームのすべてのシーク能力を取得する。 |
CheckCapabilities | ストリームに指定されたシーク能力があるかどうかを照会する。 |
ConvertTimeFormat | 1 つのタイム フォーマットから別のタイム フォーマットに変換する。 |
SetPositions | 現在の位置と停止位置を設定する。 |
GetPositions | 現在の位置と停止位置を取得する。 |
GetAvailable | シークが有効であるタイムの範囲を取得する。 |
SetRate | 再生レートを設定する。 |
GetRate | 再生レートを取得する。 |
GetPreroll | プリロール タイムを取得する。 |
ストリームの時間幅。デフォルトでは、この値は m_rtStop メンバ変数の値に設定される。
構文
CRefTime m_rtDuration;
開始タイム。デフォルトでは、この値はゼロに設定される。
構文
CRefTime m_rtStart;
終了タイム。デフォルトでは、この値は非常に大きな数値に設定される。派生クラスは、コンストラクタにおいて、またはフィルタが初期化されたときに、この値をリセットできる。
構文
CRefTime m_rtStop;
再生レート。デフォルトでは、この値は 1.0 に設定される。
構文
double m_dRateSeeking;
シーク能力。
構文
DWORD m_dwSeekingCaps;
注意
デフォルトでは、この値は次のフラグのビットごとの組み合わせに設定される。
- AM_SEEKING_CanSeekForwards
- AM_SEEKING_CanSeekBackwards
- AM_SEEKING_CanSeekAbsolute
- AM_SEEKING_CanGetStopPos
- AM_SEEKING_CanGetDuration
フィルタが異なる能力の集まりをサポートしている場合、この値をオーバーライドする必要がある。
ロックのためのクリティカル セクション オブジェクトへのポインタ。
構文
CCritSec *m_pLock;
再生レートが変更されたときに呼び出される。
構文
virtual HRESULT ChangeRate(void) PURE;
戻り値
HRESULT 値を返す。
注意
SetRate メソッドは、このクラスを呼び出す。このクラスは、派生クラスが実装しなければならない。SetRate メソッドは、m_dRateSeeking メンバ変数を更新するが、新しい値を確認しない。レート 0 は、常に拒否される。ゼロ以下のレートは、逆再生を示す。ほとんどのフィルタは、負のレートをサポートしていない。
次の例は、可能な実装を示している。
HRESULT CMyStream::ChangeRate( ) { { CAutoLock cAutoLockSeeking(CSourceSeeking::m_pLock); if( m_dRateSeeking <= 0 ) { m_dRateSeeking = 1.0; // 妥当な値にリセットする。 return E_FAIL; } } UpdateFromSeek(); return S_OK; }
開始位置が変更されたときに呼び出される。
構文
virtual HRESULT ChangeStart(void) PURE;
戻り値
HRESULT 値を返す。
注意
SetPositions メソッドは、開始位置が変更された場合にこのメソッドを呼び出す。これは、純粋仮想メソッドであり、派生クラスはこのメソッドを実装しなければならない。シーク処理後は、タイム スタンプはゼロからもう一度開始する必要がある。また、メディア タイムは、新しい開始タイムを反映する必要がある。次の例は、可能な実装を示している。
HRESULT CMyStream::ChangeStart( ) { m_rtSampleTime = 0; // タイム スタンプをリセットする。 m_rtMediaTime = m_rtStart; // メディア タイムをリセットする。 UpdateFromSeek(); return S_OK; }
停止位置が変更されたときに呼び出される。
構文
virtual HRESULT ChangeStop(void) PURE;
戻り値
HRESULT 値を返す。
注意
SetPositions メソッドは、停止位置が変更された場合にこのメソッドを呼び出す。これは純粋仮想メソッドであり、派生クラスはこのメソッドを実装しなければならない。次の例は、可能な実装を示している。
HRESULT CMyStream::ChangeStop( ) { UpdateFromSeek(); return S_OK; }
指定されたシーク能力があるかどうかをストリームに照会する。IMediaSeeking::CheckCapabilities メソッドを実装する。
構文
HRESULT CheckCapabilities( DWORD *pCapabilities );
パラメータ
- pCapabilities
- 1 つまたは複数の AM_SEEKING_SEEKING_CAPABILITIES 属性の、ビットごとの組み合わせへのポインタ。
戻り値
次の表に示す、いずれかの HRESULT 値を返す。
S_FALSE pCapabilities のすべての能力は存在しない。 S_OK pCapabilities のすべての能力が存在する。 E_POINTER NULL ポインタ引数。
注意
実装されているように、このメソッドは m_dwSeekingCaps メンバ変数に対する *pCapabilities の値をチェックする。しかし、IMediaSeeking::CheckCapabilities メソッドで説明しているように、このメソッドは *pCapabilities を m_dwSeekingCaps と等しく設定しない。また、指定された能力のいずれも存在しない場合、このメソッドは E_FAIL を返さない。次に示すのは、より完全な実装である。
DWORD dwCaps; HRESULT hr = GetCapabilities(&dwCaps); if (SUCCEEDED(hr)) { dwCaps &= *pCapabilities; hr = dwCaps ? ( dwCaps == *pCapabilities ? S_OK : S_FALSE ) : E_FAIL; *pCapabilities = dwCaps; } else *pCapabilities = 0; return hr;
1 つのフォーマットを別のフォーマットに変換する。IMediaSeeking::ConvertTimeFormat メソッドを実装する。
構文
HRESULT ConvertTimeFormat( LONGLONG *pTarget, const GUID *pTargetFormat, LONGLONG Source, const GUID *pSourceFormat );
パラメータ
- pTarget
- 変換されたタイムを受け取る変数へのポインタ。
- pTargetFormat
- 目的のフォーマットのタイム フォーマット GUID へのポインタ。NULL の場合は、現在のフォーマットが使用される。
- Source
- 変換されるタイム値。
- pSourceFormat
- 変換するフォーマットのタイム フォーマット GUID へのポインタ。NULL の場合は、現在のフォーマットが使われる。
戻り値
次の表に示す、いずれかの HRESULT 値を返す。
S_OK 成功。 E_INVALIDARG 無効な引数。 E_POINTER NULL ポインタ引数。
注意
基底クラスによってサポートされる唯一のタイム フォーマットは、TIME_FORMAT_MEDIA_TIME (100 ナノ秒単位) である。pTargetFormat と pSourceFormat の両方が TIME_FORMAT_MEDIA_TIME を指定する単純な場合をのぞいて、このメソッドは、E_INVALIDARG を返す。
コンストラクタ メソッド。
構文
CSourceSeeking( const TCHAR *pName, LPUNKNOWN pUnk, HRESULT *phr, CCritSec *pLock );
パラメータ
- pName
- オブジェクトの名前が含まれた文字列へのポインタ。詳細については、「CBaseObject」を参照すること。
- pUnk
- このオブジェクトの所有者へのポインタ。このオブジェクトが集成される場合、集成オブジェクトの IUnknown インターフェイスにポインタを渡す。それ以外の場合は、このパラメータに NULL を設定する。
- phr
- HRESULT 値へのポインタ。無視される。
- pLock
- このクラスによって使用される共有データを保護する、CCritSec オブジェクトへのポインタ。
シークが有効であるタイムの範囲を取得する。IMediaSeeking::GetAvailable メソッドを実装する。
構文
HRESULT GetAvailable( LONGLONG *pEarliest, LONGLONG *pLatest );
パラメータ
- pEarliest
- 有効なシークのため最も古いタイムを受け取る変数へのポインタ。この変数はゼロに設定される。
- pLatest
- 有効なシークのために最も新しいタイムを受け取る変数へのポインタ。この変数は、m_rtDuration メンバ変数の値に設定される。
戻り値
S_OK を返す。
ストリームのすべてのシーク能力を取得する。IMediaSeeking::GetCapabilities メソッドを実装する。
構文
HRESULT GetCapabilities( DWORD *pCapabilities );
パラメータ
- pCapabilities
- AM_SEEKING_SEEKING_CAPABILITIES フラグのビットごとの組み合わせを受け取る変数へのポインタ。
戻り値
次の表に示す、いずれかの HRESULT 値を返す。
S_OK 成功。 E_POINTER NULL ポインタ値。
注意
シーク能力は、m_dwSeekingCaps メンバ変数によって指定される。
ストリームの合計時間幅に対する、現在の位置を取得する。実装されていない。
構文
HRESULT GetCurrentPosition( LONGLONG *pCurrent );
パラメータ
- pCurrent
- 現在の位置を受け取る変数へのポインタ。現在のタイム フォーマット単位で示される。
戻り値
E_NOTIMPL を返す。
注意
通常、ソース フィルタはこのメソッドをサポートしていない。その代わり、レンダリング フィルタが CRendererPosPassThru クラスを使って現在の位置を報告する。
ストリームの時間幅を取得する。IMediaSeeking::GetDuration メソッドを実装する。
構文
HRESULT GetDuration( LONGLONG *pDuration );
パラメータ
- pDuration
- 時間幅を現在のタイム フォーマット単位で受け取る変数へのポインタ。
戻り値
次の表に示す、いずれかの HRESULT 値を返す。
S_OK 成功。 E_POINTER NULL ポインタ値。
注意
この時間幅は、m_rtDuration メンバ変数によって指定される。
現在の位置および停止位置を取得する。IMediaSeeking::GetPositions メソッドを実装する。
構文
HRESULT GetPositions( LONGLONG *pCurrent, LONGLONG *pStop );
パラメータ
- pCurrent
- 開始位置を受け取る変数へのポインタ。
- pStop
- 停止位置を受け取る変数へのポインタ。
戻り値
S_OK を返す。
注意
このメソッドは、pCurrent パラメータ用に m_rtStart メンバ変数の値を返す。この変数は、現在のストリーミング位置ではない最後のシーク タイムを表す。しかし、アプリケーションがフィルタ グラフ マネージャを使って IMediaSeeking::GetPositions を呼び出すと、通常この値はソース フィルタではなく、レンダリング フィルタから提供される。
プリロール タイムを取得する。IMediaSeeking::GetPreroll メソッドを実装する。
構文
HRESULT GetPreroll( LONGLONG *pPreroll );
パラメータ
- pPreroll
- プリロール タイムを受け取る変数へのポインタ。この値はゼロに設定される。
戻り値
次の表に示す、いずれかの値を HRESULT 値を返す。
S_OK 成功。 E_POINTER NULL ポインタ値。
再生レートを取得する。IMediaSeeking::GetRate メソッドを実装する。
構文
HRESULT GetRate( double *pdRate );
パラメータ
- pdRate
- 再生レートを受け取る変数へのポインタ。
戻り値
次の表に示す、いずれかの HRESULT 値を返す。
S_OK 成功。 E_POINTER NULL ポインタ値。
注意
再生レートは、m_dRateSeeking メンバ変数によって指定される。
ストリームの時間幅に対して、再生が停止するタイムを取得する。IMediaSeeking::GetStopPosition メソッドを実装する。
構文
HRESULT GetStopPosition( LONGLONG *pStop );
パラメータ
- pStop
- 終了タイムを現在のタイム フォーマット単位で受け取る変数へのポインタ。
戻り値
次の表に示す、いずれかの HRESULT 値を返す。
S_OK 成功。 E_POINTER NULL ポインタ値。
注意
終了タイムは、m_rtStop メンバ関数によって指定される。
現在のタイム フォーマットを取得する。IMediaSeeking::GetTimeFormat メソッドを実装する。
構文
HRESULT GetTimeFormat( const GUID *pFormat );
パラメータ
- pFormat
- タイム フォーマット GUID を受け取る変数へのポインタ。
戻り値
次の表に示す、いずれかの HRESULT 値を返す。
S_OK 成功。 E_POINTER NULL ポインタ値。
注意
基底クラスによってサポートされる唯一のタイム フォーマットは、TIME_FORMAT_MEDIA_TIME (100 ナノ秒単位) である。
特定のタイム フォーマットがサポートされているかどうかを判定する。IMediaSeeking::IsFormatSupported メソッドを実装する。
構文
HRESULT IsFormatSupported( const GUID *pFormat );
パラメータ
- pFormat
- タイム フォーマット GUID へのポインタ。
戻り値
次の表に示す、いずれかの HRESULT 値を返す。
S_FALSE フォーマットはサポートされていない。 S_OK フォーマットはサポートされている。 E_POINTER NULL ポインタ引数。
注意
基底クラスによってサポートされている唯一のタイム フォーマットは、TIME_FORMAT_MEDIA_TIME (100 ナノ秒) である。
特定のタイム フォーマットが現在使用されているフォーマットかどうかを判定する。
構文
HRESULT IsUsingTimeFormat( const GUID *pFormat );
パラメータ
- pFormat
- タイム フォーマット GUID へのポインタ。
戻り値
次の表に示す、いずれかの HRESULT 値を返す。
S_FALSE 指定されたフォーマットは、現在のフォーマットではない。 S_OK 指定されたフォーマットは、現在のフォーマットである。 E_POINTER NULL ポインタ引数。
注意
基底クラスによってサポートされている唯一のタイム フォーマットは、TIME_FORMAT_MEDIA_TIME (100 ナノ秒単位) である。
オブジェクトの優先タイム フォーマットを取得する。IMediaSeeking::QueryPreferredFormat メソッドを実装する。
構文
HRESULT QueryPreferredFormat( GUID *pFormat );
パラメータ
- pFormat
- タイム フォーマット GUID を受け取る変数へのポインタ。
戻り値
次の表に示す、いずれかの HRESULT 値を返す。
S_OK 成功。 E_POINTER NULL ポインタ値。
注意
基底クラスによってサポートされている唯一のタイム フォーマットは、TIME_FORMAT_MEDIA_TIME (100 ナノ秒単位) である。
現在の位置と停止位置を設定する。IMediaSeeking::SetPositions メソッドを実装する。
構文
HRESULT SetPositions( LONGLONG *pCurrent, DWORD CurrentFlags, LONGLONG *pStop, DWORD StopFlags );
パラメータ
- pCurrent
- 現在の位置を指定する変数へのポインタ。
- CurrentFlags
- フラグのビットごとの組み合わせ。「注意」を参照すること。
- pStop
- 終了タイムを現在のタイム フォーマットで指定する変数へのポインタ。
- StopFlags
- フラグのビットごとの組み合わせ。「注意」を参照すること。
戻り値
HRESULT 値を返す。次の可能な値がある。
S_OK 成功。 E_INVALIDARG 無効なフラグ。 E_POINTER NULL ポインタ引数。
注意
次のフラグがサポートされる。
- AM_SEEKING_NoPositioning
- AM_SEEKING_AbsolutePositioning
- AM_SEEKING_RelativePositioning
- AM_SEEKING_IncrementalPositioning (pStop のみ)
詳細については、「IMediaSeeking::SetPositions」を参照すること。
このメソッドは、m_rtStart メンバ変数および m_rtStop メンバ変数の値を更新し、純粋仮想メソッド ChangeStart および ChangeStop を呼び出す。
再生レートを設定する。IMediaSeeking::SetRate メソッドを実装する。
構文
HRESULT SetRate( double dRate );
パラメータ
- dRate
- 再生レート。
戻り値
HRESULT 値を返す。
注意
このメソッドは、m_dRateSeeking メンバ変数の値を更新し、純粋仮想メソッド ChangeRate を呼び出す。このメソッドは、dRate パラメータを確認しない。
タイム フォーマットを設定する。IMediaSeeking::SetTimeFormat メソッドを実装する。
構文
HRESULT SetTimeFormat( const GUID *pFormat );
パラメータ
- pFormat
- タイム フォーマット GUID へのポインタ。
戻り値
次の表に示す、いずれかの HRESULT 値を返す。
S_OK 成功。 E_INVALIDARG 指定されたフォーマットはサポートされていない。 E_POINTER NULL ポインタ引数。
注意
基底クラスによってサポートされている唯一のフォーマットは、TIME_FORMAT_MEDIA_TIME (100 ナノ秒単位) である。