【问题标题】:Why is there latency in this C++ ALSA (Linux audio) program?为什么这个 C++ ALSA(Linux 音频)程序有延迟?
【发布时间】:2021-12-11 08:20:03
【问题描述】:

我正在探索在 Ubuntu Linux 中使用 C++ 生成声音。这是我的代码:

#include <iostream>
#include <cmath>
#include <stdint.h>
#include <ncurses.h>

//to compile: make [file_name] && ./[file_name]|aplay


int main()
{
    initscr();

    cbreak();
    noecho();
    nodelay(stdscr, TRUE);

    scrollok(stdscr, TRUE);
    timeout(0);

   for ( int t=0;; t++ )
      {

     int ch = getch();
     if (ch == 'q')
     {
         break;
     }

      uint8_t temp = t;
      std::cout<<temp;

    }
}

运行此代码时,我希望它发出声音,直到我按键盘上的“q”,然后我希望程序退出。这很好用;但是,在按下键盘和程序退出之间存在明显的延迟。这不是由于 ncurses 的延迟,因为当我在没有 std::cout&lt;&lt;temp; 的情况下运行程序时(即不产生声音),没有延迟

有办法修改吗?如果不是,如何编写实时响应式音频程序?

欢迎对该问题进行编辑和提出建议。我是 ALSA 的新手,所以我不确定是否需要任何其他详细信息来复制该错误。

【问题讨论】:

    标签: c++ linux audio alsa


    【解决方案1】:

    上述循环中的延迟很可能是由于 ncurses getch 函数引入的延迟。

    通常,对于实时音频,您需要运行实时音频线程和运行非实时用户控制线程。用户控制线程可以改变实时音频线程的内存空间,从而强制实时音频循环根据需要调整合成。

    在这个 gtkIOStream 示例中,创建了一个 full duplex audio classprocess method in the class 可以编译您的合成计算。这将使用 ALSA 处理您的声音播放。

    要获得用户输入,一种可能性是通过继承 FullDuplexTest 类向类添加线程方法,如下所示:

    class UIALSA : public FullDuplexTest, public ThreadedMethod {
        void *threadMain(void){
            while (1){
              // use getchar here to block and wait for user input
              // change the memory in FullDuplexTest to indicate a change in variables
            }
            return NULL;
        }
    public:
        UIALSA(const char*devName, int latency) : FullDuplexTest(devName, latency), ThreadedMethod() {};
    };
    

    然后将 original test file 中对 FullDuplexTest 的所有引用更改为 UIALSA(您可能必须修复一些编译时错误):

    UIALSA fullDuplex(deviceName, latency);
    

    您还需要调用 UIALSA::run() 以确保 UI 线程正在运行并侦听用户输入。您可以添加电话before you call "go"

    fullDuplex.run(); // start the UI thread
    res=fullDuplex.go(); // start the full duplex read/write/process going.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      相关资源
      最近更新 更多