PortAudio不可靠:表达式'...'失败

问题描述 投票:3回答:2

我目前正在尝试实时信号处理,所以我去尝试了PortAudio(来自C)。

我的计算机上有两个音频接口,板载声音(Intel HD音频)和USB音频接口。两者通常都可以在Linux上的ALSA下正常运行。我还在Linux上的JACK下尝试了USB音频接口,这也可以完美运行。

我做什么:

我的代码只是初始化PortAudio,打开并启动一个流(一个通道,paInt32样本格式,defaultLowInputLatency / defaultLowOutputLatency,尽管我尝试更改为paFloat32defaultHighInputLatency / defaultHighOutputLatency,什么都没有改善)。

在每次调用回调时,它通过sizeof(int32_t) * frameCountmemcpy字节从输入复制到输出缓冲区,然后返回paContinue。它在回调中不执行其他任何操作。没有内存分配,没有系统调用,不会阻塞。它只是输出已读取的内容。该代码非常简单,但仍然无法运行。

用循环将memcpy类型的frameCount元素从输入复制到输出缓冲区的循环替换int32_t并没有任何改变。

我尝试过的:

以下情况已通过PortAudio进行了尝试。

  1. 通过USB音频接口的输入和输出,PortAudio上的回调机制,ALSA后端。
  2. 通过USB音频接口进行输入和输出,使用1024个样本缓冲区大小,ALSA后端阻止PortAudio上的I / O。
  3. 通过USB音频接口输入,通过板载声音输出,PortAudio上的回调机制,ALSA后端。
  4. 通过USB音频接口输入,通过板载声音输出,使用1024个样本缓冲区大小,ALSA后端阻止PortAudio上的I / O。
  5. 通过USB音频接口的输入和输出,PortAudio上的回调机制,JACK后端。
  6. 通过USB音频接口进行输入和输出,使用1024个样本缓冲区大小,JACK后端阻止PortAudio上的I / O。

我遇到的问题:

结果如下。 (数字代表上述方案。)

  1. 无设备输出。
  2. 设备输出不稳定(中断)。一直有很多缓冲区不足。
  3. 无设备输出。
  4. 设备输出不可靠。有时它起作用,有时却不起作用。 (不更改任何内容,仅运行可执行文件多次。)当它起作用时,延迟开始时很小,但随着时间的流逝而增加,并且变得非常明显。
  5. 无设备输出。
  6. 无设备输出。

[每次尝试之间,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_InitializePa_OpenStreamPa_StartStreamPa_StopStreamPa_CloseStreamPa_Terminate都返回paNoError

[PortAudio附带的paex_read_write_wire.c(阻塞I / O)示例通常可以访问设备,但也会遇到很多欠载情况(如我的测试用例2)。

[无论哪种情况,dmesg中都没有有趣的内容。 (只需检查一下,因为ALSA具有内核级组件。)

我的问题:

谁都知道这里有什么问题,我该如何解决?或者至少,我该如何进一步缩小范围?

linux audio alsa portaudio jack
2个回答
1
投票

[当您仅写入一个样本块时,仅当您要写入下一个块时,播放设备就会用尽样本。

开始读/写循环之前,您应该用零个样本填充播放设备的缓冲区。


0
投票

我不清楚细节,但是对我来说,从默认的低输入/输出等待时间切换到默认的高输入/输出等待时间可以解决此问题,并且我无法感觉到等待时间的变化。

© www.soinside.com 2019 - 2024. All rights reserved.