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

  • From: "swapnil kamble" <swap.kamble@xxxxxxxxx>
  • To: wdmaudiodev@xxxxxxxxxxxxx
  • Date: Fri, 17 Oct 2008 20:29:10 +0530

Hi,
    Thanks for your replies. One more silly question. I am using fake DMA.
So Do we have to do explicit data copying from capture and render ? which is
not the property of WavePCI. What processing do we have to do actually in
case of fake DMA ?

Thanks.

On Fri, Oct 17, 2008 at 4:04 AM, Ken Cooper <Ken.Cooper@xxxxxxxxxxxxx>wrote:

>
>
> Though you may have already based on your comments, you should look at the
> AC97 sample in the WDK that uses WavePci.
>
>
>
> In general, you will get two different calls from portcls indicating that
> you should process your mappings.  The first is the Service() call.  This
> call is invoked by portcls in direct response to your Notify() call on the
> stream's ServiceGroup.  The Notify() call can be made from your ISR (or
> timer DPC) and results in queuing of a DPC.  That DPC simply calls Service()
> on your stream.  Within your Service() method you should first release any
> used mappings you have by walking your list and calling ReleaseMapping() for
> any mappings that have been completed.  You should then acquire available
> new mappings (there may not be any) with the GetMapping() call to portcls,
> sticking the new mappings in your table.
>
>
>
> The other call that you may receive from portcls is MappingAvailable().
> This method is called by portcls when a new streaming IRP arrives AND you
> have previously called GetMapping() and didn't receive a mapping (in other
> words, you had previously obtained all available mappings or starved).  The
> processing here is the same as in your Service() method.  First release used
> mappings by calling ReleaseMapping() on them.  Then acquire new mappings
> with GetMapping(), typically until you either fill your table or obtain all
> available mappings (which will result in you getting MappingAvailable() when
> the next IRP arrives).
>
>
>
> As for position reporting asked by another poster, you need to provide
> sample accurate position information when you are queried for position by
> portcls.  The comment in the WDK AC97 sample for the GetPosition() method
> says:
>
>
>
>
> /*****************************************************************************
>
>  * CMiniportWaveICHStream::GetPosition
>
>
>  *****************************************************************************
>
>  * Gets the stream position. This is a byte count of the current position
> of
>
>  * a stream running on a particular DMA engine.  We must return a sample
>
>  * accurate count or the WaveDrv32 wave drift tests (35.2 & 36.2) will
> fail.
>
>  *
>
>  * The position is the sum of three parts:
>
>  *     1) The total number of bytes in released buffers
>
>  *     2) The position in the current buffer.
>
>  *     3) The total number of bytes in played but not yet released buffers
>
>  */
>
>
>
> If you are running 'fake' DMA and using a timer, you will likely need to
> keep a timestamp and extrapolate your position such that the position
> appears to be a linear, monotonically increasing position.  Note that you
> reset your position when your stream transitions to KSSTATE_STOP.
>
>
>
> I hope this explanation helps.
>
>
>
> Best Regards,
>
>
>
> Ken
>
>
>
> *From:* wdmaudiodev-bounce@xxxxxxxxxxxxx [mailto:
> wdmaudiodev-bounce@xxxxxxxxxxxxx] *On Behalf Of *Abhay dey
> *Sent:* Thursday, October 16, 2008 12:12 AM
> *To:* wdmaudiodev@xxxxxxxxxxxxx
> *Subject:* [wdmaudiodev] Re: Problem about GetMapping() / ReleaseMapping()
> in WavePCI
>
>
>
> 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>
> 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
> Pritesh
>
>
>



-- 
...Swapnil

|| Hare Krishna Hare Krishna Krishna Krishna Hare Hare ||
|| Hare Rama    Hare Rama   Rama   Rama    Hare Hare ||

Other related posts: