[wdmaudiodev] Re: Problem about GetMapping() / ReleaseMapping() in WavePCI

  • From: Ken Cooper <Ken.Cooper@xxxxxxxxxxxxx>
  • To: "wdmaudiodev@xxxxxxxxxxxxx" <wdmaudiodev@xxxxxxxxxxxxx>
  • Date: Fri, 17 Oct 2008 11:58:59 -0700

Yes, using WavePCI to write a virtual audio driver is a curious approach.  My 
experience has been that most virtual audio drivers are based on WaveCyc.


From: wdmaudiodev-bounce@xxxxxxxxxxxxx 
[mailto:wdmaudiodev-bounce@xxxxxxxxxxxxx] On Behalf Of Jeff Pages
Sent: Thursday, October 16, 2008 3:30 PM
To: wdmaudiodev@xxxxxxxxxxxxx
Subject: [wdmaudiodev] Re: Problem about GetMapping() / ReleaseMapping() in 


It probably would have helped if you'd said something about what you're trying 
to achieve, since your reference to a timer object sugests you are writing a 
virtual driver rather than one that actually interacts with hardware. Is that 
the case, and if so why are you using WavePCI?

WavePCI works fine if you use it the way it was intended, that is with hardware 
receiving the mappings, doing DMA transfers and then generating an interrupt 
which releases the processed mappings. If, as I suspect you're doing, you 
immediately release each mapping after you've received it, then the application 
side of the system will quickly empty or fill it (depending on whether it's 
render or capture) and make it available to you again through a call to 
MappingAvailable. So round and round it goes, and without something like 
hardware to take its time processing the mappings before releasing them, you 
will get what you're observing. The timing of the WavePCI model is essentially 
determined by how long the driver holds onto each mapping, not by calls to 

Try to think about what's going on behind the scenes. Typically the mappings 
come from the page table of either the buffer in kmixer or possibly the 
application's own buffer. Each time you release a mapping, it tells the 
application that it's free to be reused, and as soon as the application has 
done that, it gets handed back to the driver again. The only thing in that loop 
to set the pacing is the time the driver holds onto the mappings for, which on 
average should be the sample period multiplied by the number of samples in the 

I hope that helps.

----- Original Message -----
From: Abhay dey<mailto:abhay.gauranga.das@xxxxxxxxx>
To: wdmaudiodev@xxxxxxxxxxxxx<mailto:wdmaudiodev@xxxxxxxxxxxxx>
Sent: Thursday, October 16, 2008 6:12 PM
Subject: [wdmaudiodev] Re: Problem about GetMapping() / ReleaseMapping() in 

I also posted such mail few days back but there was no reply.
There is not a single person on this mailing list who has worked on WavePCI ????
Your suggestions would really really help us.
Waiting for your reply.

On Tue, Oct 14, 2008 at 4:30 PM, pritesh gajjar 
<gajjar.pritesh@xxxxxxxxx<mailto:gajjar.pritesh@xxxxxxxxx>> wrote:
Hello All,
              I have implemented WavePCI in my driver. My mapping calls of 
GetMapping () and ReleaseMapping () are working fine. Following are thing which 
I have done.

1. I created DmaChannel through  NewMasterDmaChannel(), this works fine gives 
DmaChannel object. Passed as out parameter to NewStream ().
2. Allocated tables through AllocateCommonBuffer() call.
3. Created a timer object , DPC object which calls DPC after every 
interval(e.g. 10ms) and wrote a DPC in which I am calling Notify() of PortCls.
4. Methods of  WavePCI interface are implemented one of them is Service () 
which is invoked after above Notfiy() call by PortCls.
5. This Service() gives call to ReleaseMapping()/GetMapping() methods saves 
their out parameters in a table as ac'97 does.

   This is implemented as per MSDN documentation. Now the Driver runs 
continuously and consumes so many CPU cycles, the system slows down. But if I 
only obtain possible mappings in first GetMapping () call that is no 
MappingAvailable () then it runs smoothly. But still I do not get any audio 
only noise is produced. And one more thing I do get some value in VirtAddr 
pointer of GetMapping () .
    I also tried with common table between Capture / Renderer streams, but that 
didn't help. With IDmaChannel channel implementation also I tried, and passed 
casted stream object through Newstream(), but that also didn't helped.

   Is there something else also that in WavePCI it needs to be implemented. If 
anyone has any suggestion about then please reply ?

Thanks and regards

Other related posts: