LinuxForum.Fans
Тема

Не могу найти либы JACK'a

Автор: mezmay 10 сообщений 1864 просмотров
22.12.2014 12:11 · отредактировано #406372

Ubuntu 14.04,
установлен сервер работы с аудио jackd, нормально запускается через qjackctl.

Хочу написать программу, использующую jack API. Не знаю где лежат либы джека . Где и как их искать чтобы подключить в проект? Или надо их отдельно устанавливать?

22.12.2014 12:40 #406382

mezmay, :) они лежат там же, где и все пакеты.
/var/cache/apt/archives
А на сервере разработчиков Ubuntu вы можете подсмотреть исходный код.

22.12.2014 13:06 #406425

Я имею в виду статические библиотеки .a, необходимые для сборки проекта

22.12.2014 13:09 #406428

mezmay, :) я тоже. Вы бы хоть почитали информацию для азов, прежде чем такое городить.

22.12.2014 15:05 #406476
"mezmay" написал:
Я имею в виду статические библиотеки .a, необходимые для сборки проекта

веские причины для использования статики есть? или хотя бы обоснованное желание...

статические либы идут в libjack-dev... установлен?

22.12.2014 22:27 #406569
Fat-Zer написал:
[quote="mezmay"]Я имею в виду статические библиотеки .a, необходимые для сборки проекта

веские причины для использования статики есть? или хотя бы обоснованное желание...

статические либы идут в libjack-dev... установлен?[/quote]

После установки libjack-dev действительно появляются статические библиотеки, но перестаёт запускаться сервер jackd.
Статические библиотеки нужны для сборки проекта, использующего jack API. Разве можно без подключения статических библиотек собрать проект?

23.12.2014 01:41 #406595
"mezmay" написал:
После установки libjack-dev действительно появляются статические библиотеки, но перестаёт запускаться сервер jackd.

есть две версии jack'а: 1 и 2... версии libjack[-dev] для jackd1 и libjack-jackd2[-dev] для jackd2 соответственно... подозреваю, что ты используешь jackd2...
хотя переставать запускаться от установки пакетов оно всё равно не должно — это повод накатать телегу в багзиллу бубунты... похоже оба пакета используют симлинк libjack{,server}.so.0 для линковки....

а для второй статические либы не собраны... если они действительно нужны, то можешь или собрать сам или опять же написать в багзиллу...

"mezmay" написал:
Статические библиотеки нужны для сборки проекта, использующего jack API. Разве можно без подключения статических библиотек собрать проект?

конечно, используй динамику... использование статики в мире linux — моветон... к тому же со статикой есть лицензионные нюансы....

23.12.2014 13:13 · отредактировано #406634

Удалил 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, если сконнектить вход на выход. В моей программе звук пропал. Код:

text
#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:

text
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

23.12.2014 15:09 #406644
"mezmay" написал:
Если в debug'e пройти функцию jack_client_open:

strace'ом глянь, что он там пытается открыть и почему оно проваливается...

"mezmay" написал:
#include "/usr/include/jack/jack.h"

используй -I флаги компилятора вместо полных путей...

23.12.2014 17:02 #406660

Jack не хотел запускаться из-за маленького размера буфера (64 или меньше).
Выставил 128, нормально стал работать.
Спасибо за ответы!

Войдите или зарегистрируйтесь, чтобы ответить.