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; )
我已尝试以下操作:
- 重新初始化Jack和scsynth服务器
- 重新初始化sclang
- 重新安装Jack包
- 重新安装SuperCollider包
- 多次重启系统
以上操作均未解决问题。
补充:若先启动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

