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.

[参考译文] Linux/TMS320DM365:什么可能会导致 ALSA for Linux 中的音频捕获短路?

Guru**** 2537240 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/638275/linux-tms320dm365-what-may-cause-audio-capture-short-in-alsa-for-linux

器件型号:TMS320DM365

工具/软件:Linux

尊敬的 TI 专家:

我的客户遇到了短音频捕获数据问题。 我总结一下已确认的要点。
由于此函数是在填充帧数据之前返回的、因此原因似乎是"snd_PCM_READI ()"函数。 即、捕获数据持续时间应为20ms、但当此问题发生时、该函数在5~6ms 返回。
2.它取决于音频数据的采样率。如果设置较高的采样率,则可能会出现此问题。

请允许我确认以下问题。
[问题1-1]
如果缓冲区中没有 PCM 数据、则 SND_PCM_READI ()的返回值将为"-32"。
这种理解是否正确?
[问题1-2]
如果我的理解是正确的,那么 SEND_CPM_READI()返回"320"值的原因是什么?
[Questin.1-3]
出现"Send_PCM_READI ()"上的"-32"(EPIPE)返回值的原因是什么?

此致。
Kaka

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

    您好、Kaka、

    [问题1-1]如果缓冲区中没有 PCM 数据、则 SND_PCM_READI ()的返回值将为"-32"。
    这种理解是否正确?
      它表示流遇到了不可恢复的错误。 这可能是因为缓冲器上溢或下溢。

    [Questin.1-3]发生"Send_PCM_READI ()"上"-32"(EPIPE)返回值的原因是什么?
      正如我在上面提到的、这可能是因为缓冲器处理不当。

    为了找出问题的根本原因、您能否提供有关内核版本、DVSDK 版本、音频编解码器、从启动到音频捕获的 dmesg 日志的更多详细信息。

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

    大家好、TI 专家、

     

    我们从客户那里得到了详细信息。

     - DVSDK 版本:TI-DVSDK_DM365-EVM_4_02_00_06

     -内核版本:2.6.32.17-davinci1

     ALSA 的主要参数

       SampleRate = 16000

       -通道= 1

       周期大小= 160

       缓冲区时间= 50000

       -最小可用值= 160

       - START_THRESHOLD = 1

       - STOP_THRESHOLD = 8000

     

    我们尝试通过 DM365EVM 和 DVSDK (4_02_00_06)示例代码实现相同的行为并获取日志。

    (请参阅随附的"TeraTerm.log"文件。)

     首先、我们在短时间内执行"DMAI_DEBUG=2 ./AUDIO_ENDE1_DM365.x470MV -n 100"以查看详细信息。

     然后、我们执行"./AUDIO_ENDE1_DM365.x470MV -n 3000"来捕获日志、包括问题。

     

    基于 SDK 客户详细信息的主要代码修改如下:

    (请参阅随附的三个"xxxx.c"文件。)

     - dmi_2_20_00_15/packages/ti/sdo/dmi/apps/audi_encode1/appMain.c

        > Sound_Attrs sAttrs = Sound_Attrs_Mono_default;//从 Sound_Attrs_Stereo 默认修改;

     - dmi_2_20_00_15/packages/ti/sdo/dmi/linux/Sound.c

        > const Sound_Attrs Sound_Attrs_Mono_default ={

        >16000   、//从8000修改、

        >       1、

        >     127、

        >     127、

        >   Sound_Mode_FULLDUPLEX、

        >   Sound_Input_MIC、

        >   Sound_Std_ALSA、

        >160     ,//从2048修改,};

     - dmi_2_20_00_15/packages/ti/sdo/dmi/linux/Sound_alsa.c

        > AVAIL = SND_PCM_AVALE_UPDATE (hSound->rcIn); //添加

        > printf ("\tbefor:numSamples=%ld、AVA=%ld、numSamples、AVAIL);//添加

        >

        > numSamples = snd_PCM_READI (hSound->rcIn、bufPtr、readSamples);

        >

        > AVAIL = SND_PCM_AVALE_UPDATE (hSound->rcIn);//添加

        > printf ("\tafter:numSamples=%ld、AVA=%ld、numSamples、AVAIL);//添加

      

    在第3956行的日志中可以看到如下问题:

      -有时 SND_PCM_READI ()执行周期似乎很短。

        (在本例中、我们发现38ms (=17:49:57.0445[ms]-17:49:57.007[ms])  

      -通常,读取2048个样本时,snd_PCM_READI ()执行周期约为130个。

    [Mon Dec 04 17:49:56.876 2017]#        befor:numSamples=0、ava=736

    [2017年12月4日星期一17:49:56.975 ]        之后:numSamples=2048、ave=291

    [Mon Dec 04 17:49:57.007 2017]#        befor:numSamples=0、ava=768

    [2017年12月4日星期一17:49:57.013 ]        之后:numSamples=2048、ave=6849

    [Mon Dec 04 17:49:57.045 2017]#        befor:numSamples=0、ave=7360

     

    问题:

     -为什么 snd_PCM_READI ()会在短时间内返回?

        在本例中,似乎听到了旧的样本数据声音。

        因此,当出现“After:numSamples=2048”消息时,整个声音数据更新似乎没有完成。  

     

    您是否看到我们随附代码的相同体验?

     

    如果您告诉我们如何解决此问题、我们将不胜感激。

    如果您检查并尝试使用附加的 c 源代码在 DM365EVM 上运行、我们也将不胜感激。

     

    此致、

    e2e.ti.com/.../Sound_5F00_alsa.c

    e2e.ti.com/.../Sound.c

    e2e.ti.com/.../appMain.c

    e2e.ti.com/.../6404.teraterm.log

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

    您好!

    你有更新吗?
    现在、我们的客户等待答案的时间太长了。

    如果您能告诉我们这方面的进展情况、我们将不胜感激。

    此致、

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

    您好,

      您是否能够使用 aplay/arecord 命令或 gstreamer 播放/录制音频?

    请找到附加的链接、该链接可能会提供一些有关使用方法的信息。

    e2e.ti.com/.../406165

    很遗憾、我没有硬件来测试您的修改。

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

    我正在以48kHz 的频率捕获6个立体声通道(FPGA -> TDM 协议-> MCASP2 DM8168)

    我遇到了类似的问题:
    有时,似乎听到旧的样本数据声音
    ---- >在这种情况下:“snd_PCM_READI”函数执行时间在正常情况下仅为0或1ms,而不是13ms。

    我拒绝"snd_PCM_READI"函数返回的样本、但前提是执行时间低于在 somes 试用后定义的阈值(13/2)、因此超出了这个问题。

    但在进行一些搜索后,我发现了此帖子:
    e2e.ti.com/.../1709745

    我的问题似乎可以通过修复位于 arch/arm/common/edma.c 中的函数"edma_write_slot"来解决:

    e2e.ti.com/.../277294

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

    您好!

     

    非常感谢您的善意。

    我非常感谢为我们提供解决问题的线索。

     

    根据您的信息、您的问题似乎可以通过修复以下功能来解决。

     1:Davinci_PCM_Pointer

     2:EDMA_GET_POSITION

     3:EDMA_WRITE_SLOT

     4:需要 EDMA_READ_SLOT 来修复?

     

    我的理解是否正确?

    如果有任何缺失、请告诉我。

     

    我想知道如何修复这些函数。

    请告诉我详细信息。

     针对 Davinci_PCM_Pointer

     我可以在中找到7658.Davinci-PCM.c 的详细信息  

     http://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/717/t/277294

     

     EDMA_GET_POSITION 的示例

     有关详细信息、请访问 edma-get-position-race.txt

     http://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/717/t/277294

     

     但我无法找到如何修复 E2E 主题中的 EDMA_write_slot、您告诉我。

     

    如果您向我提供您修复的文件、我将不胜感激;

      - Davinci-PCM.c

      - arch/arm/common/edma.c

     

    我想尝试修复我的文件并根据您的建议运行应用程序。

     

    此致、

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

    您好!

    很抱歉、我在帖子中犯了一个错误。 我没有修改"EDMA_write_slot "函数"。

    我只修改   了文件 EDMA-Get-POSITION .txt 中"arch/arm/common/EDMA.c"处的"EDMA_GET_POSITION "函数。

    此致

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

    我理解"您的问题似乎只能通过修复"EDMA_GET_POSITION "函数来解决"。

    我想尝试修复我的文件。

    此致、
    --