[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
-----
Jaroslav Kysela <perex at perex.cz>
Linux Kernel Sound Maintainer
ALSA Project, Red Hat, Inc.
More information about the Alsa-devel
mailing list