Использование сервера Jack
h2. Jack Audio
Jack Audio Connection Kit (Jack) – звуковой сервер-демон, позволяющий с низкой задержкой соединять между собой так называемые «джэкифицированные» («jackified») приложения. Необходим для работы цифровых аудио рабочих станций записи, редактирования и сведения многодорожечного аудио. Через него можно соединять аудио и midi входы и выходы разных программ. Традиционным способом управления сервером jackd является программа QJackCtl.
Установка¶
Для установки звукового сервера Jack и графической утилиты для управления нужно выполнить следующие действия:
Windows¶
1. Скачать Jack Audio Connection Kit с (http://www.grame.fr/~letz/jack-1.9.7.tgz).
- Распаковать архив.
- Запустить Jack_v1.9.7_setup.exe из директории (куда распаковали)\bin\windows.
- Установить
Linux¶
Выполнить в консоли команды для установки демона и и графической утилиты:
sudo apt-get install jackd sudo apt-get install qjackctl
Запуск и настройка
h3. Windows
Находим в Пуск->Программы Jack v1.9.7 и запускаем Jack Portaudio, затем запускаем графическую утилиту Jack Control.
Linux¶
Выполняем в консоли команду:
sudo qjackctl
Программа qjackctl помимо собственно выполнения функции запуска и останова сервера обладает рядом дополнительных возможностей: • Диагностика работы сервера;
• Статистика работы сервера;
• Визуальное соединение звуковых приложений;
• Визуальный коммутатор MIDI-приложений.
Графическая утилита в Windows и Linux имеет одинаковый интерфейс:
{{Image("main_wnd.JPG","nolink")}}
На дисплее статуса работы, можно заметить слева два числа: одно без скобок, другое в скобках. Они отображают количество так называемых xrun’ов – когда Jack не успевает вовремя обработать буфер, что вызывает потерю данных при их передаче. Буква X в слове xrun означает under или overrun, в зависимости от возникшего положения. Overrun – это когда возникает попытка заполнить буфер данными, превышая его размер. Underrun – когда обработка сигнала не завершилась, однако подошло время что-то проиграть на выход – в этом случае в выходной буфер помещается тишина либо случайные сэмплы. Overrun’ы обычно случаются, когда звуковая карта не успевает вовремя выводить получаемые данные. На underrun влияет уже задержка обработки звука внутри звуковой программы. Число без скобок – последнее обнаруженное количество xrun’ов, а в скобках – накопительный счетчик, их общее количество со времени запуска сервера. Отсутствие xrun’ов и маленькая задержка – явления, противоречащие друг другу. Если один xrun возникает раз в несколько секунд при небольшой задержке – это приемлемо.
Настройка параметров (кнопка Setup) осуществляется в окошке:
{{Image("setup_wnd.JPG","nolink")}}
На задержку влияют в основном два параметра: «Periods/Buffer» и «Frames/Period». Чем больше кадров и чем больше периодов, тем больше задержка, но тем стабильнее звук, без щелчков. Снизу справа в отдельном поле пишется задержка с текущими настройками.
Так же все параметры можно указать при старте jackd из командной строки.
Визуальное соединение звуковых приложений осуществляется в окне Connections:
{{Image("connections_wnd.JPG","nolink")}}
В этом окне происходит управление звуковыми портами, в нем можно связывать Jack-клиенты между собой, перенаправляя звуковые потоки как угодно.
Использование¶
Напишем собственно джэкифицированное приложения для теста. Наше приложение будет принимать на вход звук с микрофона и передавать данные для проигрывания.
Первым делом нужно подключиться к серверу:
jack_client_t *client = NULL;
jack_port_t *jack_capt = NULL;
jack_port_t *jack_play = NULL;
client = jack_client_open("LocalClient", JackNullOption, NULL);
Далее зарегистрируем нужные порты:
jack_capt = jack_port_register (client, "in", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
jack_play = jack_port_register (client, "out", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
Устанавливаем callback для обработки данных:
jack_set_process_callback(client, jack_callback, NULL);
Запускаем нашего клиента:
jack_activate (client);
Функция для обработки данных:
int jack_callback(jack_nframes_t nframes, void *arg)
{
jack_default_audio_sample_t *ip, *op;
ip = (jack_default_audio_sample_t *)(jack_port_get_buffer (jack_capt, nframes));
op = (jack_default_audio_sample_t *)(jack_port_get_buffer (jack_play, nframes));
memcpy (op, ip, sizeof (jack_default_audio_sample_t) * nframes);
return 0;
}
После запуска нашей программы, в окне Connections появится наш клиент, и зарегистрированные порты:
{{Image("test_connections_wnd1.JPG","nolink")}}
Соединяем вручную наши порты
{{Image("test_connections_wnd2.JPG","nolink")}}
Скачать тест можно тут