我正在研究ALSA基于这篇文章:http://equalarea.com/paul/alsa-audio.html#interruptex(一个最小的中断驱动程序)
注意short buf[4096];
如果我们将其声明为全局,则会提示错误地址错误。如果我们将其声明为int playback_callback (snd_pcm_sframes_t nframes)
的本地,则它会运行并且有时会提示错误的地址错误。如果我们使用malloc
分配buf
,错误就会消失。
正如我从snd_pcm_writei
的源代码中看到的那样,它调用ioctl
将缓冲区发送到设备。那么,为什么ioctl
表现得像我描述的那样?
我正在使用Ubuntu 14.04 64位
答案 0 :(得分:1)
那个程序是错误的。
buf
有足够的空间容纳4096个样本,但设备配置为每帧两个样本,因此4096帧将溢出缓冲区。