Ubuntu 14.04,
установлен сервер работы с аудио jackd, нормально запускается через qjackctl.
Хочу написать программу, использующую jack API. Не знаю где лежат либы джека . Где и как их искать чтобы подключить в проект? Или надо их отдельно устанавливать?
Не могу найти либы JACK'a
mezmay, :) они лежат там же, где и все пакеты.
/var/cache/apt/archives
А на сервере разработчиков Ubuntu вы можете подсмотреть исходный код.
Я имею в виду статические библиотеки .a, необходимые для сборки проекта
mezmay, :) я тоже. Вы бы хоть почитали информацию для азов, прежде чем такое городить.
Я имею в виду статические библиотеки .a, необходимые для сборки проекта
веские причины для использования статики есть? или хотя бы обоснованное желание...
статические либы идут в libjack-dev... установлен?
[quote="mezmay"]Я имею в виду статические библиотеки .a, необходимые для сборки проекта
веские причины для использования статики есть? или хотя бы обоснованное желание...
статические либы идут в libjack-dev... установлен?[/quote]
После установки libjack-dev действительно появляются статические библиотеки, но перестаёт запускаться сервер jackd.
Статические библиотеки нужны для сборки проекта, использующего jack API. Разве можно без подключения статических библиотек собрать проект?
После установки libjack-dev действительно появляются статические библиотеки, но перестаёт запускаться сервер jackd.
есть две версии jack'а: 1 и 2... версии libjack[-dev] для jackd1 и libjack-jackd2[-dev] для jackd2 соответственно... подозреваю, что ты используешь jackd2...
хотя переставать запускаться от установки пакетов оно всё равно не должно — это повод накатать телегу в багзиллу бубунты... похоже оба пакета используют симлинк libjack{,server}.so.0 для линковки....
а для второй статические либы не собраны... если они действительно нужны, то можешь или собрать сам или опять же написать в багзиллу...
Статические библиотеки нужны для сборки проекта, использующего jack API. Разве можно без подключения статических библиотек собрать проект?
конечно, используй динамику... использование статики в мире linux — моветон... к тому же со статикой есть лицензионные нюансы....
Удалил 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
Если в debug'e пройти функцию jack_client_open:
strace'ом глянь, что он там пытается открыть и почему оно проваливается...
#include "/usr/include/jack/jack.h"
используй -I флаги компилятора вместо полных путей...
Jack не хотел запускаться из-за маленького размера буфера (64 или меньше).
Выставил 128, нормально стал работать.
Спасибо за ответы!