Вопрос или проблема
Я пытаюсь запустить последнюю версию Stardew Valley в контейнере Docker, чтобы настроить его как сервер (для справки, я владею игрой и использую свою собственную купленную копию для этого, согласно инструкциям этого репозитория). Стоит отметить, что я сталкиваюсь с этой ошибкой с установленным модом Stardew Valley Expanded, если это как-то поможет. Этот контейнер будет работать на установке Debian.
Когда я пытаюсь его запустить, я получаю следующую ошибку:
Game.Initialize() поймал исключение при инициализации XACT.
Microsoft.Xna.Framework.Audio.NoAudioHardwareException (0x80004005): устройство OpenAL не удалось инициализировать, см. вывод консоли для подробностей.
в Microsoft.Xna.Framework.Audio.OpenALSoundController..ctor() в D:\GitlabRunner\builds\Gq5qA5P4\1\ConcernedApe\stardewvalley\MonoGame.Desktop\MonoGame.Framework\Platform\Audio\OpenALSoundController.cs:строка 117
в Microsoft.Xna.Framework.Audio.OpenALSoundController.EnsureInitialized() в D:\GitlabRunner\builds\Gq5qA5P4\1\ConcernedApe\stardewvalley\MonoGame.Desktop\MonoGame.Framework\Platform\Audio\OpenALSoundController.cs:строка 300
в Microsoft.Xna.Framework.Audio.SoundEffect.Initialize() в D:\GitlabRunner\builds\Gq5qA5P4\1\ConcernedApe\stardewvalley\MonoGame.Desktop\MonoGame.Framework\Audio\SoundEffect.cs:строка 196
в Microsoft.Xna.Framework.Audio.SoundEffect..ctor(MiniFormatTag codec, Byte[] buffer, Int32 channels, Int32 sampleRate, Int32 blockAlignment, Int32 loopStart, Int32 loopLength) в D:\GitlabRunner\builds\Gq5qA5P4\1\ConcernedApe\stardewvalley\MonoGame.Desktop\MonoGame.Framework\Audio\SoundEffect.cs:строка 153
в Microsoft.Xna.Framework.Audio.WaveBank..ctor(AudioEngine audioEngine, String waveBankFilename, Boolean streaming, Int32 offset, Int32 packetsize) в D:\GitlabRunner\builds\Gq5qA5P4\1\ConcernedApe\stardewvalley\MonoGame.Desktop\MonoGame.Framework\Audio\Xact\WaveBank.cs:строка 276
в StardewValley.Game1.Initialize() в D:\GitlabRunner\builds\Gq5qA5P4\1\ConcernedApe\stardewvalley\Farmer\Farmer\Game1.cs:строка 2229
Насколько я могу судить, это сообщение об ошибке исходит из MonoGame.Framework, если это добавляет какую-либо информацию для расследования того, что необходимо обработать. Вот ссылка на сообщение об ошибке в этом фреймворке.
Таким образом, похоже, что мне нужно какое-то аудиоустройство, которого, очевидно, нет в моем контейнере Docker. Я думаю, что если я смогу смоделировать достаточно аудиоустройства, чтобы удовлетворить это требование, это позволит мне обойти эту ошибку. Но я не уверен, как это сделать. Все инструкции, которые я видел (включая использование pulseaudio), похоже, описывают, как передать аудио на хост-систему, чтобы я мог его слышать, но, честно говоря, мне совсем не нужно его слышать, мне просто нужно, чтобы игра думала, что она настроена. Это возможно?
Ответ или решение
Симуляция аудиоустройства в Debian для работы Stardew Valley в контейнере Docker
При запуске Stardew Valley в Docker-контейнере на Debian, с установленным модом Stardew Valley Expanded, вы столкнулись с ошибкой, связанной с отсутствием доступного аудиоустройства. Конкретно, проблема высвечивается как Microsoft.Xna.Framework.Audio.NoAudioHardwareException
, что указывает на то, что игра не может инициализировать аудиоборудование OpenAL.
Зачем нужна симуляция аудиоустройства?
Контейнеры Docker, по своей природе, изолированы от хост-системы и, как правило, не обеспечивают доступ к аппаратным ресурсам, таким как звуковое оборудование. SDK MonoGame, на котором работает Stardew Valley, ожидает наличия хотя бы виртуального аудиоустройства для инициализации аудиомодуля. Однако вы можете легко обойти это ограничение, используя симуляцию аудиоустройства.
Шаги по симуляции аудиоустройства
Для симуляции аудиоустройства в Debian вы можете использовать библиотеку snd_dummy
, которая является пустым аудиодрайвером для Linux и идеально подходит для вашей цели. Следуйте приведенным ниже инструкциям для реализации этой симуляции:
-
Установка необходимых пакетов
Запустите следующий набор команд для установки необходимых аудиопакетов и необходимых зависимостей:
sudo apt update sudo apt install pulseaudio pulseaudio-utils
-
Запуск PulseAudio в режиме демона
Для начала нам необходимо запустить демона PulseAudio в контейнере:
pulseaudio --start
-
Создание виртуального аудиоустройства
Теперь создайте конфигурацию виртуального устройства. Для этого откройте файл конфигурации PulseAudio с помощью текстового редактора:
pactl load-module module-null-sink sink_name=Virtual_Sink sink_description="Virtual Audio Sink"
Эта команда создаст виртуальное аудиоустройство, которое будет использовано игрой для звукопередачи.
-
Настройка контейнера Docker
Убедитесь, что ваш контейнер настроен для использования PulseAudio. При запуске контейнера добавьте следующие параметры:
docker run -d \ --rm \ --name my_stardew_server \ --device /dev/snd \ -e PULSE_SERVER=unix:/tmp/pulse.sock \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -v /run/user/$UID/pulse/native:/run/user/1000/pulse/native \ <имя_образа>
-
Проверка работы
После успешного создания виртуального устройства и запуска контейнера проверьте, может ли игра правильно инициализироваться без ошибок. Вы можете просмотреть журналы, если у вас по-прежнему возникают проблемы, используя:
docker logs my_stardew_server
Заключение
Симуляция аудиоустройства в контейнере Docker на Debian позволяет обойти ограничения отсутствия физического аудиоустройства и запускать Stardew Valley с установленными модами. Проведенные вами шаги по настройке PulseAudio и виртуального аудиоустройства значительно упростят вашу задачу и обеспечат корректную работу игры в серверном режиме. Удачи в ваших начинаниях!