At Sun, 5 Oct 2003 21:01:58 +0200 (CEST),
Jaroslav wrote:
> 
> On Sat, 4 Oct 2003, Winfried Ritsch wrote:
> 
> >
> > Hello !
> >
> > (A question from an newbie-developer to make it perfect ;-)
> >
> > I am writing an ALSA-lowleveldriver for the RME HDSP-MADI card.
> > (which have 64Audion in and out and an 128in64(= 8192Fader) Mixer
> > see http://www.rme-audio.de/hdsp/hdspmadi.htm ) Coding is quite
> > complete but I have trouble with the memory management.
> >
> > The Card uses ScatterGather Buffer, each channel 64kB and this
> > has to be asigned (to be safe) before activation, so I want
> > to allocate SGbuffer (64+64)*64*1024=8388608 in 4k-blocks.
> >
> > I do a
> >
> > snd_pcm_lib_preallocate_pci_pages_for_all(hdspm->pci, pcm,8388608l,8388608l)
> >
> > after making the pcm_device.
> >
> > Here the questions:
> >
> > 1) How can I get the sgbuf pointer ?
> >
> > ... since in the streams runtime is not set and therefore (besides the
> > Documentation says is (snd_pcm_sgbuf_t*)substream->dma_private which I
> > couldnt find)
> >
> >  sgbuf = (snd_pcm_sgbuf_t*)substream->runtime->dma_private;
> >
> > is not assigned.
> >
> > but when I activate the card (for MIDI for example) there must be
> > memory asigned und I think doing it in hw_params is to late.
> 
> Note that ALSA has SG routines only for PCM streams and it's lifetime is
> limited only for stream lifetime.

well, this is no longer true.  the sg-buffer allocation is handled
generally in snd-page-alloc module (although only PCM handlers use it
in practice :)
and we have preallocation for sg PCM buffers now, too.

>  If hardware needs to allocate a big
> buffer at the initialization phase, you have to do it yourself.

the SG buffers should be pre-allocated via
snd_pcm_lib_preallocate_sg_pages() and _for_all() functions
instead of snd_pcm_lib_preallocate_pci_pages() and co.
in addition, in hw_params() callback, you'll need to map the sg-pages
like below:

        struct snd_sg_buf *sgbuf = snd_pcm_substream_sgbuf(substream);
        ...
        for_all_pages { /* rewrite as you like */
                /* get the physical address by snd_pcm_sgbuf_get_addr(). */
                /* set this address on the hardware's address table */
                do_my_mapping(snd_pcm_sgbuf_get_addr(sgbuf, offset));
        }

check via82xx.c as an example (or emu10k1 driver as a more complex
case).

you can find a brief information in my tutorial ("Non-Contiguous
Buffers" section in "Buffer and Memory Management").


Takashi


-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to