[wdmaudiodev] WaveRT event driven Capture

  • From: "Markus Bollinger" <bollinger@xxxxxxxxxxxx>
  • To: <wdmaudiodev@xxxxxxxxxxxxx>
  • Date: Tue, 17 Mar 2009 09:16:01 +0100

Ok, I try it again with a shorter question:

In WaveRT event driven mode, what value does the Audio Engine expect when 
reading the PositionRegister after the drivers KeSetEvent(NotificationEvent) ??
Any Microsoft advice ??

Regards,
Markus.


 

> -----Message d'origine-----
> De : wdmaudiodev-bounce@xxxxxxxxxxxxx 
> [mailto:wdmaudiodev-bounce@xxxxxxxxxxxxx] De la part de 
> Markus Bollinger
> Envoyé : vendredi 13 mars 2009 18:28
> À : wdmaudiodev@xxxxxxxxxxxxx
> Objet : [wdmaudiodev] WaveRT event driven Capture in exclusive mode
> 
> Hello,
> 
> I try to implement the Event driven mode in my WaveRT driver for a
> Playback and Capture device.
> 
> Playback works as expected, but with capture I found some strange
> behaviour :
> 
> When my driver notifies the first time the capture event after Start
> (the DMA has passed the middle of the circular buffer),
> 
> A Wasapi application then gets out of its WaitFor***Object 
> and tries to
> do : pCaptureClient->GetBuffer(&pDataIn, &packetLength, &flags,
> &position, NULL); and gets as result AUDCLNT_S_BUFFER_EMPTY 
> which is NOT
> as expected !!!
> 
> On the following notifications, GetBuffer() works, but the application
> is getting back the wrong half of the circular (pin-pong) buffer !!!
> On the second notification it gets the first buffer back that 
> is at this
> moment newly getting filled by the DMA !!!
> 
> To avoid this Error, I tried following:
> 
> - returning error in CMiniportWaveRTStream::GetPositionRegister()
> - adding offset to Position->PlayOffset=Position->WriteOffset in the
> CMiniportWaveRTStream::GetPosition() method
> 
> Result : When the position returned by GetPosition() is 512 bytes (64
> stereo samples offset) or more behind the middle of the 
> circular buffer,
> everything gets working : the app is getting back the first 
> half of the
> circular buffer after the first notification.
> 
> YES, I know there is a function called
> CMiniportWaveRTStream::GetHWLatency(), where the hwLatency->FifoSize
> should indicate some offset,
> But all values that I put there don't change anything.
> 
> In http://msdn.microsoft.com/en-us/library/ms678736.aspx I found that
> exclusive-mode event-driven capture is broken on Vista RTM, but it
> should be fixed in SP1, not ?
> 
> Who knows what goes wrong ???
> 
> 
> Markus.
> 
> P.S. my adapter can be configured with DMA size = 8,16 or 32 
> samples, so
> it would not be nice to abandon the GetPositionRegister() 
> method and add
> some offset that increases the latency !!!
> ******************
> 
> WDMAUDIODEV addresses:
> Post message: mailto:wdmaudiodev@xxxxxxxxxxxxx
> Subscribe:    
> mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=subscribe
> Unsubscribe:  
> mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=unsubscribe
> Moderator:    mailto:wdmaudiodev-moderators@xxxxxxxxxxxxx
> 
> URL to WDMAUDIODEV page:
> http://www.wdmaudiodev.com/
> 
> 
******************

WDMAUDIODEV addresses:
Post message: mailto:wdmaudiodev@xxxxxxxxxxxxx
Subscribe:    mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=subscribe
Unsubscribe:  mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=unsubscribe
Moderator:    mailto:wdmaudiodev-moderators@xxxxxxxxxxxxx

URL to WDMAUDIODEV page:
http://www.wdmaudiodev.com/

Other related posts:

  • » [wdmaudiodev] WaveRT event driven Capture - Markus Bollinger