我在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一个物理地址,所以不要浪费时间评论它。
提前致谢。