EVT_ACX_STREAM_GET_PRESENTATION_POSITION コールバック関数 (acxstreams.h)
EvtAcxStreamGetPresentationPosition は、現在の位置が計算された時点の QPC 値と共に現在の位置を示すようにドライバーに指示します。
構文
EVT_ACX_STREAM_GET_PRESENTATION_POSITION EvtAcxStreamGetPresentationPosition;
NTSTATUS EvtAcxStreamGetPresentationPosition(
ACXSTREAM Stream,
PULONGLONG PositionInBlocks,
PULONGLONG QPCPosition
)
{...}
パラメーター
Stream
ACXSTREAM オブジェクトは、回線によって作成されたオーディオ ストリームを表します。 ストリームは、親回線の要素に基づいて作成された要素の一覧で構成されます。 詳細については、「 ACX - ACX オブジェクトの概要」を参照してください。
PositionInBlocks
ストリームの先頭から現在のデコード後の非圧縮位置へのブロック オフセットを指定します。 "ブロック" は、同じサンプル内のチャネルのグループを指します。 そのため、たとえば PCM ストリームでは、ブロックはフレームと同じです。 ただし、圧縮形式の場合、ブロックはフレーム内の 1 つのサンプルです。 つまり、フレーム内に 1152 個のサンプルがある一般的な MP3 ストリームの場合、1152 ブロックが存在します。
QPCPosition
オーディオ ドライバーがKSAUDIO_PRESENTATION_POSITION呼び出しに応答してプレゼンテーションの位置を読み取る時点でのパフォーマンス カウンターの値を指定します。 ドライバーは、プレゼンテーション位置のスナップショットが取得されたときに、KeQueryPerformanceCounter の呼び出しから読み取られた値を使用して、このフィールドに書き込みます。
戻り値
STATUS_SUCCESS
呼び出しが成功した場合は を返します。 それ以外の場合は、適切なエラー コードを返します。 詳細については、「 NTSTATUS 値の使用」を参照してください。
解説
例
使用例を次に示します。
//
// Init streaming callbacks.
//
ACX_RT_STREAM_CALLBACKS rtCallbacks;
ACX_RT_STREAM_CALLBACKS_INIT(&rtCallbacks);
rtCallbacks.EvtAcxStreamGetPresentationPosition = EvtStreamGetPresentationPosition;
status = AcxStreamInitAssignAcxRtStreamCallbacks(StreamInit, &rtCallbacks);
PAGED_CODE_SEG
NTSTATUS
EvtStreamGetPresentationPosition(
_In_ ACXSTREAM Stream,
_Out_ PULONGLONG PositionInBlocks,
_Out_ PULONGLONG QPCPosition
)
{
PSTREAM_CONTEXT ctx;
ULONG blockAlign;
LARGE_INTEGER qpc;
PAGED_CODE();
ctx = GetStreamContext(Stream);
blockAlign = AcxDataFormatGetBlockAlign(ctx->StreamFormat);
// Recalculate the stream position that is stored in ctx->StreamPosition
UpdateStreamPosition(Stream);
qpc = KeQueryPerformanceCounter(NULL);
*PositionInBlocks = ctx->StreamPosition / blockAlign;
*QPCPosition = qpc;
return STATUS_SUCCESS;
}
ACX の要件
最小 ACX バージョン: 1.0
ACX バージョンの詳細については、「 ACX バージョンの概要」を参照してください。
要件
要件 | 値 |
---|---|
Header | acxstreams.h |
IRQL | PASSIVE_LEVEL |