EVT_ACX_STREAM_GET_CAPTURE_PACKET fungsi panggilan balik (acxstreams.h)

EvtAcxStreamGetCapturePacket memberi tahu driver untuk menunjukkan paket mana (berbasis 0) yang benar-benar diisi baru-baru ini, termasuk nilai QPC pada saat driver mulai mengisi paket.

Sintaks

EVT_ACX_STREAM_GET_CAPTURE_PACKET EvtAcxStreamGetCapturePacket;

NTSTATUS EvtAcxStreamGetCapturePacket(
  ACXSTREAM Stream,
  PULONG LastCapturePacket,
  PULONGLONG QPCPacketStart,
  PBOOLEAN MoreData
)
{...}

Parameter

Stream

Objek ACXSTREAM mewakili aliran audio yang dibuat oleh sirkuit. Aliran terdiri dari daftar elemen yang dibuat berdasarkan elemen sirkuit induk. Untuk informasi selengkapnya, lihat ACX - Ringkasan Objek ACX.

LastCapturePacket

Nilai yang menunjukkan posisi paket terakhir yang ditangkap. Ini adalah indeks berbasis 0 yang menunjukkan berapa banyak paket lengkap data yang telah diambil.

QPCPacketStart

Nilai yang menunjukkan waktu mulai paket terakhir yang diambil.

MoreData

Mengembalikan TRUE jika ada lebih banyak data yang siap segera. OS dapat secara opsional segera memanggil rutinitas ini lagi setelah memproses paket untuk mendapatkan informasi paket berikutnya. Jika driver mengembalikan FALSE, maka pengambilan beroperasi secara real time.

Menampilkan nilai

Mengembalikan STATUS_SUCCESS jika panggilan berhasil. Jika tidak, ia mengembalikan kode kesalahan yang sesuai. Untuk informasi selengkapnya, lihat Menggunakan Nilai NTSTATUS.

Keterangan

Sebelum membaca data audio yang diambil dari buffer audio, OS memanggil rutinitas ini untuk mendapatkan informasi tentang data yang tersedia.

Nomor paket mengidentifikasi paket dalam aliran. Ini direset ke nol ketika EVT_ACX_STREAM_RELEASEHARDWARE telah dipanggil untuk aliran. Angka tersebut maju dengan setiap buffer yang ditangkap. Dari nomor paket OS dapat memperoleh lokasi paket dalam buffer audio dan juga dapat memperoleh posisi aliran paket relatif terhadap awal streaming.

OS dapat memanggil rutinitas ini kapan saja. Dalam operasi normal, OS memanggil rutinitas ini setelah driver memanggil AcxRtStreamNotifyPacketComplete atau setelah panggilan sebelumnya mengembalikan true untuk MoreData. Ketika OS memanggil rutinitas ini, driver dapat berasumsi bahwa OS telah selesai membaca semua paket sebelumnya. Jika perangkat keras telah mengambil data yang cukup, driver dapat segera meledakkan paket lengkap berikutnya ke buffer audio dan memanggil AcxRtStreamNotifyPacketComplete lagi. Dalam kasus penangkapan luapan (ketika OS tidak membaca data dengan cukup cepat) driver audio dapat menjatuhkan atau menimpa beberapa data audio. Driver audio menghilangkan atau menimpa data terlama terlebih dahulu. Driver audio dapat terus memajukan penghitung paket internalnya meskipun OS mungkin belum membaca data.

Contoh

Contoh penggunaan ditunjukkan di bawah ini.

#pragma code_seg("PAGE")
NTSTATUS
CodecC_EvtStreamGetCapturePacket(
    _In_ ACXSTREAM          Stream,
    _Out_ ULONG           * LastCapturePacket,
    _Out_ ULONGLONG       * QPCPacketStart,
    _Out_ BOOLEAN         * MoreData
)
{
    PCODEC_STREAM_CONTEXT ctx;
    CCaptureStreamEngine* streamEngine = nullptr;
    ULONG currentPacket;
    LONGLONG qpcPacketStart;

    PAGED_CODE();

    ctx = GetCodecStreamContext(Stream);
    // Retrieve the current packet that is being written to by the audio hardware
    currentPacket = (ULONG)InterlockedCompareExchange((LONG*)&ctx->CurrentPacket, -1, -1);
    qpcPacketStart = InterlockedCompareExchange64(&ctx->LastPacketStart.QuadPart, -1, -1);

    // The Last capture packet is the packet before the current packet.
    *LastCapturePacket = currentPacket - 1;
    *QPCPacketStart = (ULONGLONG)qpcPacketStart;
    *MoreData = FALSE;

    return STATUS_SUCCESS;
}

Persyaratan ACX

Versi ACX minimum: 1.0

Untuk informasi selengkapnya tentang versi ACX, lihat Gambaran umum versi ACX.

Persyaratan

Persyaratan Nilai
Header acxstreams.h
IRQL PASSIVE_LEVEL

Lihat juga