[alsa-devel] Accessing alsa user space buffer from external io type plugin

sandeep lahane sandeep.lahane at gmail.com
Tue Mar 25 00:13:41 CET 2008


I am debugging an userspace external io type plugin, written for an ARM
based board where the plugin
interacts with DSP directly using shared memory.

Every time I have to send period_size data to the DSP, I have my own
write/read methods to do so.

I am having a problem accessing the alsa ring buffer, my transfer function
looks like following.

static   char * temp;
static snd_pcm_sframes_t alsa_transfer(snd_pcm_ioplug_t *io,
                   const snd_pcm_channel_area_t *areas,
                   snd_pcm_uframes_t offset,
                   snd_pcm_uframes_t size)


         temp = malloc(period_size);
         memcpy(temp,  unsigned char *)areas->addr + (areas->first +
areas->step * offset) / 8, period_size);
          write_to_dsp(temp, period_size);

All the book keeping is done properly, the first chunk of data is sent
properly to DSP and pointer() returns correct value,
next time when transfer is called, the memcpy gives segfault. ALSA buffer is
an interleaved buffer and I am not using mmap
mode. Any idea what might be wrong?

When I do something like this:
        memcpy(temp,  "test data test data", period_size);
the data is sent properly to DSP, but alsa buffer data is not getting
accessed properly.



More information about the Alsa-devel mailing list