[alsa-devel] Allocating DMA buffer for non-PCM

Adrian Knoth adi at drcomp.erfurt.thur.de
Thu Feb 14 18:26:53 CET 2013


On 02/14/2013 06:14 PM, Takashi Iwai wrote:

>> 	/* allocate level buffer */
>> 	err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV_SG,
>> 			snd_dma_pci_data(hdspm->pci),
>> 			MADIFX_LEVEL_BUFFER_SIZE, &hdspm->dmaLevelBuffer);
>> 	if (err < 0) {
>>     /* error */ [..]
>>     }
>>
>>     hdspm->level_buffer = snd_sgbuf_get_ptr(&(hdspm->dmaLevelBuffer), 0);
> 
> hdspm->level_buffer = (u32*)hdspm.dmaLevelBuffer.area;

Looks good, TNX.

>> This used to work on my development machine (kernel 3.6.x), but now a
>> kernel 3.2.0 user reports a NULL pointer dereference of
>> hdspm->level_buffer, so apparently, snd_sgbuf_get_ptr() returned NULL
>> for him.
> What's level_buffer?

The card does hardware metering and stores RMS/peak values in a DMA
buffer. I want to later pass this to userspace to show signal levels,
either via memcpy()ing the DMA buffer or maybe via mmap(). But since I
no longer have access to such a card, work on this is on halt atm.

> Is a SG-buffer for the audio stream?

The audio buffers use

	     snd_pcm_lib_preallocate_pages_for_all(pcm,
						   SNDRV_DMA_TYPE_DEV_SG,
						   snd_dma_pci_data(hdspm->pci),


so they're SG, yes.

>> How could this possibly happen?
> A wrong usage :)

I thought so, that's why I was asking. ;)



Cheers and thanks again


More information about the Alsa-devel mailing list