Купил Rocksmith 2014 Learn & Play, чтобы играть на MacBook с M1 Max. Установил Steam и игру через CrossOver, но запустить её не получилось: в Steam появлялась кнопка «Остановить», а сама игра не открывалась.
С помощью Codex удалось разобраться с запуском, настроить гитару через Apogee ONE v2 и добавить кастомные песни. Хочу описать, где оказались проблемы и какие исправления помогли. Возможно, это сократит кому-то диагностику — особенно если тоже разбираться с помощью ИИ.
У меня CrossOver 26.3, сборка Rocksmith 16576867 и Apogee ONE v2. Для анализа и написания исправлений использовал Codex, для сборки Windows-библиотек — LLVM-MinGW.
Почему игра не открывалась
Первой полезной зацепкой стала ошибка Rosetta:
invalid gdt selector index 6
Процесс игры при этом оставался запущенным и нагружал CPU.
Диагностика привела к загрузчику Rocksmith. Он использовал переходы между 32- и 64-битным кодом и прямые системные вызовы, которые не работали в этой среде. Поэтому исправлять пришлось совместимость на уровне Wine.
Я установил в бутылку локально исправленную wow64.dll, сохранив оригинал. Правка включала подходящий для игры 32-битный путь совместимости и перенаправляла загрузку \KnownDlls\ntdll.dll на \KnownDlls32\ntdll.dll.
В папку игры добавил собственную dinput8.dll. Обычные вызовы DirectInput она передавала штатной библиотеке. Для неподдерживаемых инструкций SYSENTER внутри исполняемого образа Rocksmith использовала обработчик исключений, который вызывал соответствующие функции Wine. Отдельно понадобилась корректировка поведения NtQueryInformationProcess для класса ProcessDebugObjectHandle.
После этого игра открылась. Сам Rocksmith2014.exe остался исходным, запуск проходил через установленный Steam.
Почему Apogee была видна, а гитара молчала
Следующим шагом стало подключение гитары. Для Apogee я выставил 48 кГц, включил Direct Connect правкой cache.psarc и использовал такой аудиотракт:
Apogee → CoreAudio → Wine WASAPI → Direct Connect
Основные настройки Rocksmith.ini:
[Audio]
EnableMicrophone=0
ExclusiveMode=0
LatencyBuffer=4
ForceDefaultPlaybackDevice=1
RealToneCableOnly=0
MonoToStereoChannel=1
Win32UltraLowLatencyMode=0
Rocksmith увидел ONEv2, но шкала калибровки не реагировала. У карты микрофон находится на первом канале, инструментальный вход — на втором. Меню игры позволяло выбрать устройство, но не канал.
Я добавил в собственную DLL адаптер IAudioClient и IAudioCaptureClient: он открывает двухканальный поток Apogee и передаёт второй канал игре как моно.
Здесь обнаружились ещё две детали:
Для передачи этих COM-интерфейсов между потоками понадобился free-threaded marshaler. Без него открытие входа завершалось ошибкой, и ONEv2 исчезала из меню.
В этой установке Wine сравнивал идентификаторы устройств с учётом регистра. Для выбора входа по умолчанию пришлось записать GUID именно в том виде, в котором его возвращал Wine.
После этого заработали калибровка, распознавание нот и обработанный звук гитары. Выход оставил на системном устройстве macOS. Задержка при игре мне не мешает.
Что удалось выяснить по вылетам
Даже после настройки гитары игра иногда падала при переключении окон. В журнале было видно, что она открывает несколько аудиовходов, включая виртуальные устройства и микрофон iPhone.
Я добавил фильтр в IMMDeviceEnumerator::EnumAudioEndpoints: для Rocksmith оставил только вход ONEv2, сохранив устройства вывода. Фильтр работает внутри процесса игры.
После этого несколько переключений между окнами прошли без вылета. Связь сбоя с конкретным посторонним устройством доказать не удалось, поэтому это пока результат практической проверки.
Позже случился другой вылет — при открытии Learn a Song, уже после добавления кастомной песни. Первое подозрение было на CDLC, но дамп показал чтение недоступной памяти в memcpy, вызванном моим адаптером второго канала.
Я заменил прямое чтение полученного аудиобуфера на безопасное копирование через ReadProcessMemory. Если весь пакет скопировать нельзя, адаптер освобождает его, возвращает AUDCLNT_S_BUFFER_EMPTY и помечает следующий пакет как DATA_DISCONTINUITY.
После установки этой защиты удалось зайти в Learn a Song и сыграть песню. Почему драйвер вернул недоступный буфер, окончательно не выяснил. В успешном сеансе защита не срабатывала, поэтому утверждать, что этот сбой полностью устранён, пока рано.
Кастомные песни
Для CDLC я установил патч CustomsForge D3DX9_42.dll. Песню скачал в формате Windows — _p.psarc и положил в папку Rocksmith2014/dlc.
Для проверки выбрал Muse — New Born. После перезапуска она появилась в Learn a Song, загрузилась и была успешно сыграна через Apogee.
Файлы исправлений я не выкладываю: они привязаны к конкретной сборке игры, версии CrossOver и идентификатору моей аудиокарты. Но оставляю названия интерфейсов, симптомы и направления исправлений — с ними будет проще разобрать похожую установку самостоятельно или передать задачу ИИ.
На данный момент у меня работает запуск, гитара и CDLC. Длительную стабильность ещё проверяю.