Step 6: Handling the Capture Notifications

You receive capture notifications as events in the message loop, just as with playback notifications. Here is a sample loop:

BOOL Done = FALSE;
while (!Done)
{
    DWORD dwEvt = MsgWaitForMultipleObjects(
            NUMCAPTUREEVENTS,  // How many possible events
            rghEvent,          // Location of handles
            FALSE,             // Wait for all?
            INFINITE,          // How long to wait
            QS_ALLINPUT);      // Any message is an event
 
    dwEvt -= WAIT_OBJECT_0;
 
    // If the event was set by the buffer, there's input
    // to process. 
 
    if (dwEvt < NUMCAPTUREEVENTS) 
    {
        StreamToFile(); 
    }
 
    // If it's the last event, it's a message 
 
    else if (dwEvt == NUMCAPTUREEVENTS) 
    {         
        while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
        {
            if (msg.message == WM_QUIT) 
            {
                Done = TRUE;
            } 
            else
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
    }  // end message processing
} // while (!Done)
 

As already noted, if you are receiving notifications from both a capture buffer and a secondary (output) buffer, you need to distinguish between the two types of events by the index value in dwEvt. For example, events 0 and 1 might be playback notifications, and events 2 and 3 might be capture notifications.