EVT_ACX_STREAM_SET_RENDER_PACKET fungsi panggilan balik (acxstreams.h)

Peristiwa EvtAcxStreamSetRenderPacket memberi tahu driver paket mana yang baru saja dirilis oleh klien.

Jika tidak ada gangguan, paket ini harus (CurrentRenderPacket + 1), di mana CurrentRenderPacket adalah paket tempat driver saat ini streaming. Driver harus terus meningkatkan CurrentRenderPacket karena paket dirender alih-alih mengubah CurrentRenderPacket agar sesuai dengan nilai ini. Properti akan menyertakan indeks paket (berbasis 0) dan, jika sesuai, bendera EOS dengan offset byte akhir aliran dalam paket saat ini.

Sintaks

EVT_ACX_STREAM_SET_RENDER_PACKET EvtAcxStreamSetRenderPacket;

NTSTATUS EvtAcxStreamSetRenderPacket(
  ACXSTREAM Stream,
  ULONG Packet,
  ULONG Flags,
  ULONG EosPacketLength
)
{...}

Parameter

Stream

Objek ACXSTREAM mewakili aliran audio yang dibuat oleh sirkuit. Untuk informasi selengkapnya, lihat ACX - Ringkasan Objek ACX.

Packet

Jumlah paket yang ditulis oleh OS ke buffer WaveRT. Bergantung pada nilai yang disediakan oleh driver ke AcxRtStreamNotifyPacketComplete, nomor Paket dapat melewati nilai.

Flags

Bendera dapat berupa 0 atau AcxStreamSetRenderPacketEndOfStream, yang menunjukkan Paket adalah paket terakhir dalam aliran.

EosPacketLength

Panjang paket EOS jika AcxStreamSetRenderPacketEndOfStream ditentukan dalam Bendera. Nol adalah nilai yang valid. Jika AcxStreamSetRenderPacketEndOfStream tidak ditentukan dalam Bendera, parameter ini harus diabaikan. EosPacketLength diukur dalam byte.

Menampilkan nilai

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

STATUS_DATA_LATE_ERROR – Driver mengembalikan kesalahan ini jika OS meneruskan nomor paket yang telah ditransfer atau saat ini sedang ditransfer. Dalam hal ini, kondisi kesalahan telah terjadi. Driver dapat secara opsional menggunakan beberapa data dari paket atau terus memutar data yang sebelumnya ditulis ke nomor paket ini.

STATUS_DATA_OVERRUN – Driver mengembalikan kesalahan ini jika OS melewati nomor paket yang lebih tinggi dari yang dapat disimpan di buffer WaveRT. Dalam hal ini, kondisi kesalahan telah terjadi. Driver dapat secara opsional mengabaikan data dalam paket.

STATUS_INVALID_DEVICE_STATE – Driver mengembalikan kesalahan ini jika OS memanggil rutinitas ini setelah sebelumnya mengatur bendera AcxStreamSetRenderPacketEndOfStream.

STATUS_INVALID_PARAMETER – Driver mengembalikan kesalahan ini jika menemukan parameter lain yang tidak valid, selain dari kasus tertentu untuk status kesalahan lainnya. Ini termasuk nilai Bendera apa pun yang tidak secara khusus ditentukan di atas.

Keterangan

Setelah OS memanggil rutinitas ini, driver dapat secara opsional menggunakan informasi yang disediakan untuk mengoptimalkan transfer perangkat keras. Misalnya, driver mungkin mengoptimalkan transfer DMA, atau perangkat keras program untuk menghentikan transfer di akhir paket yang ditentukan jika OS tidak memanggil rutinitas ini lagi untuk memberi tahu driver paket lain. Ini dapat mengurangi efek underflow yang dapat didengar, misalnya memperkenalkan celah yang dapat didengar daripada mengulangi buffer melingkar. Namun driver masih berkewajiban untuk meningkatkan penghitung paket internal dan peristiwa pemberitahuan sinyal pada tingkat real time nominal.

Bergantung pada kemampuan perangkat keras, jika bendera AcxStreamSetRenderPacketEndOfStream ditentukan, driver dapat mengisi sebagian buffer WaveRT yang mengikuti paket EOS jika perangkat keras mentransfer data di luar posisi EOS.

Klien dimulai dengan melakukan pra-rolling buffer. Ketika klien memanggil ReleaseBuffer, ini akan diterjemahkan ke panggilan di AudioKSE yang akan memanggil ke lapisan ACX, yang akan memanggil EvtAcxStreamSetRenderPacket pada ACXSTREAM aktif. Properti akan menyertakan indeks paket (berbasis 0) dan, jika sesuai, bendera EOS dengan offset byte akhir aliran dalam paket saat ini.   

Contoh

Contoh penggunaan ditunjukkan di bawah ini.

    //
    // Init RT streaming callbacks.
    //
    ACX_RT_STREAM_CALLBACKS rtCallbacks;
    ACX_RT_STREAM_CALLBACKS_INIT(&rtCallbacks);

    rtCallbacks.EvtAcxStreamSetRenderPacket = EvtStreamSetRenderPacket;

    status = AcxStreamInitAssignAcxRtStreamCallbacks(StreamInit, &rtCallbacks);
#pragma code_seg("PAGE")
NTSTATUS
EvtStreamSetRenderPacket(
    _In_ ACXSTREAM Stream,
    _In_ ULONG     Packet,
    _In_ ULONG     Flags,
    _In_ ULONG     EosPacketLength
    )
{
    PSTREAM_CONTEXT ctx;
    NTSTATUS        status = STATUS_SUCCESS;

    PAGED_CODE();

    ctx = GetStreamContext(Stream);

    currentPacket = (ULONG)InterlockedCompareExchange((LONG*)&ctx->m_CurrentPacket, -1, -1);

    if (Packet <= currentPacket)
    {
        status = STATUS_DATA_LATE_ERROR;
    }
    else if (Packet > currentPacket + 1)
    {
        status = STATUS_DATA_OVERRUN;
    }

    return status;
}

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