You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SuperCollider执行Routine后无法发声及Jack服务器异常求助

环境信息

  • SuperCollider版本:3.13.0
  • 操作系统:Void Linux
  • 架构:i686
  • 配置:nvim搭配scnvim
  • Jack版本:1.9.22

问题触发过程

我在Routine中使用循环触发声音,但忘记添加.wait。立即停止SClang解释器,等待操作完成后重启了系统。

重启后启动Jack(jackd -d alsa)并运行SuperCollider,首次执行该Routine时一切正常,但停止Routine后,scsynth服务器虽显示节点正常却无法发声。关闭Jack时出现以下错误日志:

Jack main caught signal 2
Cannot write socket fd = 18 err = Broken pipe
CheckRes error
Could not write notification
ClientNotify fails name = system notification = 1 val1 = 0 val2 = 0
Released audio card Audio0
audio_reservation_finish

若通过SuperCollider的s.boot启动Jack,会出现同样的发声问题,且Jack服务器无法停止:jack_control exit返回--exit,jack_control status显示stopped,但qjackctl显示Jack仍在运行,启动新服务器时提示'default' server already active。

此外,s.quit也无法关闭scsynth服务器。手动重启sclang后,scsynth仍在运行:无需启动即可发声,但再次执行Routine并停止后,又无法播放任何声音。

该问题似乎源于SuperCollider:当SC无法发声时,Audacity等其他程序可通过Jack服务器正常播放音频。

问题总结:SuperCollider可正常播放各类合成器,但Routine仅能执行一次;执行后无法播放任何声音(包括再次执行该Routine)。

涉事Routine代码

(
var bpm, beat, tatum, map;
s = Server.default;
bpm = 130;
beat = 60 / bpm;
tatum = beat / 4;

map = Dictionary[
  $k -> \kick, // kick is a synth!
];

Routine({
  loop {
    "kkkkkk".do { |character|
      if(character == $.) {
        tatum.wait;
        } {
          if(map[character].notNil) {
            s.bind { Synth(map[character]); 
            tatum.wait;
          };
        };
      };
    };
  };
}).play;
)

我已尝试以下操作:

  1. 重新初始化Jack和scsynth服务器
  2. 重新初始化sclang
  3. 重新安装Jack包
  4. 重新安装SuperCollider包
  5. 多次重启系统

以上操作均未解决问题。

补充:若先启动scsynth,SuperCollider输出窗口无错误信息。

2024年6月24日补充

如前所述,先启动Jack再启动scsynth时,Routine可正常执行一次,第二次执行失败。我尝试在依次运行s.boot和s.quit时开启Jack verbose日志,首次启动正常,第二次启动时服务器无法启动且Jack立即崩溃,完整Jack日志如下:

Jack: JackPosixThread::StartImp : create non RT thread
Jack: JackPosixThread::ThreadHandler : start
Jack: JackDriver::Open capture_driver_name = hw:0
Jack: JackDriver::Open playback_driver_name = hw:0
Jack: Check protocol client = 9 server = 9
Jack: JackEngine::ClientInternalOpen: name = system
Jack: JackEngine::AllocateRefNum ref = 0
Jack: JackLinuxFutex::Allocate name = jack_sem.1000_default_system val = 0
Jack: JackEngine::NotifyAddClient: name = system
Jack: JackGraphManager::SetBufferSize size = 1024
Jack: JackConnectionManager::DirectConnect first: ref1 = 0 ref2 = 0
Jack: JackGraphManager::ConnectRefNum cur_index = 0 ref1 = 0 ref2 = 0
Jack: JackDriver::SetupDriverSync driver sem in flush mode
audio_reservation_init
Acquire audio card Audio0
creating alsa driver ... hw:0|hw: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: 16bit little-endian
ALSA: use 2 periods for playback
Jack: JackPosixThread::StartImp : create non RT thread
Jack: JackSocketServerChannel::Open
Jack: JackServerSocket::Bind : addr.sun_path /dev/shm/jack_default_1000_0
Jack: JackSocketServerChannel::BuildPoolTable size = 1
Jack: JackEngine::Open
Jack: JackClientSocket::Connect : addr.sun_path /dev/shm/jack_default_1000_0
Jack: JackEngine::ClientInternalOpen: name = freewheel
Jack: JackEngine::AllocateRefNum ref = 1
Jack: JackLinuxFutex::Allocate name = jack_sem.1000_default_freewheel val = 0
Jack: JackEngine::NotifyAddClient: name = freewheel
Jack: JackDriver::ClientNotify ref = 1 driver = system name = freewheel notify = 0
Jack: JackDriver::ClientNotify ref = 0 driver = freewheel name = system notify = 0
Jack: JackConnectionManager::DirectConnect first: ref1 = 1 ref2 = 1
Jack: JackGraphManager::ConnectRefNum cur_index = 0 ref1 = 1 ref2 = 1
Jack: JackDriver::SetupDriverSync driver sem in flush mode
Jack: JackGraphManager::SetBufferSize size = 1024
Jack: JackAlsaDriver::Attach fBufferSize 1024 fSampleRate 48000
Jack: JackEngine::PortRegister ref = 0 name = system:capture_1 type = 32 bit float mono audio flags = 22 buffer_size = 1024
Jack: JackGraphManager::AllocatePortAux port_index = 1 name = system:capture_1 type = 32 bit float mono audio
Jack: JackConnectionManager::AddOutputPort ref = 0 port = 1
Jack: JackEngine::ClientNotify: no callback for notification = 9
Jack: JackEngine::ClientNotify: no callback for notification = 9
Jack: JackAlsaDriver::Attach fCapturePortList[i] 1 
Jack: JackEngine::PortRegister ref = 0 name = system:capture_2 type = 32 bit float mono audio flags = 22 buffer_size = 1024
Jack: JackGraphManager::AllocatePortAux port_index = 2 name = system:capture_2 type = 32 bit float mono audio
Jack: JackConnectionManager::AddOutputPort ref = 0 port = 2
Jack: JackEngine::ClientNotify: no callback for notification = 9
Jack: JackEngine::ClientNotify: no callback for notification = 9
Jack: JackAlsaDriver::Attach fCapturePortList[i] 2 
Jack: JackEngine::PortRegister ref = 0 name = system:playback_1 type = 32 bit float mono audio flags = 21 buffer_size = 1024
Jack: JackGraphManager::AllocatePortAux port_index = 3 name = system:playback_1 type = 32 bit float mono audio
Jack: JackConnectionManager::AddInputPort ref = 0 port = 3
Jack: JackEngine::ClientNotify: no callback for notification = 9
Jack: JackEngine::ClientNotify: no callback for notification = 9
Jack: JackAlsaDriver::Attach fPlaybackPortList[i] 3 
Jack: JackEngine::PortRegister ref = 0 name = system:playback_2 type = 32 bit float mono audio flags = 21 buffer_size = 1024
Jack: JackGraphManager::AllocatePortAux port_index = 4 name = system:playback_2 type = 32 bit float mono audio
Jack: JackConnectionManager::AddInputPort ref = 0 port = 4
Jack: JackEngine::ClientNotify: no callback for notification = 9
Jack: JackEngine::ClientNotify: no callback for notification = 9
Jack: JackAlsaDriver::Attach fPlaybackPortList[i] 4 
Jack: Clock source : system clock via clock_gettime
Jack: JackServer::Start
Jack: JackThreadedDriver::Start
Jack: JackPosixThread::StartImp : create non RT thread
Jack: JackPosixThread::ThreadHandler : start
Jack: JackThreadedDriver::Init real-time
Jack: JackPosixThread::AcquireRealTimeImp priority = 10
Jack: JackPosixThread::StartImp : create non RT thread
Jack: JackPosixThread::ThreadHandler : start
Jack: JackSocketServerChannel::ClientCreate socket
Jack: JackSocketServerChannel::BuildPoolTable size = 2
Jack: JackSocketServerChannel::BuildPoolTable fSocketTable i = 1 fd = 15
Jack: JackRequest::Notification
Jack: JackDriver::ClientNotify ref = 1 driver = freewheel name = freewheel notify = 18
Jack: JackDriver::ClientNotify ref = 1 driver = freewheel name = freewheel notify = 18
Jack: JackDriver::ClientNotify ref = 1 driver = freewheel name = freewheel notify = 18
Jack: JackDriver::ClientNotify ref = 1 driver = freewheel name = freewheel notify = 18
Jack: JackEngine::ClientNotify: no callback for notification = 4
Jack: JackEngine::ClientNotify: no callback for notification = 4

---- S.BOOT IS EVALUATED: JACK DIES ----

Jack: JackSocketServerChannel::ClientCreate socket
Jack: JackSocketServerChannel::BuildPoolTable size = 3
Jack: JackSocketServerChannel::BuildPoolTable fSocketTable i = 1 fd = 15
Jack: JackSocketServerChannel::BuildPoolTable fSocketTable i = 2 fd = 16
Jack: JackSocketServerChannel::Execute : poll client error err = Success
Jack: JackSocketServerChannel::ClientKill ref = -1 fd = 16
Jack: Client was not opened : probably correspond to server_check
Jack: JackClientSocket::Close
Jack: JackSocketServerChannel::BuildPoolTable size = 2
Jack: JackSocketServerChannel::BuildPoolTable fSocketTable i = 1 fd = 15
Jack: JackSocketServerChannel::ClientCreate socket
Jack: JackSocketServerChannel::BuildPoolTable size = 3
Jack: JackSocketServerChannel::BuildPoolTable fSocketTable i = 1 fd = 15
Jack: JackSocketServerChannel::BuildPoolTable fSocketTable i = 2 fd = 16
Jack: JackRequest::ClientCheck
Jack: Check protocol client = 9 server = 9
Jack: JackRequest::ClientOpen
Segmentation fault

SuperCollider中的日志如下:

Booting server 'localhost' on address 127.0.0.1:57110.
Found 4 LADSPA plugins
Cannot read socket fd = 8 err = No such file or directory
CheckRes error
Could not read result type = 23
Cannot open SuperCollider client
JackShmReadWritePtr1::~JackShmReadWritePtr1 - Init not done for -1, skipping unlock
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
terminate called without an active exception
could not initialize audio.
Server 'localhost' exited with exit code 0.

2024年7月3日补充

我制作了两个视频展示问题:

  • 示例1:执行Routine前可发声,执行后无法发声及Jack错误信息。
  • 示例2:通过SC启动Jack导致故障,SC无法发声但Audacity可正常播放(该视频录制于示例1之后)。

内容的提问来源于stack exchange,提问作者Vestal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 21:38:14