[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