我目前正在尝试实时信号处理,所以我去尝试了PortAudio(来自C)。
我的计算机上有两个音频接口,板载声音(Intel HD音频)和USB音频接口。两者通常都可以在Linux上的ALSA下正常运行。我还在Linux上的JACK下尝试了USB音频接口,这也可以完美运行。
我做什么:
我的代码只是初始化PortAudio,打开并启动一个流(一个通道,paInt32
样本格式,defaultLowInputLatency
/ defaultLowOutputLatency
,尽管我尝试更改为paFloat32
或defaultHighInputLatency
/ defaultHighOutputLatency
,什么都没有改善)。
在每次调用回调时,它通过sizeof(int32_t) * frameCount
将memcpy
字节从输入复制到输出缓冲区,然后返回paContinue
。它在回调中不执行其他任何操作。没有内存分配,没有系统调用,不会阻塞。它只是输出已读取的内容。该代码非常简单,但仍然无法运行。
用循环将memcpy
类型的frameCount
元素从输入复制到输出缓冲区的循环替换int32_t
并没有任何改变。
我尝试过的:
以下情况已通过PortAudio进行了尝试。
我遇到的问题:
结果如下。 (数字代表上述方案。)
[每次尝试之间,ALSA已经过测试是否仍然可以响应(有时它已完全“锁定”,因此不再有应用程序可以输出声音了),并在ALSA被“锁定”的情况下重新启动了系统,然后继续测试。
更多详细信息,在向下追踪问题时可能会有用:
在根本没有输出的情况下,当使用ALSA作为后端时,我收到以下错误消息。
Expression 'err' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 3350
Expression 'ContinuePoll( self, StreamDirection_In, &pollTimeout, &pollCapture )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 3876
Expression 'PaAlsaStream_WaitForFrames( stream, &framesAvail, &xrun )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 4248
使用JACK作为后端时,我收到以下错误消息。
Cannot lock down 42435354 byte memory area (Cannot allocate memory)
此外,无论我使用哪种方法,总是会收到这些警告。
ALSA lib pcm.c:2267:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2267:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2267:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib pcm_route.c:867:(find_matching_chmap) Found no matching channel map
ALSA lib pcm_route.c:867:(find_matching_chmap) Found no matching channel map
[使用ALSA时,我也收到一两个关于欠载的投诉。
ALSA lib pcm.c:7905:(snd_pcm_recover) underrun occurred
我调用的PortAudio函数(依次按Pa_Initialize
,Pa_OpenStream
,Pa_StartStream
,Pa_StopStream
,Pa_CloseStream
,Pa_Terminate
都返回paNoError
。
[PortAudio附带的paex_read_write_wire.c
(阻塞I / O)示例通常可以访问设备,但也会遇到很多欠载情况(如我的测试用例2)。
[无论哪种情况,dmesg
中都没有有趣的内容。 (只需检查一下,因为ALSA具有内核级组件。)
我的问题:
谁都知道这里有什么问题,我该如何解决?或者至少,我该如何进一步缩小范围?
[当您仅写入一个样本块时,仅当您要写入下一个块时,播放设备就会用尽样本。
开始读/写循环之前,您应该用零个样本填充播放设备的缓冲区。
我不清楚细节,但是对我来说,从默认的低输入/输出等待时间切换到默认的高输入/输出等待时间可以解决此问题,并且我无法感觉到等待时间的变化。