Jack(音频)中哪个线程处理实时回调?

问题描述 投票:0回答:1

背景

我正在开发一个具有 Qt GUI 的应用程序,并使用 C++ 中的 Jack 进行音频处理。

为了将 GUI 与音频处理分离,我希望它们在不同的线程中运行。 可能还涉及其他附加线程。

问题

系统如何确定通过jack_set_process_callback注册的音频回调正在哪个线程中运行? 知道这一点决定性的,即。如果涉及更多线程。

简化的伪代码

JackClient::run
启动一个单独的线程,该线程将自身设置为睡眠状态,但用于处理通过
jack_set_process_callback
注册的音频回调。

它似乎有效 - 音频回调由休眠的专用音频头处理 - 但是为什么

main.cpp:

#include ".../model/model.h"
#include ".../view/mainwindow.h"
#include "controller.h"
#include ".../audio/jack.h"

#include <QApplication>

int main(int argc, char *argv[])
{
  // 1. Init Jack Client
  // and start dedicated
  // dummy thread to process
  // audio:
  JackClient jack(...);
  {
    jack.init();
    jack.run(); // <- start audio thread
  }

  // 2. Start GUI
  // and run GUI mainloop
  // in main thread:
  QApplication a(argc, argv);
  auto model = Model(...);
  auto view = MainWindow();
  Controller controller(
      &model,
      &view,
      &jack,
      viewResolution
  );
  controller.run(); <- GUI main loop

  auto ret = a.exec();

  // stop audio thread:
  jack.exit();

  return ret;
}

jack.cpp:

// the audio callback:
int processAudio(
    jack_nframes_t nframes,
    void* arg
);

MaybeError JackClient::init() {
    {
      jack_status_t status;
      jack_options_t options = JackNullOption;
      client = jack_client_open(
          clientName,
          options,
          &status
      );
      if( !client ) {
        throw QString("error opening client");
      }
    }
    // set process callback:
    jack_set_process_callback(
        client,
        &processAudio,
        this
    );
    // create ports:
    ...
  
  return {};
}

MaybeError JackClient::run() {
  if( jack_activate(client) ) {
    return "cannot activate client";
  }
  workerStop = false;
  worker = std::thread([this]{
      while(!workerStop) {
        sleep(1);
      };
  });
  return {};
}

void JackClient::exit() {
  if(!client) {
    return;
  }
  workerStop = true;
  worker.join();
  jack_client_close(
      client
  );
}

我阅读了Jack文档并查看了官方的示例客户端,但找不到任何好的解释,甚至找不到在哪里搜索的提示。

audio callback real-time jack
1个回答
0
投票

我认为,jack 隐式创建了一个新线程,在其中执行回调函数。我修改了 simple_client.c 以在 main() 和 process() 中打印线程 id,并得到两个不同的线程 id。

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