首页 > 解决方案 > 在 jackclient-python 上运行 jack.Client() 的问题(可能在 ALSA 配置上)

问题描述

我正在尝试从Ubuntu 18.04 64 位上的MIDI 键盘读取 MIDI 输入。

我决定使用JACK Audio Connection Kit (JACK) Client for Python。安装后我想运行一个简单的程序来打印所有收到的 MIDI 事件。

但是跑完之后

client = jack.Client('MIDI-Monitor')

我收到了

ALSA: Cannot open PCM device alsa_pcm for playback. 
      Falling back to capture-only mode
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel

起初我检查了 MIDI 键盘是否正常工作。我使用了 Kmidimon,当我按下按键时我看到了事件。所以 MIDI 键盘可以工作。

然后我在网上搜索并尝试了以下操作:使用该命令并让它在后台运行jackd -R -d alsa -d hw:0,3(以及所有可能的组合,0 表示卡号,3 表示设备号,另请参阅命令的响应aplay -l

资料来源: https ://askubuntu.com/questions/320946/jackd-does-not-work-aplay-l-shows-two-instances-of-the-same-card-ubuntu-13-04

但是当我按下 MIDI 键盘上的按钮时,python 程序没有响应我的事件。

这是命令响应的一部分aplay -l

card 0: HDMI [HDA Intel HDMI], device 3: HDMI 0 [HDMI 0]
card 0: HDMI [HDA Intel HDMI], device 7: HDMI 1 [HDMI 1]
card 0: HDMI [HDA Intel HDMI], device 8: HDMI 2 [HDMI 2]
card 0: HDMI [HDA Intel HDMI], device 9: HDMI 3 [HDMI 3]
card 1: PCH [HDA Intel PCH], device 0: ALC892 Analog [ALC892 Analog]
card 1: PCH [HDA Intel PCH], device 1: ALC892 Digital [ALC892 Digital]

你能帮我指出问题出在哪里吗?

标签: jack

解决方案


重点是,我们需要给出正确的命令来使用正确的驱动程序、设备 ID 和可能的 MIDI 端口来启动jack 服务器。

使用以下命令在后台运行 jack server:

sudo jackd -d alsa -d hw:2,0 -X seq

“-d alsa”表示将使用 ALSA 驱动程序。

“-d hw:2,0 -X seq”是“-d alsa”的后端选项

“-d hw:2,0”表示要使用的ALSA pcm设备,以及所有可能的组合,2表示卡号,0表示设备号,信息可以在命令的响应中找到aplay -l(在这个底部回答)

“-X seq”表示指定一组对应于每个 ALSA“sequencer”客户端的 JACK MIDI 端口(包括机器上的每个硬件 MIDI 端口)

该命令的可能工作响应如下所示:

   jackdmp 1.9.12
   Copyright 2001-2005 Paul Davis and others.
   Copyright 2004-2016 Grame.
   Copyright 2016-2017 Filipe Coelho.
   ... (some lines omitted)
   JACK server starting in realtime mode with priority 10
   self-connect-mode is "Don't restrict self connect requests"
   audio_reservation_init
   Acquire audio card Audio2
   creating alsa driver ... hw:2,0|hw:2,0|1024|2|48000|0|0|nomon|swmeter|-|32bit
   configuring for 48000Hz, period = 1024 frames (21.3 ms), buffer = 2 periods
   ALSA: final selected sample format for capture: 32bit integer little-endian
   ALSA: use 2 periods for capture
   ALSA: final selected sample format for playback: 32bit integer little-endian
   ALSA: use 2 periods for playback
   port created: Midi-Through:midi/playback_1
   port created: Midi-Through:midi/capture_1
   port created: CME-M-Key:midi/playback_1
   port created: CME-M-Key:midi/capture_1
   port created: KMidimon:midi/playback_1
   port created: KMidimon:midi/capture_1

以下是 command 的部分输出aplay -l,其中显示了关于卡 2的信息

   card 2: PCH [HDA Intel PCH], device 0: ALC892 Analog [ALC892 Analog]
   Subdevices: 1/1
   Subdevice #0: subdevice #0

资料来源:

jackd 的手册页:https ://www.mankier.com/1/jackd

网上类似的解决方案:https ://askubuntu.com/questions/320946/jackd-does-not-work-aplay-l-shows-two-instances-of-the-same-card-ubuntu-13-04


推荐阅读