[alsa-devel] SEGFAULT : snd_pcm_mmap_begin/commit

David Henningsson david.henningsson at canonical.com
Tue Nov 16 09:59:09 CET 2010


On 2010-11-16 09:44, Irfan Shaikh wrote:
> Hello All,
>
> I have been facing dificulty in using snd_pcm_mmap_begin and snd_pcm_mmap_commit.
> Shows Seg fault as pointed by comment in code below.
> Please tell me what wrong i am doing and how do i correct.
>
> /###################################################################################/
>          unsigned int count = (alsaParams->frames/(((alsaParams->bit_per_sample)*(alsaParams->num_channel)) / 8));
>          unsigned char *data = alsaParams->data;https://owa.sasken.com/owa/?ae=Item&t=IPM.Note&a=New#
>          snd_pcm_sframes_t frames_available, frames_transmit;
>          const snd_pcm_channel_area_t *area;
>          snd_pcm_uframes_t offset;
>          char *outbuffer;
>          int result;
>
>          /*available space in audio-buffer to write to*/
>          frames_available = snd_pcm_avail_update(alsaParams->pcm_handle);
>
>          /*
>           * prepare the areas
>           * and get back area, offset and frames_transmit
>           * frames_transmit gives back the REAL value of available frames which could be written to in the mmaped-area
>           * frames_transmit are less than frames_available
>           */
>          frames_transmit = frames_available;
>
>          snd_pcm_mmap_begin(alsaParams->pcm_handle,&area,&offset,&frames_transmit);
>
>          /*calculates the mmaped-buffer which could be written to*/
>          outbuffer = ((char *) area->addr + (area->first + area->step * offset)/ 8);    // ****** SEGFAULT *******

Well, the only pointer dereference is to area, so area has an invalid 
pointer. Please check the return value of snd_pcm_mmap_begin to see why.

>
>          /*gives back the virtually written (writable) frames which should be always == frames_transmit*/
>          result = snd_pcm_mmap_commit(alsaParams->pcm_handle, offset, frames_transmit);
>
>          memcpy(outbuffer, data, count);  //data is actual data

Hmm, I've haven't used snd_pcm_mmap_* in a long time, but shouldn't the 
memcpy be above snd_pcm_mmap_commit? Second, if you're using memcpy, why 
don't settle with snd_pcm_writei in the first place?

-- 
David Henningsson, Canonical Ltd.
http://launchpad.net/~diwic


More information about the Alsa-devel mailing list