Hi,
I was a bit confused by the function of the
IMiniportWaveRtOutputStream::SetWritePacket and
IMiniportWaveRtInputStream::SetReadPacket methods, and the KEVENT passed
into RegisterNotificationEvent.
If I understand it correctly, AllocateBufferWithNotification gets called
with notificationCount=2, and a buffer large enough for two 'packets'.
Packets seem to be sized to contain about 1/100 sec worth of audio
frames. RegisterNotificationEvent gets called with a single (in my case)
event.
In the RENDER case, SetWritePacket(n, ...) is called when the OS has
finished copying packet <n> into whichever half of the buffer. I have a
timer function that monitors this, and transfers the packet to hardware
(let's say). To let the OS know that packet <n> has been processed
(i.e., that packet in the buffer is available), I call
KeSetEvent(pNotificationEvent, 0, FALSE).
So this part isn't clear to me:
...kernel event that must be notified as DMA progresses. Depending
on the notification count parameter used with
AllocateBufferWithNotification
<https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/hdaudio/nc-hdaudio-pallocate_dma_buffer_with_notification>,
the registered event is signaled __one or two times__ for every time
that the DMA passes through the audio buffer.
I expected there to be two calls to RegisterNotificationEvent, and thus
two KEVENT objects at any given time (one for each packet in the
buffer). Instead, I only see one getting added. The doc quote above
seems to suggest that a single event has to be set TWICE (or maybe set
once, then the OS clears, then set again)? I've looked at the KEVENT
struct and related APIs, but I'm still confused. Is this event supposed
to signify "Buffer Complete" or "Packet Complete"?
In the CAPTURE case, it looks like things are reversed. The OS calls
SetReadPacket to query the driver about which packet is available for
reading (transferring to client). RegisterNotificationEvent is getting
called, so I think the same (single) event is SET/CLEARED? by the OS to
signal ME that it has finished transferring data out of a packet, and
that packet is available for DMA again.
Thanks in advance for any and all help. :-)