Jump to content
  • Advertisement


This topic is now archived and is closed to further replies.


DirectSound Notification events

This topic is 5414 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

And churning right along with Direct Sound problems is the area of setting up notification events. I want to set up notification events in both the capture and playback buffers. The initial state of the events are unsignaled. Seems to work except for some reason after the record/send thread is created, the ''WaitForMultipleObjects()'' function immediately returns as if the playback event has been signaled. It happens only once. And the ->Play() DS method hasn''t even been called yet. Anyone know what one could do wrong such that the event would be signaled? Here is the setup of the playback buffer notifications: ================================================================dsTXbd.dwSize = sizeof(DSBUFFERDESC); dsTXbd.dwFlags = DSBCAPS_GLOBALFOCUS | DSBCAPS_CTRLPOSITIONNOTIFY; // Make large enough to hold one second temp = 1 + rxwave.nAvgBytesPerSec / bytestoread; dsTXbd.dwBufferBytes = bytestoread * temp; // ''temp'' reads dsTXbd.guid3DAlgorithm = GUID_NULL; dsTXbd.lpwfxFormat = &rxwave; // Create the DirectSound buffer if(FAILED(pdsTXOb->CreateSoundBuffer(&dsTXbd, &pdsTXSecBufOb, NULL))) { return(DS_CREATE_BUF_FAIL); } // Create Notification interface for the send buffer if(FAILED(hr = pdsTXSecBufOb->QueryInterface( IID_IDirectSoundNotify, (void **)&pdsNotifyOb))) { return(DS_QUERY_NOTIFY_FAIL); } // Create the notification points and Event object dsNotify = new DSBPOSITIONNOTIFY [temp]; // Allocate memory offset = bytestoread - 1; // Create event object unsignaled hevent[1] = CreateEvent(NULL, FALSE, FALSE, NULL); // Load the notify structure with positions for(index = 0; index < temp; index++) { (dsNotify + index)->dwOffset = offset; (dsNotify + index)->hEventNotify = hevent[1]; offset = offset + bytestoread; } if(FAILED(pdsNotifyOb->SetNotificationPositions(temp,dsNotify))) { delete dsNotify; dsNotify = NULL; hevent[1] = NULL; SAFE_RELEASE(pdsNotifyOb);// Release buffer notify object return(DS_NOTIFY_POS_FAIL); } delete dsNotify; dsNotify = NULL; SAFE_RELEASE(pdsNotifyOb);// Release buffer notify object ==================================================== That creates the notification events in the playback buffer. They should be unsignaled and something should happen only after the playback begins and the safepointer reaches ''bytetoread-1'' assuming a start at zero (which is the case). Now for the thread where the wait function is found. Note the thread is created after all of DirectSOund has been setup. All buffers have been created and are waiting to be used. ====================================================== event = WaitForMultipleObjects(2, hevent, FALSE, INFINITE); if(event == WAIT_OBJECT_0) { if(ReceiveSignal() != ALL_OKAY) // Read the data { break; } SplitStereoSignals(); // Separate the stereo data } else if(event == WAIT_OBJECT_0 + 1) { // SendData(); } ========================================================== The ''SendData()'' routine is commented out since it is signalled on thread creation and all the arrays in it wont be dynamically allocated until a user asks to send something. Why is it signalled? And only once? After that, it is signalled properly after the user requests it. (Of course, nothing but silence is sent since the send fucntion is killed right now!) Brian Reinhold

Share this post

Link to post
Share on other sites

  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!