LINUX.ORG.RU

EMU-0202 USB, невозможность убить jackd из-за broken pipe в ALSA

 , , ,


0

2

Скажу сразу, что проблема повторяется на всех вёдрах (generic, rt, lowlatency), проверил на двух дистрах: Fedora 19, UbuntuStudio 13.10.

В общем стартую джек с минимальным рабочим буффером (128) для E-MU 0202 USB, включаю guitarix, играю значит сижу. Постепенно происходят всяческие xrun-ы. А потом бац! И всё, зависон, звука нет, никаких сообщений от jackd об xrun-ах, только одно сообщение от альсы:

ALSA: prepare error for playback on "hw:USB" (Broken pipe)
UI в guitarix висит, пытаюсь прибить jackd по ^C, guitarix «отлипает» и сообщает о том, что jack упал. Но сам процесс jackd остаётся недобитым, и никак его после более не прибить, никакими SIGKILL-ами, никакими хардварными отключениями шнуров, он будет висеть до перезагрузки, и это НЕ defunct-процесс. В чём соль? Багофича? Можно как-то на этой карточке в реалтайме играть? Вот вывод jackd:
$ jackd -dalsa -dhw:USB -r96000 -p128
jackdmp 1.9.10
Copyright 2001-2005 Paul Davis and others.
Copyright 2004-2013 Grame.
jackdmp comes with ABSOLUTELY NO WARRANTY
This is free software, and you are welcome to redistribute it
under certain conditions; see the file COPYING for details
no message buffer overruns
no message buffer overruns
no message buffer overruns
JACK server starting in realtime mode with priority 10
audio_reservation_init
Acquire audio card Audio2
creating alsa driver ... hw:USB|hw:USB|128|2|96000|0|0|nomon|swmeter|-|32bit
configuring for 96000Hz, period = 128 frames (1.3 ms), buffer = 2 periods
ALSA: final selected sample format for capture: 24bit little-endian
ALSA: use 2 periods for capture
ALSA: final selected sample format for playback: 24bit little-endian
ALSA: use 2 periods for playback
JackEngine::XRun: client = gx_head_amp was not finished, state = Triggered
JackEngine::XRun: client = gx_head_fx was not finished, state = Triggered
JackAudioDriver::ProcessGraphAsyncMaster: Process error
JackEngine::XRun: client = gx_head_amp was not finished, state = Triggered
JackEngine::XRun: client = gx_head_fx was not finished, state = Triggered
JackAudioDriver::ProcessGraphAsyncMaster: Process error
JackEngine::XRun: client = gx_head_fx was not finished, state = Triggered
JackAudioDriver::ProcessGraphAsyncMaster: Process error
JackEngine::XRun: client = gx_head_fx was not finished, state = Triggered
JackAudioDriver::ProcessGraphAsyncMaster: Process error
JackEngine::XRun: client = gx_head_fx was not finished, state = Triggered
JackAudioDriver::ProcessGraphAsyncMaster: Process error
JackEngine::XRun: client = gx_head_fx was not finished, state = Triggered
JackAudioDriver::ProcessGraphAsyncMaster: Process error
JackEngine::XRun: client = gx_head_fx was not finished, state = Triggered
JackAudioDriver::ProcessGraphAsyncMaster: Process error
JackEngine::XRun: client = gx_head_fx was not finished, state = Triggered
JackAudioDriver::ProcessGraphAsyncMaster: Process error
JackEngine::XRun: client = gx_head_fx was not finished, state = Triggered
JackAudioDriver::ProcessGraphAsyncMaster: Process error
JackEngine::XRun: client = gx_head_fx was not finished, state = Triggered
JackAudioDriver::ProcessGraphAsyncMaster: Process error
JackEngine::XRun: client = gx_head_fx was not finished, state = Triggered
JackAudioDriver::ProcessGraphAsyncMaster: Process error
JackEngine::XRun: client = gx_head_fx was not finished, state = Triggered
JackAudioDriver::ProcessGraphAsyncMaster: Process error
JackEngine::XRun: client = gx_head_amp was not finished, state = Triggered
JackAudioDriver::ProcessGraphAsyncMaster: Process error
JackEngine::XRun: client = gx_head_amp was not finished, state = Triggered
JackEngine::XRun: client = gx_head_fx was not finished, state = Triggered
JackAudioDriver::ProcessGraphAsyncMaster: Process error
JackEngine::XRun: client = gx_head_fx was not finished, state = Triggered
JackAudioDriver::ProcessGraphAsyncMaster: Process error
JackEngine::XRun: client = gx_head_fx was not finished, state = Running
JackAudioDriver::ProcessGraphAsyncMaster: Process error
ALSA: prepare error for playback on "hw:USB" (Broken pipe)
JackAudioDriver::ProcessAsync: read error, stopping...
^CJack main caught signal 2
Cannot write socket fd = 11 err = Broken pipe
CheckRes error
Could not write notification
ClientNotify fails name = gx_head_amp notification = 12 val1 = 1 val2 = 5
А вот на встроенной шлакокарте в ноутбуке, — под Fedora 19 с RT-ведром от CCRMA можно спокойненько играть в реалтайме с 128 буффером с очень редкими xrun-ами. И вообще, ладно бы просто сыпались xrun-ы на EMU, но ведь тупо виснет намертво и не отлипает, картой не попользоваться до перезагрузки. Причём ребут возможен только топорным зажатием кнопки выключения, потому что система никак после такого зависона до конца не может выключиться, а ждёт пока jackd наконец завершится до бесконечности, ведь SIGKILL-ы ему не почём.

Это лечится? Как?

configuring for 96000Hz, period = 128 frames (1.3 ms), buffer = 2 periods

во-первых, USB-звуковушки рекомендуется использовать с буфером в три периода, во-вторых, а тебе не слишком жирно для поиграть на гитаре такие параметры? попробуй 48000/128/3, например

lazyklimm ★★★★★ ()
Ответ на: комментарий от lazyklimm

Ну я на 48 и играю обычно, просто 96 поставил, чтобы быстрее ситуацию воссоздать.

unclechu ()
Ответ на: комментарий от lazyklimm

Не успел даже начать играть:

$ jackd -dalsa -dhw:USB -r48000 -p128 -n3
jackdmp 1.9.10
Copyright 2001-2005 Paul Davis and others.
Copyright 2004-2013 Grame.
jackdmp comes with ABSOLUTELY NO WARRANTY
This is free software, and you are welcome to redistribute it
under certain conditions; see the file COPYING for details
no message buffer overruns
no message buffer overruns
no message buffer overruns
JACK server starting in realtime mode with priority 10
audio_reservation_init
Acquire audio card Audio2
creating alsa driver ... hw:USB|hw:USB|128|3|48000|0|0|nomon|swmeter|-|32bit
configuring for 48000Hz, period = 128 frames (2.7 ms), buffer = 3 periods
ALSA: final selected sample format for capture: 24bit little-endian
ALSA: use 3 periods for capture
ALSA: final selected sample format for playback: 24bit little-endian
ALSA: use 3 periods for playback
ALSA: prepare error for playback on "hw:USB" (Broken pipe)
JackAudioDriver::ProcessAsync: read error, stopping...
^CJack main caught signal 2
Cannot write socket fd = 13 err = Broken pipe
CheckRes error
Could not write notification
ClientNotify fails name = system notification = 1 val1 = 0 val2 = 0

unclechu ()

Почему зависает не знаю.

Может быть, повезёт и jackd можно будет прибить, если выгрузить модули звуковухи.

Загружены ли блобы видеокарт Nvidia или AMD? Висит ли что-то ещё на USB? Попробовать USB3.0 порт вместо USB2.0. Попробовать разрулить IRQ. Попробовать JACK1 вместо JACK2 (не шучу, может проканать такая тема). Попробовать что-нибудь полегче, например, Gentoo с минимальными конфигами ядра.

zezic ★★★★ ()
Ответ на: комментарий от zezic

Нет, драйвер AMD открытый, во всяком случае на сколько я понимаю, никаких каталистов и fglrx. USB3.0 порт отсутствует, да и карта эта не поддерживает USB3.0, только 2.0, да и вообще я мало карт видел с поддержкой USB3.0, если не ошибаюсь, — пока не одной, только слышал что такие бывают.

Разрулить IRQ — вот с этого места, если можно, поподробней.

unclechu ()
Ответ на: комментарий от anonymous

Потому что с 48 задержка красивее получается, лол. Учитывая то, что он играет на гитаре, ресемплинг не происходит, значит качество остаётся хорошим.

(Frames [or buffer]/Sample Rate) * Period = Theoretical (or Math-derived) Latency

( 128 / 48000 ) * 3 = 8

via linuxaudio.org

zezic ★★★★ ()
Ответ на: комментарий от unclechu

Если нет USB3.0, то ладно, но точно могу сказать, что USB2.0 звуковая карта на USB3.0 порте может вести себя не так как на USB2.0.

Про разруливание IRQ написано тут. Не стану пересказывать, но могу помочь разобраться, если возникнут трудности (хотя, не думаю что будут).

Я не заядлый гентушник, но обладатель двух USB звуковых карт, и обнаружил недавно, что JACK может вести себя по-разному на бинарных дистрибутивах с такими-то конфигами таких-то ядер и на другой собранной Linux системе с другим-то конфигом ядра.

zezic ★★★★ ()
Ответ на: комментарий от zezic

Собрал jack1, потыкал, с ним хотя бы пропали эти мёртвые зависоны, работает иной раз постабильнее (видимо из-за однопоточности). Но всё-равно на 128-и похрюкивает, до IRQ покрутить ещё не дошёл пока. Хочу попробовать перекинуть все системные процессы на одну пару ядер, а другую пару под не рутовый юзерспейс сделать, может тут что-то наклюнется.

unclechu ()
Ответ на: комментарий от unclechu

Интересное наблюдение, сейчас мониторю процессы во время залипаний, и когда происходят залипания — искы вылазят вверх. Дело выходит в иксах? Прерывания на видео гасят всё?

unclechu ()
Ответ на: комментарий от unclechu

Не могу тут чётко посудить, так как не имею необходимого опыта, но можно попробовать поподозревать иксы.

Вариант такой: запустить самые голые иксы, даже без композитинга, обычный TWM с xterm, например и посмотреть что будет.

zezic ★★★★ ()
Ответ на: комментарий от zezic

Попробовал OpenSUSE 13.1 с дефолтным гномошелом, дефолтное ведро. Играл часа полтора на 48000/96/3, ни единого xrun-а, эрика? Правда надо guitarix собрать новый, а то тут древний и с бородой. Но так или иначе в бубнтах у меня и на 512 залипать умудрялось, а на размере буффера в 96 так вообще бы не завелось. Бубунта для звука — не годно. OpenSUSE — годно!

unclechu ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.