This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] VAR-3P-ADS62-AM62 SOM:播放~45分钟后出现音频干扰

Guru**** 2482225 points
Other Parts Discussed in Thread: AM625, SK-AM62B-P1

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1417915/var-3p-som-am62-audio-glitches-after-45-minutes-of-playback

器件型号:VAR-3P-AM62-AM62-AM62-AM62-AM62 SOM
主题中讨论的其他器件:AM625SK-AM62B-P1

工具与软件:

使用 AM625 (特别是 SOM Variscite 的 VAR-AM62-AM62)时、我遇到了我们的定制硬件音频问题。 我认为问题出在内核/驱动程序/芯片层面、并不是针对他们的 SOM 的具体问题。
我无法将问题显示在 Variscite EVK 上。 因此、我认为该问题只会出现在我们的定制映像/硬件中存在的某些特定配置/组合导致的。 同样、我认为硬件不存在问题、只是硬件揭示了一些较低级别的错误/问题。

我花了几个星期观察这个问题并试图缩小问题的范围。

问题
问题显示为出现故障音频。 它仅在播放已进行一段时间(大约~45分钟后)后才会显示。 干扰显示为以下两种形式之一:
-每个 ALSA 周期,一些样本是正确的,其余的是零
-每个 ALSA 期间,一些样本为零,其余样本为正确
因此、如果 ALSA 周期为256个样本、则每256个样本可以看到一次干扰。

测试方法
gstreamer 或扬声器测试用于生成正弦波:

gst-launch-1.0 audiotestsrc freq=440! alsasink device=playback1 --verbose

speaker-test -c 2 -r 46512 -t sine -f 440 -D Playback1

音频最终会命中 DAC、因此很容易在示波器上观察到结果。 实际有多个使用不同格式(一个是 I2S、另一个是 TDM)的 DAC。 这两种情况都出现问题。 为了验证该问题不是在离线更远的某个位置发生、而是从 AM62x 出来、可以轻松地确认 MCASP 数据线也存在干扰、从而匹配最终在 DAC 输出上看到的结果。

DSP 在所有这些模块之间路由音频。 如果在 DSP 内生成波形、则没有干扰。 另一项确认是仅当 AM62x 发出干扰音频时才会发生。

没有从 gstreamer 或 Linux (dmesg)向控制台打印错误。 没有报告 xrun。 停止流水线并再次启动它会立即修复它。

关于硬件的独特之处
MCASP (McASP0和 MCASP2)连接到外部 DSP、而不是连接到传统编解码器。 `s、音频器件被配置为` imple-audio-card `s、并带有一个用于允许类型为 soc` nd-audio-dummy 的编解码器的补丁。 然后 ALSA `asound.conf`正确定义了每个输出/输入以使用正确的采样率等、这些都将在 DSP 侧进行处理。 因此、DSP 是主器件、提供 BCK 和 FS 时钟。 采样率不是典型值(46512Hz 和186048Hz)、但在链中的任何位置正确定义。
McASP0为 TDM16、MCASP2为 I2S。 其中任何一个上都显示了该问题。

在另一项测试中、时钟已更改为典型的音频时钟(48kHz)。 问题仍然出现。

我已经建立了一个 从已知映像(`var-thin-image`)开始的最小映像、并且仅添加了进行测试绝对必要的内容:
 -`snd-durm-dummy soc`的补丁
-目标硬件的设备树更改
-添加一些默认情况下不包括的 gstreamer 软件包( audiotstsrc、alsasink 等)
-最小`asound.conf`,用于在 McASP0上测试 TDM16的单个立体声输出
然后、我手动初始化 DAC 和 DSP (我的任何应用程序代码都实际未运行)。 然后、只需要运行该简单的 gstreamer 流水线并等待输出出现干扰。

此外、我添加了 CONFIG_DYNAMIC_debug、以查看播放期间是否打印出任何有用的内容。 在启用了对音频相关的基本内容(K3-uDMA*, sound/core/*, sound/ soc /*等)的 print 语句后、没有有用的内容最终被打印出来。

另一个发现是、如果直接访问声卡、似乎不会出现故障。

对于 TDM 输出、使用 dshare 或 dmix、会出现干扰。 如果直接访问它们(例如插入 HW:0、0)、它们似乎不会发生。

以下是出现干扰时的音频示波器捕获:

您可以看到干扰之间的周期与256个样本的 ALSA 周期完全匹配(5.33ms @ 48kHz)。

这是相应的 MCASP 数据线

这一特定问题已经拖延了一段时间、因此、感谢对这一问题的任何见解。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好  

    感谢您对该问题的详细说明。 您是否与 Variscite 保持联系?  您是否能够在 SK-AM62B-P1上重现问题?   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Mukul,

    我还没有就这个特定问题与他们接洽、因为我认为这是一个较低级别的问题、而不是针对他们的 SOM。 如果我不得不猜猜、我会说它位于驱动器级别、与 Davinci-McASP 和/或 DMA 相关。 我在这个论坛上看到了许多其他音频相关的问题(其中我已经尝试了所有的补丁),所以我不会太惊讶。

    我没有  SK-AM62B-P1、很遗憾、我无法在上面对其进行测试。 但是、它应该易于测试、因为这只需要运行基本正弦波测试并让其长时间运行。

    但是、我使用的是 Variscite Symphony 板和 VAR-AM62-AM62 SOM。

    在我的原始文章中、我说我无法在那里重现该问题。 但是、我现在可以修正、说问题确实出现在那里。 它只需要不同(更长)的时间来显示。

    以下是 EVK 上同一类型干扰的示波器捕获:


    另外还有一些我自己的硬件不会看到的干扰。 该视图已稍作放大:
    编辑:这似乎是电缆和示波器探头放大的不相关噪声。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    出现问题时、您是否有要共享的日志? (可能存在任何下溢/溢出)、您能否尝试以较小的周期大小运行相同的测试、并查看是否发生了问题?

    此致、

    Suren

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    日志并不是很有趣:

    0:04:59.220894875  1640     0x32bd5580 WARN                    alsa gstalsasink.c:1010:xrun_recovery:<alsasink0> xrun recovery -32: Broken pipe
    0:43:01.544439851  1640     0x32bd5580 WARN                    alsa gstalsasink.c:1010:xrun_recovery:<alsasink0> xrun recovery -32: Broken pipe
    0:43:01.550710264  1640     0x32bd2800 WARN           audiobasesink gstaudiobasesink.c:1786:gst_audio_base_sink_get_alignment:<alsasink0> Unexpected discontinuity in audio timestamps of +0:00:00.000020833, resyncing 
    -- BREAKS -- 
    1:11:03.232455286  1640     0x32bd5580 WARN                    alsa gstalsasink.c:1010:xrun_recovery:<alsasink0> xrun recovery -32: Broken pipe
    1:31:04.428517986  1640     0x32bd5580 WARN                    alsa gstalsasink.c:1010:xrun_recovery:<alsasink0> xrun recovery -32: Broken pipe
    1:33:04.544637428  1640     0x32bd5580 WARN                    alsa gstalsasink.c:1010:xrun_recovery:<alsasink0> xrun recovery -32: Broken pipe
    -- FIXED -- 
    "--breaks--"和"--fixed--"是我关于故障出现的时间的注释、然后消失。

    我已经在各种周期大小中测试了这一点、它们都有相同的问题。

    唯一的区别是干扰之间的距离(始终相隔1个周期)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否正在使用最新的10.0发布代码?

    https://dr-download.ti.com/software-development/software-development-kit-sdk/MD-PvdSyIiioq/10.00.07.04/tisdk-default-image-am62xx-evm.rootfs.wic.xz

    此致、

    Suren

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    遗憾的是、这不是真的可能、因为我必须使用 Variscite SDK、它始终都将作为 TI SDK 的后盾。
    SDK 目前基于 TI  9.01.00.08.
    我已经尝试根据我在这个论坛上看到的内容修补与音频相关的任何内容、并且基于 9.01.00.08到现在之间的 Linux 提交。 但都无法解决故障问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    下面类似的简单扬声器测试应该能够帮助我在终端重现此问题:

    speaker-test -c 2 -r 48000 -t sine -f 440 -D plughw:0

    我会首先尝试重现此问题、因为我们进行了周期较小的夜间测试、没有发现任何问题。  

    此致、

    Suren

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我建议多运行几天、因为我注意到 EVK 上正在运行40个小时。
    此外、我认为最好使用-c 1、因为在执行-c 2时、扬声器测试将在两个通道之间交替进行。
    此外,因为它可以"无毛刺"恢复正常,你必须定期检查它。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    由于您使用的是9.1 SDK 版本、我们建议您迁移到9.2或10.0版本内核、因为有许多修复程序与改善音频延迟和修复下溢/溢出问题相关、以提高音频质量。

    您能否验证是否已考虑以下提交补丁以验证电路板上的音频功能:

    参考:  

    https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/log/?qt=author&q=jai+luthra&h=ti-linux-6.1.y

    请告诉我如何集成上述所有增补程序。

    此致、

    Suren

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Suren

    我在您的列表中尝试了这组特定的增补程序、如果有任何问题使问题更加一致:

    0:46:36.314685117  1106     0x17555580 WARN                    alsa gstalsasink.c:1010:xrun_recovery:<alsasink0> xrun recovery -32: Broken pipe
    1:33:12.560986975  1106     0x17555580 WARN                    alsa gstalsasink.c:1010:xrun_recovery:<alsasink0> xrun recovery -32: Broken pipe
    2:19:48.824036149  1106     0x17555580 WARN                    alsa gstalsasink.c:1010:xrun_recovery:<alsasink0> xrun recovery -32: Broken pipe
    3:06:25.079554154  1106     0x17555580 WARN                    alsa gstalsasink.c:1010:xrun_recovery:<alsasink0> xrun recovery -32: Broken pipe

    请注意、xruns 的 时间戳在时间上间隔非常均匀。
    第一个 xrun 出现了故障,并持续到第二个 xrun ,这"修复"了它。

    其一致性使我想到了整数溢出类型的情况。

    这就是通过 dshare 插件访问 ALSA 设备。

    直接访问器件时、我没有看到 xrun 或干扰(当前运行16小时)。

    当使用 dshare/dmix 访问输出设备时、可能会出现问题、但如果直接访问硬件设备、则不会出现问题。 或者、至少问题出现需要较长时间(必须让问题保持运行状态以查看是否出现这种情况)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我只是使用基于 TI 的新 Variscite SDK 再次尝试此功能  09.02.01.10。
    它生成的结果与之前应用了补丁的 SDK 相同:

    0:46:36.299947006  1021      0xabe9580 WARN                    alsa gstalsasink.c:1010:xrun_recovery:<alsasink0> xrun recovery -32: Broken pipe
    1:33:12.558598771  1021      0xabe9580 WARN                    alsa gstalsasink.c:1010:xrun_recovery:<alsasink0> xrun recovery -32: Broken pipe
    2:19:48.813077951  1021      0xabe9580 WARN                    alsa gstalsasink.c:1010:xrun_recovery:<alsasink0> xrun recovery -32: Broken pipe

    同样地、xrun 之间非常特定的时间段、其中 xrun 会导致干扰发生、直至下一个 xrun。

    这是我正在运行的测试:

    export GST_DEBUG=2
    gst-launch-1.0 audiotestsrc freq=440 ! alsasink device=playback_dshare --verbose


    用于使用 dshare 设备进行测试的 ALSA 配置:
    pcm_slave.slaveA {
        pcm "hw:0,0"
        channels 8
        rate 48000
        format S32_LE
    }
    
    pcm.playback_dshare {
        type dshare
        ipc_key 1111
        slave slaveA
        bindings [ 0 1 ]
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    直接播放在您的测试运行中是否正常、而不是 dshare?

    此外、您是否可以将大小  CONFIG_SND_HDA_PREALLOC_SIZE 从64增加到2048、并尝试进行实验来查看问题是否解决。

    此致、

    Suren

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    更改  CONFIG_SND_HDA_PREALLOC_SIZE 未产生影响。

    根据我所测试的内容、当输出设备是硬件而不是 dshare/dmix 时、不会发生 xrun ->毛刺脉冲情况。

    如果您可以在 TI EVK 上测试我之前的文章中展示的内容、那将非常好。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

      

    使用 TI EVK、我们已经能够 通过 Yocto BSP 09.02.01.10 ( 2024年5月22日)和10.00.07.04 (2024年8月14日)重现此行为。

    这里是步骤

    1.按如下方式编辑/etc/asound.conf

    pcm_slaveA{
      PCM"硬件:0、0"
      通道2
      速率44100
    }
    pcm.playback_dshare{
      键入 dshare
      IPC_KEY 11111
      从器件扇区 A
      绑定[ 0 1 ]
    }

    2.运行以下命令

    导出 GST_DEBUG=2
    gst-launch-1.0 audiotestsrc freq=440! alsasink device=playback_dshare --verbose

    这将开始  以440Hz 的频率产生清晰的立体声音

    3.等待约7小时,音突然被破坏

    发生这种情况时、终端会显示 xrun 通知、类似这样的情况

    root@am62xx-evm:~# uname -A
    Linux am62xx-EVM 6.6.6.32-ti-g6de6e418c80e-dirty #1 SMP 抢占星期五7月26日14:32:20 UTC 2024 AArch64 GNU/Linux
    root@am62xx-EVM:~# export gst_debug=2
    root@am62xx-evm:~# gst-launch-1.0 audiotestsrc freq=440! alsasink device=playback_dshare --verbose
    正在将管道设置为暂停...
    管道是 PREROLLING ..
    0:00:00.145770469 1570 0xffffff84000b70 warn alsa conf.c:5694:snd_config_expand:alsalib 错误:未知参数{AES0 0x02 AES1 0x82 AES2 0x00 AES3 0x02}
    0:00:00.145875815 1570 0xffffff84000b70 warn alsa pcm.c:2721:snd_pcm_open_noupdate:alsalib 错误:未知的 pcm playback_dshare:{AES0 0x02 AES1 0x82 AES2 0x00 AES3 0x02}
    /GstPipeline:pipeline0/GstAudioTestSrc:audiostsrc0.GstPad:src:caps = audio/x-raw、format=(string) S16LE、layout=(string) interleaved、rate=(int) 44100、channels =(int) 2、 CHANNEL-MASK=(BITMASK) 0x000000000003
    0:00:00.146676570 1570 0xffff84000b70 warn alsa pcm_hw.c:1429:snd_pcm_hw_get_chmap:alsalib 错误:无法读取通道映射 ctl:没有此类文件或目录
    重新分配延迟...
    /GstPipeline:pipeline0/GstAlsaSink:alsasink0.GstPad:sink:caps = audio/x-raw、format=(string) S16LE、layout=(string) interleaved、rate =(int) 44100、channels =(int) 2、 CHANNEL-MASK=(BITMASK) 0x000000000003
    管道是 PREROLLED ...
    正在将管道设置为播放...
    重新分配延迟...
    新时钟:GstAudioSinkClock
    6:45:48 .373691250 1570 0xffffff7c00f8e0 warn alsa gstalsasink.c:1010:xrun_RECOVERY:  xrun 恢复-32:管道断裂
    6:48:38 .266189867 1570 0xffffff7c00f8e0警告 alsa gstalsasink.c:1010:xrun_RECOVERY:  xrun 恢复-32:管道断裂

    示波器开始显示这样的内容

    几毫秒内没有声音。

    它看起来存在某种 DMA 问题、但如果您需要进一步的详细信息、请告知我们。

    谢谢

    此致

    码头

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨码头

    我直接在 AM62B-P1板上运行了10个多小时、但 dshare 和 扬声器测试没有任何问题。

    我在 asound.conf 中进行了上述更改,并进行了一次跑步。 如果我们能够在最后重现该问题、我们会随时向您发布消息

    此致、

    Suren

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 

    我确认我们不能在没有 asound.conf 更改的情况下重现行为。

    谢谢

    此致

    码头

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨码头

    pcm_slaveA {
      PCM"硬件:0、0"
      通道2
      速率44100
    }
    pcm.playback_dshare{
      键入 dshare
      IPC_KEY 11111
      从器件扇区 A
      绑定[ 0 1 ]
    }

    我刚刚在 pcm_slaveA 中添加了 period_size 64和 buffer_size 8192、它可以正常运行超过12个小时而不会出现任何问题。  我在跑步几小时后、在没有这两个参数的情况下、我最后确实看到了音频干扰。

    您能否尝试在终端上添加这两个参数进行实验。

    此致、

    Suren

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的

    只是为了避免误解,请添加文件 asound.conf 的当前版本作为您使用它进行测试。

    谢谢

    此致

    码头

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨码头

    它的运行仍然没有任何问题(现在超过24小时...)

    下面是 asound.conf 文件内容:

    cat /etc/asound.conf 
    # default Arago configuration
    pcm_slave.slaveA {
        pcm "hw:0,0"
        channels 2
        period_size 64
        buffer_size 8192
        rate 44100
    }
    pcm.playback_dshare {
        type dshare
        ipc_key 11111
        slave slaveA
        bindings [ 0 1 ]
    }
    

    此致、

    Suren

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Suren

    在充分尊重的情况下,告诉我们更改周期和缓冲区大小,以"修复"问题是回避问题。

    对于任何有效的周期和缓冲区大小、它应该起作用。

    这里显然存在一个问题。

    这种欠运转在每一次完全同一时间发生的事实是一个明确和明确的可重现的情况。 即使您忽略不应发生欠运转的事实、欠运转也不应导致一次数小时出现无效的、模糊的音频、而只会在欠运转时出现瞬时毛刺。

    另一个有趣的注意事项是、使用建议的周期大小和缓冲区大小取消记录会导致~5.0%的 CPU 使用率。

    arecord -r 44100 -f S16_LE -c 2 -D hw:0,0 --period-size=64 --buffer-size=8192 /dev/null

    根据 https://software-dl.ti.com/processor-sdk-linux/esd/AM62X/10_00_07_04/exports/docs/devices/AM62X/linux/Linux_Performance_Guide .html

    CPU 使用率@ 44.1k 为0.5%、或低10倍。 我想看看这个测试是如何执行的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我知道 xrun 应该恢复、其余的播放应该可以正常运行。 我已经与我们的专家进行了深入探讨、了解了为什么在 xrun 中未正确清除带有 McASP 的 DMA 循环、以便对其进行进一步分析。 目前、团队正忙于准备即将发布的版本、因此他们会将时间花在根本原因上、从而导致 xrun 出现故障音频问题。

    我正在验证团队内部检查 CPU 使用情况。 请允许我在一天或两天内回复。

    此致、

    Suren

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Suren

    我认为也要 记住,不仅 xrun 不应该导致这种持续的闪耀的播放,但 xrun 不应该发生在第一位。 至少在这些情况下(如果有高 CPU 负载、大量 RT 线程或其他任何情况、当然)、但情况并非如此。

    实际上有两个主要问题:xrun 发生(回放开始后、以非常可预测、可重复的时间间隔发生)、xrun 发生后、回放出现毛刺。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我完全同意你的看法。 不应出现任何欠运转/溢出。 即使发生这种情况、它也应快速恢复、并且不会产生任何伪影。  

    它会将我们的团队对此进行调试。  

    感谢您的耐心。

    此致、

    Suren

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我尝试记录我的设置、看到 CPU 百分比为0.7%

    此致、

    Suren

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Suren

    这一问题是否有任何进展?
    考虑到确认该问题所花费的时间、 由于我们正在遇到的这一故障和其他阻止错误、我们正在失去信心、并正在考虑在本设计和未来设计中改用其他供应商的 MPU。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    对于延迟、我们深表歉意。

    为了更快地重现问题并从 xruns 检查恢复部分,我们特意设置了非常小的期间大小/缓冲区大小:

    pcm_slave.slaveA {
        pcm "hw:0,0"
        channels 2
        rate 44100
        period_size 8
        buffer_size 16
    }
    pcm.playback_dshare {
        type dshare
        ipc_key 11111
        slave slaveA
        bindings [ 0 1 ]
    }
    

    GST_DEBUG=*alsa*:6 GST_DEBUG_FILE="/run/alsa.txt" gst-launch-1.0 audiotestsrc freq=440 ! pulsesink  buffer-time=50 latency-time=50  device=playback_dshare  provide-clock=false sync=false --ver
    bose
    
    root@am62xx-evm:~# grep -inr XRUN /run/alsa.txt 
    2721:0:00:00.433862972  2155 0xffff94004410 WARN                    alsa gstalsasink.c:1010:xrun_recovery:<alsasink0> xrun recovery -32: Broken pipe
    4861:0:00:00.526143094  2155 0xffff94004410 WARN                    alsa gstalsasink.c:1010:xrun_recovery:<alsasink0> xrun recovery -32: Broken pipe
    6449:0:00:00.594698518  2155 0xffff94004410 WARN                    alsa gstalsasink.c:1010:xrun_recovery:<alsasink0> xrun recovery -32: Broken pipe
    6980:0:00:00.618351079  2155 0xffff94004410 WARN                    alsa gstalsasink.c:1010:xrun_recovery:<alsasink0> xrun recovery -32: Broken pipe
    9085:0:00:00.709254596  2155 0xffff94004410 WARN                    alsa gstalsasink.c:1010:xrun_recovery:<alsasink0> xrun recovery -32: Broken pipe
    191144:0:00:08.594555230  2155 0xffff94004410 WARN                    alsa gstalsasink.c:1010:xrun_recovery:<alsasink0> xrun recovery -32: Broken pipe
    280514:0:00:12.594558238  2155 0xffff94004410 WARN                    alsa gstalsasink.c:1010:xrun_recovery:<alsasink0> xrun recovery -32: Broken pipe
    484851:0:00:21.586573984  2155 0xffff94004410 WARN                    alsa gstalsasink.c:1010:xrun_recovery:<alsasink0> xrun recovery -32: Broken pipe
    1335712:0:00:58.962530396  2155 0xffff94004410 WARN                    alsa gstalsasink.c:1010:xrun_recovery:<alsasink0> xrun recovery -32: Broken pipe
    1487024:0:01:05.618539171  2155 0xffff94004410 WARN                    alsa gstalsasink.c:1010:xrun_recovery:<alsasink0> xrun recovery -32: Broken pipe
    1525148:0:01:07.300445396  2155 0xffff94004410 WARN                    alsa gstalsasink.c:1010:xrun_recovery:<alsasink0> xrun recovery -32: Broken pipe
    1525182:0:01:07.302713916  2155 0xffff94004410 WARN                    alsa gstalsasink.c:1010:xrun_recovery:<alsasink0> xrun recovery -32: Broken pipe
    1790032:0:01:18.930530746  2155 0xffff94004410 WARN                    alsa gstalsasink.c:1010:xrun_recovery:<alsasink0> xrun recovery -32: Broken pipe
    1941781:0:01:25.586573613  2155 0xffff94004410 WARN                    alsa gstalsasink.c:1010:xrun_recovery:<alsasink0> xrun recovery -32: Broken pipe
    

    我们确实看到正在记录 xrun 但音频在每次 xrun 后恢复良好、没有观察到波动。  因此, 你在7小时后观察到的音频斩波似乎与 xrun 错误恢复无关。  

    有没有任何其他方式没有 dshare 插件,我们能够重现问题,以便对其进行分类。

    此致、

    Suren

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Suren

    我不知道你在要求什么。 我提供了重现问题的信息、您已复制了该问题。

    不幸的是,它需要这么长的时间,但这也应该给一些提示,看看哪里(它需要很长的时间,总是需要完全相同的时间)。 如果我知道有办法让问题出现得更快、我就会提供这些信息。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    很抱歉、我在回复时出现延迟。 该团队一直在寻找导致该问题的根源、并发现 dmix 和 gstreamer 流水线之间没有正确的握手或通信通道。 gstreamer 插件无法读取由 dshare 插件配置的缓冲区大小/周期大小。 因此、dmix/dshare 插件正在全局强制实现特定的周期大小和缓冲区大小、这些都没有通信到 gstreamer 流水线、gstreamer 会假设周期大小/缓冲区大小是其他情况。

    因此、无论 dmix 设置的周期大小/缓冲区大小、您都还需要手动将它们设置为 gstreamer。 例如、dmix 将周期大小设置为5513、将缓冲区大小设置为16539作为默认值。

    因此我将这些设置在 asound.conf 和 gstreamer 流水线中、并使用以下流水线运行~64小时(也添加了用于线程的队列元素)、它运行正常、没有任何问题。

     

    # default arago configurationpcm_slaveA { pcm"Hw:0,0"
      
      channels 2
      rate 44100
      period_size 5513 buffer_size
      16539
      格式"S16_LE"
    } pcm.playback_dshare {
      type dshare
      ipc_key 11111
      slaveA
      bindings [ 0 1 ]}
    

     gst_debug=alsa:3 gst_debug_file="/run/alsa.txt gst-launch-1.0 audiotestsrc is-live=true freq=440! 队列! alsasink device=playback_dshare latency-time=125000 buffer-time=375000 provide-clock=false sync=false --verbose

     使用此配置时、它可以正常工作、经过~64小时的测试、未观察到 XRUNS。

    此致、

    Suren

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    有趣的理论、但我认为很容易被驳斥、因为在任何其他硬件上运行相同的测试不会导致相同的问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     这不是理论。 可以清楚地看到、gstreamer 没有相同的缓冲区大小视图、如果使用 dmix/dshare 插件、实际上会设置该视图。

    例如、如果我使用提供的 asound.conf 启动提供的 gstreamer 命令、并在驱动程序中启用打印:

    gst_debug="*alsa*":6 gst_debug_file="gst-launch-1.0 /run/alsa.txt audiotestsrc freq=440! alsasink device=playback_dshare -v      
    正在将管道设置为暂停...

    $dmesg

    [ 1179.603924] udma: buf_addr: f7880000, buf_len : 66156, period_len : 22052, dir : 1, tr0_cnt0 : 22052, tr0_cnt1:1、tr1_cnt0:0、num_tr:1

    根据我放置的内核打印、它将缓冲区长度显示为周期大小的三倍(以字节为单位)

    但 gstreamer 日志显示缓冲区大小为周期大小的两倍:

    grep -inr"缓冲区大小"/run/alsa.txt                                                                                                                                                    
    27:0:00:00.164735830 1271 0xffa8000b70调试                  alsa gstalsasink.c:571:set_hwparams: 缓冲区大小11026、周期大小5513

    注意:GStreamer 日志以帧为单位、而不是以字节为单位

    因此、gstreamer 假设缓冲区大小与使用 dmix 时实际设置的缓冲区大小不同、这可能是也可能不是唯一的问题、但在不确保 gstreamer 具有与实际设置的缓冲区大小和周期大小正确的视图的情况下重复测试没有意义、因此我们建议在始终启动之前在 asound.conf 和 gstreamer 命令中放置相同的缓冲区大小和周期大小。

    2)与 audiotestsrc ! alsasink 流水线、您在同一线程上运行两个元素、我看到上游元素(即 audiotestsrc)也会使用 CPU 生成实时音频模式并发送到下游、以防其中一个元素由于调度延迟或其他原因而瞬间延迟、它会阻止另一个元素。 因此、我们建议在前面注释中共享的队列元素之间放置一个队列元素。

    3)我还没有看到关于 McASP/DMA 软件/硬件或时钟偏移导致问题的任何证据,如果确实有一些问题,那么理想情况下,也应该发生不使用 dmix 插件,所以不确定 dmix 插件是否做了一些额外的,没有被 gstreamer 锁存(例如缓冲区大小/周期大小是其中一个)

    4)我不能评论它如何与其他一些硬件运行良好(可能 dmix 设置和 gstreamer 设置之间的偏差不大或没有影响,或它默认为一些其他缓冲区配置或环境提供更好的 CPU 延迟),但我不建议使用相同的流水线进行测试,但不确保 dmix 和 gstreamer 具有一致的缓冲区配置视图。

    您是否可以尝试在结尾提供建议、即在两者之间添加队列元素、并确保 gstreamer 和 asound.conf 的 buffer-size 和 period-size 设置为相同、这与 Suren 先前评论中共享的相同 ?

    此致

    Devarsh