如何在Alsa中实现非交错mmap(直接)访问模式,以便从SRAM实时流式传输?

时间:2014-12-16 00:37:55

标签: mmap alsa

我在SRAM中有一个大小为4096字节的缓冲区,它会定期更新新的原始音频数据:

----------------------------------------  
| 2048 bytes of L | 2048 bytes of right|  
----------------------------------------
^                 ^
|A                |B  

NOTE: A and B are pointers to the start addresses.

如图所示,数据是非交错立体声(16位采样,44100Hz采样率),由于它已经在内存中,我更喜欢使用MMAP访问而不是RW(和就我对alsa的理解而言,它不应该使用单独的缓冲区将数据复制到此缓冲区中。)

此缓冲区的起始地址是固定的(比如0x3f000000物理地址),我正在MMAP这个缓冲区以获取虚拟地址指针。

现在,如何将数据发送到alsa进行播放以及我的配置应该是什么?

我目前的不成功方式是:

Resample ON
Rate 44100
SND_PCM_ACCESS_MMAP_NONINTERLEAVED
channels 2
format SND_PCM_FORMAT_S16_LE
period near 1024 frames
buffer near 2*1024 frames

void* ptr[2];
ptr[0] = A // Points to mmaped virtual address of A
ptr[1] = B // Points to mmaped virtual address of B
while(1)
{
   wait_for_new_data_in_buffer();
   snd_pcm_mmap_writen(handle, &ptr, period_size);
}

额外信息: 1.我使用的是带有arm内核的嵌入式主板,并在其上运行基本的linux。 这是一个专有的工作相关项目,因此这个问题的含糊不清。 3.我已经知道不建议直接MMAP一个物理地址,所以不要浪费时间评论它。

提前致谢。

0 个答案:

没有答案