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?