[alsa-devel] Direct write (using mmap_bigin and commit)

Jaroslav Kysela perex at perex.cz
Mon Nov 15 14:22:17 CET 2010

On Mon, 15 Nov 2010, Irfan Shaikh wrote:

> Hello,
>         I am reading an raw PCM  file and want to write on PCM device using direct write (interleaved). I have gone through PCM.c test application.
> I am trying tio write PCM audio data as follows. I am unable to use  snd_pcm_mmap_begin and snd_pcm_mmap_commit properly. Please help me to use using these APIs
> Question :
> 1) How can i write to Ring buffer area (any pcm audio data)?  //Any example or explanation other than pcm.c
> 2) Do i need to write diffferently for each channel as shown in pcm.c
> I am trying to do following but not succeded (reading pcm file and writing content on device) . ANy thing played on audio device would help me in understanding.
>        snd_pcm_channel_area_t my_areas;
>        snd_pcm_uframes_t offset, frames, size;
>        snd_pcm_sframes_t avail, commitres;
>        int result;
>        char *buffer;
>        while(1)
>        {
>            avail = snd_pcm_avail_update(handle);
>            if(avail>=period_size)
>            {
>                size=periodsize
>                while (size > 0) {
>                        frames = size;
>                        err = snd_pcm_mmap_begin(handle, &my_areas, &offset, &frames);
>                        mybuffer=(char *)malloc(frames*2);
>                        result = fread (mybuffer,1,(frames*2),pFile);
>                        my_areas.addr=mybuffer;           // IS THIS CORRECT ? WILL THIS WORK ? How can i write my audio file data here in areas?

What's this? You just overwrite the read-only pointer value in my_areas. 
Use the ring buffer pointer and do memcpy or so. Use area returned from 
mmap_begin(), don't forget to add offset. Also, application must check, 
if my_areas description (buffer arrangement) is expected (check for 
sample step/offset).

The pcm.c is good example. Just try to understand what my_areas 
really does. And no, it's not necessary to handle just one sample, if you 
know the PCM ring buffer layout.


Jaroslav Kysela <perex at perex.cz>
Linux Kernel Sound Maintainer
ALSA Project, Red Hat, Inc.

More information about the Alsa-devel mailing list