1 (22.12.2014 12:26:49 отредактировано mezmay)

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

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

2

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

Linux Mint 19.3 Mate Edition
Windows 7

3

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

4

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

Linux Mint 19.3 Mate Edition
Windows 7

5

mezmay пишет:

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

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

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

95% процентов проблем находятся между клавиатурой и стулом.

6

Fat-Zer пишет:
mezmay пишет:

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

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

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

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

7

mezmay пишет:

После установки libjack-dev действительно появляются статические библиотеки, но перестаёт запускаться сервер jackd.

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

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

mezmay пишет:

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

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

95% процентов проблем находятся между клавиатурой и стулом.

8 (23.12.2014 13:48:24 отредактировано mezmay)

Удалил 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

9

mezmay пишет:

Если в debug'e пройти функцию jack_client_open:

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

mezmay пишет:

#include "/usr/include/jack/jack.h"

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

95% процентов проблем находятся между клавиатурой и стулом.

10

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