我正在开发一个具有 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 隐式创建了一个新线程,在其中执行回调函数。我修改了 simple_client.c 以在 main() 和 process() 中打印线程 id,并得到两个不同的线程 id。