Удалил libjack-dev, jackd стал нормально запускаться.
В проекте подключил динамическую библиотеку, все ок.
Но в реальном времени это все не работало по причине отсутствия у пользователя прав на риалтайм приоритет (cannot use real-time scheduling ...... 1: Operation not permitted)
Сделал риалтайм приоритет как написано в FAQ'e Jack'a:
http://jackaudio.org/faq/linux_rt_config.html
После этого jack нормально работает в реальном времени, но только из Qjackctl, если сконнектить вход на выход. В моей программе звук пропал. Код:
#include <QApplication>
#include "/usr/include/jack/jack.h"
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
jack_port_t *input_port;
jack_port_t *output_port;
int
process (jack_nframes_t nframes, void *arg)
{
jack_default_audio_sample_t *out =
(jack_default_audio_sample_t *) jack_port_get_buffer (output_port, nframes);
jack_default_audio_sample_t *in =
(jack_default_audio_sample_t *) jack_port_get_buffer (input_port, nframes);
memcpy (out, in, sizeof (jack_default_audio_sample_t) * nframes);
return 0;
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
jack_client_t *client = 0;
const char **ports;
client = jack_client_open("my_client", JackNoStartServer, NULL);
jack_set_process_callback (client, process, 0);
input_port = jack_port_register (client, "input",
JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
output_port = jack_port_register (client, "output",
JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
if (jack_activate (client)) {
fprintf (stderr, "cannot activate client");
return 1;
}
if ((ports = jack_get_ports (client, NULL, NULL, JackPortIsPhysical|JackPortIsOutput)) == NULL) {
fprintf(stderr, "Cannot find any physical capture ports\n");
exit(1);
}
if (jack_connect (client, ports[0], jack_port_name (input_port))) {
fprintf (stderr, "cannot connect input ports\n");
}
if ((ports = jack_get_ports (client, NULL, NULL, JackPortIsPhysical|JackPortIsInput)) == NULL) {
fprintf(stderr, "Cannot find any physical playback ports\n");
exit(1);
}
if (jack_connect (client, jack_port_name (output_port), ports[0])) {
fprintf (stderr, "cannot connect output ports\n");
}
return a.exec();
}
Если в debug'e пройти функцию jack_client_open:
Cannot open my_client client
Cannot read socket fd = 19 err = Success
CheckRes error
JackSocketClientChannel read fail
jack_set_process_callback called with a NULL client