[alsa-devel] dmix and mmap

Gabriel Johnson johnsoga at gmail.com
Thu Apr 30 17:10:23 CEST 2009


I am currently working on two issues.

First, I am trying to add mmaping support to the pcm driver I am using
so that I can use the dmix plugin.  My driver is a soc driver for the
powerpc mpc5121.  The pcm_new function preallocates the dma buffers
with the following code:

static int mpc512x_pcm_preallocate_dma_buffer(struct snd_pcm *pcm, int stream)
{
	struct snd_pcm_substream *substream = pcm->streams[stream].substream;
	struct snd_dma_buffer *buf = &substream->dma_buffer;
	size_t size = mpc512x_pcm_hardware.buffer_bytes_max;

	buf->dev.type = SNDRV_DMA_TYPE_DEV;
	buf->dev.dev = pcm->card->dev;
	buf->private_data = NULL;
	buf->area = dma_alloc_coherent(pcm->card->dev, size,
				       &buf->addr, GFP_KERNEL);
	if (!buf->area)
		return -ENOMEM;
	buf->bytes = size;
	return 0;
}

Given the way the dma buffers are allocated if I just add
SNDRV_PCM_INFO_MMAP and SNDRV_PCM_INFO_MMAP_VALID to my
snd_pcm_hardware struct with the alsa framework use a generic mmap
function or do I still need to implement one?  If I need to implement
a mmap callback what is the fastest and most simple way to add that
support?

Second, I need to test dmix with my driver.  My codec only supports
S16_BE.  When I try to use `aplay -Dplug:dmix -f SE16_BE mywave.raw` I
get the error `requested or auto-format is not available`.  After
looking in pcm_direct.c it appears that when I use -Dplug:dmx it
ignores -f S16_BE and is defaulting to some format that my codec
doesn't support.  I don't have a /etc/alsa.conf or ~/.asoundrc file
and /proc/asound/modules doesn't exists.  Where is aplay getting the
default setting for plug:dmix?  How can I override those defaults?

I am using alsa-lib-1.0.11rc2.

Thanks,
Gabe


More information about the Alsa-devel mailing list