【问题标题】:ALSA unexpected buffer underrun. Can someone explain?ALSA 意外缓冲区不足。有人可以解释吗?
【发布时间】:2012-12-02 13:06:46
【问题描述】:

我有一个使用 ALSA 播放音频样本的音频应用程序。 “hw:0”设备已设置为: 采样:48kHz,16 位 LE 缓冲区大小:1920 帧(=20 毫秒) 周期大小:960 帧 (=10 ms) 这是伪代码:

snd_pcm_sframes_t delayp = 0;
snd_pcm_sframes_t availp = 0;

while(true)
{
    snd_pcm_delay(m_pHandle, &delayp);
    availp = snd_pcm_avail(m_pHandle);
    print "Delay" + delay + "Available" + availp
    err = snd_pcm_writei(m_pHandle, data, periodSize);
    availp = snd_pcm_avail_update(m_pHandle);
    print "Wrote " + err + "samples - samples available" + avail;
}

日志如下所示:

Periodsize 960 frames for a periodtime of 20 ms
Buffersize 1920 frames for a buffertime of 40 ms

Delay: 0 frames/ 0 ms; available 1920 frames/ 40
Wrote 960 frames; available after write: 960 frames/ 20 ms

xrunRecovery: Underrun!!! (at least 0.669 ms/ 32.112 frames long

Delay: 0 frames/ 0 ms; available 1920 frames/ 40
Wrote 960 frames; available after write: 960 frames/ 20 ms
Delay: 955 frames/ 19.8958 ms; available 965 frames/ 20.1042
Wrote 960 frames; available after write: 9 frames/ 0.1875 ms
Delay: 906 frames/ 18.875 ms; available 1014 frames/ 21.125
...
Delay: 952 frames/ 19.8333 ms; available 968 frames/ 20.1667
Wrote 960 frames; available after write: 18 frames/ 0.375 ms

xrunRecovery: Underrun!!! (at least 234.825 ms/ 11271.6 frames long

Delay: 0 frames/ 0 ms; available 1920 frames/ 40

Wrote 960 frames; available after write: 960 frames/ 20 ms

xrunRecovery: Underrun!!! (at least 0.869 ms/ 41.712 frames long

Delay: 0 frames/ 0 ms; available 1920 frames/ 40

发生了两件奇怪的事情: 1. 虽然我写的所有内容都是 960 帧,但 snd_pcm_avail_update 并不总是反映这一点 2. 出乎意料,突然发生了一个 xrun。例如,在只有 18 帧可用的情况下,下一行在尝试将新周期写入缓冲区时给出 xrun。

谁能解释一下这里发生了什么?

【问题讨论】:

    标签: alsa


    【解决方案1】:

    当您写入 960 帧时,可用帧数减少 960。 同时,任何正在播放的样本都会增加可用帧的数量。

    当缓冲区变空时,您会遇到欠载。 根据您的日志,您的程序没有运行大约 234 毫秒。

    【讨论】:

    • Cl,我正在循环运行。你知道为什么循环会突然停止超过 200 毫秒(在 Ubuntu 12.04 上运行)吗?唯一正在运行的是这个应用程序。我没有设置线程优先级;会是这个原因吗?
    • 尝试使用xrun_debug 选项找出阻止您进程的原因。
    • 感谢 CL,但我需要为此重新编译内核吗?
    • CL,我注意到线程确实突然消失了很长时间。谢谢你的协助。不过仍然对 xrun_debug 选项感兴趣。
    猜你喜欢
    • 2011-01-23
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    相关资源
    最近更新 更多