Вопрос или проблема
Я столкнулся с проблемой, которая меня полностью запутала. Сначала немного информации о системе
Linux quasar-nixos-tr 4.19.87 #1-NixOS SMP Sun Dec 1 08:17:47 UTC 2019 x86_64 GNU/Linux
Теперь; я работаю с библиотекой для генерации звука/музыки под названием csound, и я вижу странную проблему.
Я использую слой над csound через Haskell; библиотека называется csound-expression
, и она просто генерирует файл csound на основе некоторого кода Haskell, а затем запускает его через csound.
Насколько я понимаю; csound затем направляет аудио на Alsa, который в моей системе пытается направить его через устройство default
PulseAudio.
Теперь на моей системе происходит что-то странное.
- После чистой загрузки, если я запускаю код, связанный с csound, я слышу звук. Но, как только я останавливаю выполнение этого кода, никакое другое приложение, похоже, не может больше подключиться к PA. Проверка с помощью
systemctl --user status pulseaudio.service pulseaudio.socket
показывает, что служба не работает, и она исчерпала максимальное количество попыток запуска. -
После чистой загрузки; если я запускаю какое-то другое приложение, скажем,
pavucontrol
; я теперь могу подключиться к службе PA, но мой Haskell код csound больше не может подключиться. Он вместо этого завершает работу с:λ> dac . osc $ 200 0dBFS level = 32768.0 --Csound version 6.13 (double samples) Jan 1 1970 [commit: none] libsndfile-1.0.28 UnifiedCSD: tmp.csd STARTING FILE Creating options Creating orchestra closing tag Creating score rtaudio: ALSA module enabled rtmidi: ALSA Raw MIDI module enabled Elapsed time at end of orchestra compile: real: 0.001s, CPU: 0.001s sorting score ... ... done Elapsed time at end of score sort: real: 0.001s, CPU: 0.001s displays suppressed 0dBFS level = 1.0 orch now loaded audio buffered in 256 sample-frame blocks ALSA lib pulse.c:243:(pulse_connect) PulseAudio: Unable to connect: Connection refused *** Cannot open device 'default' for audio input: Connection refused Failed to initialise real time audio input inactive allocs returned to freespace end of score. overall amps: 0.00000 overall samples out of range: 0 1 errors in performance Elapsed time at end of performance: real: 0.169s, CPU: 0.004s
В случае 1 (выше); я вижу что-то интересное в журналах, но я ограничен своим пониманием того, как работает PA, как работает Alsa и как оба эти компонента работают вместе:
Dec 16 09:28:16 quasar-nixos-tr systemd[1708]: Starting Sound Service...
Dec 16 09:28:16 quasar-nixos-tr pulseaudio[2382]: E: [pulseaudio] socket-server.c: bind(): Address already in use
Dec 16 09:28:16 quasar-nixos-tr pulseaudio[2382]: E: [pulseaudio] module.c: Failed to load module "module-esound-protocol-unix" (argument: ""): initialization failed.
Dec 16 09:28:16 quasar-nixos-tr pulseaudio[2382]: E: [pulseaudio] main.c: D-Bus name org.PulseAudio1 already taken.
Dec 16 09:28:16 quasar-nixos-tr systemd[1708]: pulseaudio.service: Main process exited, code=exited, status=1/FAILURE
Dec 16 09:28:16 quasar-nixos-tr systemd[1708]: pulseaudio.service: Failed with result 'exit-code'.
Dec 16 09:28:16 quasar-nixos-tr systemd[1708]: Failed to start Sound Service.
Dec 16 09:28:16 quasar-nixos-tr systemd[1708]: pulseaudio.service: Service RestartSec=500ms expired, scheduling restart.
Dec 16 09:28:16 quasar-nixos-tr systemd[1708]: pulseaudio.service: Scheduled restart job, restart counter is at 4.
Dec 16 09:28:16 quasar-nixos-tr systemd[1708]: Stopped Sound Service.
Dec 16 09:28:16 quasar-nixos-tr systemd[1708]: Starting Sound Service...
Dec 16 09:28:17 quasar-nixos-tr pulseaudio[2390]: E: [pulseaudio] socket-server.c: bind(): Address already in use
Dec 16 09:28:17 quasar-nixos-tr pulseaudio[2390]: E: [pulseaudio] module.c: Failed to load module "module-esound-protocol-unix" (argument: ""): initialization failed.
Dec 16 09:28:17 quasar-nixos-tr pulseaudio[2390]: E: [pulseaudio] main.c: D-Bus name org.PulseAudio1 already taken.
Dec 16 09:28:17 quasar-nixos-tr systemd[1708]: pulseaudio.service: Main process exited, code=exited, status=1/FAILURE
Dec 16 09:28:17 quasar-nixos-tr systemd[1708]: pulseaudio.service: Failed with result 'exit-code'.
Dec 16 09:28:17 quasar-nixos-tr systemd[1708]: Failed to start Sound Service.
Dec 16 09:28:17 quasar-nixos-tr systemd[1708]: pulseaudio.service: Service RestartSec=500ms expired, scheduling restart.
Dec 16 09:28:17 quasar-nixos-tr systemd[1708]: pulseaudio.service: Scheduled restart job, restart counter is at 5.
Dec 16 09:28:17 quasar-nixos-tr systemd[1708]: Stopped Sound Service.
Dec 16 09:28:17 quasar-nixos-tr systemd[1708]: pulseaudio.service: Start request repeated too quickly.
Dec 16 09:28:17 quasar-nixos-tr systemd[1708]: pulseaudio.service: Failed with result 'exit-code'.
Пользователь здесь находится в группах audio
и sound
, и я использую NixOS; что, вероятно, не имеет отношения к этой проблеме.
Может кто-то помочь понять, что здесь может происходить?
Также обратите внимание, что; в случае 2; alsamixer
правильно перечисляет все устройства.
Я наконец-то нашел проблему; я описал ее здесь, на случай, если кто-то другой столкнется с этим в будущем.
Ответ или решение
На основании описанного вами вопроса по поводу проблемы с Csound, ALSA и PulseAudio, имеет смысл рассмотреть несколько аспектов, которые могут быть причиной возникновения ошибки "Connection Refused".
1. Общая информация о системе
На системе установлена NixOS с ядром Linux версии 4.19.87. Вы используете библиотеку csound-expression
, которая генерирует файлы Csound и запускает их. Csound пытается передать аудиовыход через ALSA, который в свою очередь использует PulseAudio как устройство по умолчанию.
2. Первичные наблюдения
Во-первых, вы заметили, что:
- После перезагрузки системы, Csound работает, но после его завершения PulseAudio перестает функционировать, так как сервис не может стартовать повторно.
- Если сначала вы запускаете другие приложения, такие как
pavucontrol
, PulseAudio работает, но Csound не может установить соединение.
3. Логи PulseAudio
Из логов PulseAudio видно, что сервис не может запуститься из-за ошибки bind(): Address already in use
. Эта ошибка свидетельствует о том, что уже существует другой процесс, который использует тот же самый сокет, и это мешает PulseAudio запуститься.
4. Возможные причины и решения
4.1 Конфликт служб
- Проверьте запущенные процессы PulseAudio: Возможно, у вас запущено несколько экземпляров PulseAudio. Используйте команду
ps aux | grep pulse
для проверки. Если несколько экземпляров запущены, завершите лишние.
4.2 Неправильная конфигурация
- Настройки конфигурации: Убедитесь, что файл конфигурации PulseAudio не содержит ошибок. Просмотрите файлы конфигурации, такие как
~/.config/pulse/client.conf
и/etc/pulse/client.conf
, чтобы убедиться, что в них нет неправильных настроек.
4.3 Отказ в доступе
- Права доступа: Убедитесь, что ваш пользователь находится в группах
audio
иsound
, что вы уже сделали. Проверьте права доступа к аудиоустройствам с помощью командыls -l /dev/snd/
.
4.4 Состояние ALSA
- Проверка состояния ALSA: Используйте
alsamixer
для проверки состояния аудиоустройств. Убедитесь, что устройства не отключены и что уровень громкости достаточно высок.
5. Рекомендации по рефакторингу
Попробуйте перезапустить PulseAudio вручную с помощью команды:
pulseaudio --kill
pulseaudio --start
Также полезно будет перезагрузить систему, чтобы очистить все возможные блокировки ресурсов.
Заключение
Причин возникновения проблемы "Connection Refused" может быть несколько, включая конфликты служб, неправильные конфигурации и ограничения по правам доступа. Убедитесь, что PulseAudio управляется корректно и что у Csound есть доступ к необходимым устройствам. В случае, если проблема сохраняется, рассмотрите возможность обращения к документации по NixOS и поддержке PulseAudio для более детального изучения и устранения данной проблемы.
Если у вас есть дополнительные вопросы или необходима помощь, не стесняйтесь обращаться.