Microsoft DirectX 8.0

CSourceStream クラス

CSourceStream クラスの階層

CSource フィルタ クラスの出力ピン。

宣言: Source.h

このクラスの使用の詳細については、「CSource」を参照すること。このクラスは、ピンからのストリーミング データにワーカー スレッドを提供する CAMThread クラスを継承する。CSourceStream クラスは、次のヘルパー メソッドを実装して、スレッドに要求を送る。

スレッドへの最初の要求は、Init でなくてはならない。Exit 要求によって、スレッドが終了される。実際には、これらのいずれのメソッドも直接呼び出す必要はない。これは、ピンの Active メソッドと Inactive メソッドが、必要に応じてメソッドを呼び出すためである。

このクラスは、次に示すいくつかの "ハンドラ" メソッドも提供する。

これらのメソッドは、基底クラスでは何も処理を行わないが、派生クラスはそれらにオーバーライドできる。

プロテクト メンバ変数
m_pFilterこのピンが含まれているフィルタへのポインタ。
プロテクト メソッド
OnThreadCreateストリーミング スレッドが初期化されたときに呼び出される。仮想。
OnThreadDestroyストリーミング スレッドがまもなく終了するときに呼び出される。仮想。
OnThreadStartPlayDoBufferProcessingLoop メソッドの処理が開始されたときに呼び出される。仮想。
Activeフィルタがアクティブになったことをピンに通知する。
Inactiveフィルタがアクティブでなくなったことをピンに通知する。
GetRequest次のスレッド要求を待つ。
CheckRequestブロックせずに、スレッド要求があるかどうかを調べる。
ThreadProcスレッド プロシージャ。仮想。
DoBufferProcessingLoopメディア サンプルを生成し、ダウンストリームの入力ピンに提供する。仮想。
CheckMediaTypeピンが特定のメディア タイプを受け入れることができるかどうかを判定する。仮想。
GetMediaType優先メディア タイプを取得する。仮想。
Public メソッド
CSourceStreamコンストラクタ メソッド。
~CSourceStreamデストラクタ メソッド。仮想。
Initストリーミング スレッドを初期化する。
Exitストリーミングに終了するように通知する。
Runストリーミングに実行するように通知する。
Pauseストリーミング スレッドにアクティブになるように通知する。
Stopストリーミング スレッドに停止するように通知する。
純粋仮想メソッド
FillBufferメディア タイプにデータを埋める。
IPin メソッド
QueryId ピンの識別子を取得する。

CSourceStream.m_pFilter

CSourceStream クラス

このピンが含まれているフィルタへのポインタ。

構文

CSource *m_pFilter;

CSourceStream::Active

CSourceStream クラス

フィルタがアクティブになったことをピンに通知する。CBasePin::Active メソッドをオーバーライドする。ピンが接続されると、このメソッドはストリーミング スレッドを開始する。

構文

HRESULT Active(void);

戻り値

HRESULT 値を返す。 以下の表に示されるいずれかの値。

S_FALSEピンは既にアクティブである。
S_OK成功。
E_FAIL スレッドを開始できなかった。

CSourceStream::CheckMediaType

CSourceStream クラス

ピンが特定のメディア タイプを受け入れることができるかどうかを判定する。純粋仮想メソッド CBasePin::CheckMediaType を実装する。

構文

virtual HRESULT CheckMediaType(
    CMediaType *pMediaType
);

パラメータ

pMediaType
照会されたメディア タイプが含まれた CMediaType オブジェクトへのポインタ。

戻り値

次の表に示されるいずれかの HRESULT 値を返す。

S_OKピンは、このメディア タイプをサポートしている。
E_FAILピンは、このメディア タイプをサポートしていない。

注意

デフォルトでは、このピンは 1 つのメディア タイプをサポートする。このメソッドは、1 つのパラメータ版の GetMediaType メソッドを呼び出して、サポートされているタイプを取得し、照会されたタイプと比較する。ピンが 2 つ以上のメディア タイプをサポートしている場合は、このメソッドをオーバーライドする。

CSourceStream::CheckRequest

CSourceStream クラス

ブロックせずに、スレッド要求があるかどうかを調べる。

構文

BOOL CheckRequest(
    Command *pCom
);

パラメータ

pCom
最後の呼び出しで CAMThread::CallWorker メソッドに渡された値を受け取る変数へのポインタ。

戻り値

保留中の要求がある場合は TRUE を返し、ない場合は FALSE を返す。

注意

このメソッドは、CAMThread::CheckRequest メソッドをオーバーライドし、タイプ チェックを実行する。CSourceStream クラスは、pCom パラメータ用の次の列挙型を定義する。

enum Command {CMD_INIT, CMD_PAUSE, CMD_RUN, CMD_STOP, CMD_EXIT};

CSourceStream::CSourceStream

CSourceStream クラス

コンストラクタ メソッド。

構文

CSourceStream(
    TCHAR *pObjectName,
    HRESULT *phr,
    CSource *pms,
    LPCWSTR pName
);

パラメータ

pObjectName
ピンのデバッグ名が含まれた文字列へのポインタ。
phr
メソッドの成功または失敗を示す、HRESULT 値を受け取る変数へのポインタ。値を S_OK に初期化してから、オブジェクトを作成する。この値は、エラーが発生したときだけ変更される。
pms
このピンを作成した CSource フィルタへのポインタ。
pName
ピンの名前が含まれた文字列へのポインタ。

注意

pObjectName パラメータに指定された文字列は、デバッグの目的だけに使用される。詳細については、「CBaseObject」を参照すること。

pName パラメータに指定された文字列は、IPin::QueryPinInfo メソッドによって返される名前である。この名前は、QueryId メソッドが返すピン識別には使用されない。その代わり、QueryId はピン番号に基づいてピン識別子を計算する。ピン識別子は、グラフの永続性をサポートしている。詳細については、「IPin::QueryId」を参照すること。

CSourceStream::~CSourceStream

CSourceStream クラス

デストラクタ メソッド。

構文

~CSourceStream(void);

CSourceStream::DoBufferProcessingLoop

CSourceStream クラス

メディア タイプを生成し、ダウンストリームの入力ピンに提供する。

構文

virtual HRESULT DoBufferProcessingLoop(void);

戻り値

HRESULT 値を返す。 以下の表に示されるいずれかの値。

S_FALSEスレッドは停止要求を受け取った。
S_OKストリームが終了したか、またはダウンストリーム フィルタはサンプルを受け入れていない。

注意

このメソッドは、データを処理するメイン ループを実装し、ダウンストリームにそのループを提供する。メソッドは、毎回ループを通じてアロケータから空のメディア サンプルを取得し、このサンプルを FillBuffer メソッドに渡す。FillBuffer メソッド (派生クラスが実装しなければならない) は、次にメディア データを生成し、サンプル バッファにそのデータを移動する。

次のいずれかの場合に、ループは終了する。

DoBufferProcessingLoop メソッドは、エンドオブストリーム通知を処理する。エラーが発生すると、このメソッドは EC_ERRORABORT イベントをフィルタ グラフ マネージャに送る。

CSourceStream::Exit

CSourceStream クラス

ストリーミング スレッドに終了するように通知する。

構文

HRESULT Exit(void);

戻り値

S_OK または E_UNEXPECTED を返す。

注意

Inactive メソッドは、このメソッドを呼び出す。

CSourceStream::FillBuffer

CSourceStream クラス

メディア サンプルにデータを埋める。

構文

virtual HRESULT FillBuffer(
    IMediaSample *pSample
) PURE;

パラメータ

pSample
サンプルの IMediaSample インターフェイスへのポインタ。

戻り値

HRESULT 値を返す。 以下の表に示されるいずれかの値。

S_FALSEストリームの終了
S_OK成功

注意

派生クラスは、このメソッドを実装しなければならない。

このメソッドに提供されたメディア サンプルには、タイム スタンプがない。派生クラスは、IMediaSample::SetTime メソッドを呼び出し、タイム スタンプを設定する必要がある。メディア サンプルに対して適切な場合、派生クラスは IMediaSample::SetMediaTime メソッドを呼び出して、メディア タイムも設定する必要がある。詳細については、「DirectShow のタイムとクロック」を参照すること。

CSourceStream::GetMediaType

CSourceStream クラス

優先メディア タイプを取得する。

構文

virtual HRESULT GetMediaType(
    int iPosition,
    CMediaType *pMediaType
);

virtual HRESULT GetMediaType(
    CMediaType *pMediaType
);

パラメータ

iPosition
ゼロ ベースのインデックス値。
pMediaType
メディア タイプを受け取る CMediaType オブジェクトへのポインタ。

戻り値

次の表に示されるいずれかの HRESULT 値を返す。
S_OK成功。
VFW_S_NO_MORE_ITEMSインデックスが範囲外である。
E_INVALIDARGインデックスがゼロ以下である。
E_UNEXPECTED予期しないエラー。

注意

このメソッドには、2 つの版がある。1 つの版は CBasePin::GetMediaType メソッドにオーバーライドし、インデックス値をパラメータとしてとる。もう 1 つの版は 1 つのメディア タイプを取得するように設計されているので、インデックス パラメータはない。

1 つのパラメータ版のメソッドは、E_UNEXPECTED を返す。2 つのパラメータ版のメソッドは、iPosition パラメータが 1 であることを確認し、1 つのパラメータ版のメソッドを呼び出す。ピンがサポートするメディア タイプ数に応じて、これらのいずれかのメソッドをオーバーライドしなければならない。

CSourceStream::GetRequest

CSourceStream クラス

次のスレッド要求を待つ。

構文

Command GetRequest(void);

戻り値

次のスレッド要求を返す。

注意

このメソッドは、CAMThread::GetRequest メソッドをオーバーライドする。戻り値は、次の列挙型にキャストされる。

enum Command {CMD_INIT, CMD_PAUSE, CMD_RUN, CMD_STOP, CMD_EXIT};

CSourceStream::Inactive

CSourceStream クラス

フィルタがアクティブではなくなったことをピンに通知し、CBasePin::Inactive メソッドをオーバーライドする。ストリーミング スレッドがアクティブな場合、このメソッドはストリーミング スレッドを停止し、スレッドが終了するのを待つ。

構文

HRESULT Inactive(void);

戻り値

S_OK またはほかの HRESULT 値を返す。

CSourceStream::Init

CSourceStream クラス

ストリーミング スレッドを初期化する。

構文

HRESULT Init(void);

戻り値

S_OK またはほかの HRESULT 値を返す。

注意

このメソッドは、ThreadProc メソッドに送られる最初のスレッド要求でなくてはならない。Active メソッドは、このメソッドを呼び出す。

CSourceStream::OnThreadCreate

CSourceStream クラス

ストリーミング スレッドが初期化されたときに呼び出される。

構文

virtual HRESULT OnThreadCreate(void);

戻り値

S_OK を返す。

注意

スレッド プロシージャ ThreadProc は、最初に Init 要求を受け取ったときにこのメソッドを呼び出す。このメソッドは、基底クラスでは何も処理を行わない。派生クラスは、このメソッドをオーバーライドし、スレッドを初期化できる。派生クラスがエラー コードを返した場合、スレッドでエラーが発生し、スレッドは終了される。

CSourceStream::OnThreadDestroy

CSourceStream クラス

ストリーミング スレッドがまもなく終了するときに呼び出される。

構文

virtual HRESULT OnThreadDestroy(void);

戻り値

S_OK を返す。

注意

スレッド プロシージャ ThreadProc は、このメソッドを呼び出してから終了する。このメソッドは、基底クラスでは何も処理を行わなず、派生クラスがオーバーライドするために利用可能となる。派生クラスがエラー コードを返すと、スレッドでエラー が発生し、スレッドは終了される。

CSourceStream::OnThreadStartPlay

CSourceStream クラス

DoBufferProcessingLoop メソッドの処理が開始されたときに呼び出される。

構文

virtual HRESULT OnThreadStartPlay(void);

戻り値

S_OK を返す。

注意

このメソッドは、基底クラスでは何も処理を行わず、派生クラスがオーバーライドするために利用可能となる。

CSourceStream::Pause

CSourceStream クラス

ストリーミング スレッドにアクティブになるように通知する。

構文

HRESULT Pause(void);

戻り値

S_OK または E_UNEXPECTED を返す。

注意

Active メソッドは、このメソッドを呼び出す。ThreadProc メソッドがこの要求を受け取ると、DoBufferProcessingLoop メソッドを呼び出す。

CSourceStream::QueryId

CSourceStream クラス

ピンの識別子を取得する。

構文

HRESULT QueryId(
    LPWSTR *Id
);

パラメータ

Id
ピン ID が入る文字列を受け取る変数へのポインタ。

戻り値

HRESULT 値を返す。以下の表に示されるいずれかの値。

S_OK成功。
E_OUTOFMEMORYメモリ不足。
E_POINTERNULL ポインタ引数。
VFW_E_NOT_FOUNDピンはフィルタで見つからなかった。

注意

このメソッドは、IPin::QueryId メソッドを実装する。識別子文字列を構築するため、ピンはそれ自身をパラメータとして、CSource::FindPinNumber メソッドを呼び出す。FindPinNumber メソッドは、ゼロからインデックス設定されるピン番号を返す。QueryId は、1 つずつ戻り値をインクリメントし、結果を文字列に変換する。たとえば、最初のピンは "1" となり、2 番目のピンは "2"になり、以降も同様となる。

このメソッドが VFW_E_NOT_FOUND を返す場合は、フィルタのピン配列が無効であることを示す。この原因は、フィルタのバグである可能性が高い。

CSourceStream::Run

CSourceStream クラス

ストリーミング スレッドに実行するように通知する。

構文

HRESULT Run(void);

戻り値

S_OK または E_UNEXPECTED を返す。

注意

基底クラスでは、このメソッドは Pause 要求と同じ効果があり、使用されない。

CSourceStream::Stop

CSourceStream クラス

ストリーミング スレッドに停止するように通知する。

構文

HRESULT Stop(void);

戻り値

S_OK または E_UNEXPECTED を返す。

注意

Inactive メソッドは、このメソッドを呼び出す。

CSourceStream::ThreadProc

CSourceStream クラス

スレッド プロシージャ。純粋仮想メソッド CAMThread::ThreadProc を実装する。

構文

virtual DWORD ThreadProc(void);

戻り値

スレッドが正常に完了された場合は 0 を返し、それ以外の場合は 1 を返す。戻り値が 1 の場合、スレッドのリソースは割り当てられたままになっている可能性がある。

注意

このメソッドは、CAMThread::GetRequest メソッドを呼び出して、スレッド要求を無限に待つ。 Run または Pause 要求を受け取ると、DoBufferProcessingLoop メソッドを呼び出す。 DoBufferProcessingLoop メソッドは、Stop 要求を受け取るまでデータをプッシュする。スレッド プロシージャは、Exit 要求を受け取ったときに終了する。