Хитрости маршрутизации звука в OS X: одновременный вывод на аналоговый выход и S/PDIF через Soundflower и AU Lab (когда не работает Агрегатное устройство)
Практическое решение проблемы одновременного вывода звука сразу на аналоговый линейный выход (Line Out) и цифровой оптический/коаксиальный выход (S/PDIF) с программной регулировкой громкости в Mac OS X с помощью виртуального драйвера Soundflower и микшера AU Lab из пакета Xcode.
- Основной автор
- @Dies Опубликовано 2008-11-28
- Раздел архива
- Ядро OSx86 10.X и архитектура загрузки
- Охват в архиве
- 212,798 просмотров · 5 отобранных заметок (из 6 исходных сообщений) · 2008-11-28 – 2011-11-13
- Участники обсуждения (5)
- @Dies (2)@Ianxxx@fahrvergnuugen@mr_murder@zorro23
- Справочник оборудования
- Mac USB Audio DACs ↗ SATA III & NVMe SSDs ↗ USB 3.2 Boot Flash Drives ↗
Не знаю, насколько эта ситуация специфична именно для моего железа, но решил поделиться своим решением — возможно, сама идея поможет тем, кто столкнулся с аналогичной задачей.
Когда я сам искал способ реализовать такую схему вывода звука, информация попадалась крайне скудная и давно устаревшая.
Одним из самых досадных неудобств при использовании OS X на нестандартном железе для меня стало то, что если любая другая ОС при наличии драйвера без проблем позволяет дублировать аудиопоток сразу на все доступные выходы звуковой карты, то звуковая подсистема CoreAudio в OS X устроена совершенно иначе.
После патчинга драйвера AppleHDA встроенный звук на моей плате завёлся отлично: определились и выход на наушники, и линейный выход (Line Out), и цифровой выход S/PDIF, и микрофон. Мне требовалось лишь одно — чтобы звук одновременно выводился и на аналоговый линейный выход, и на цифровой интерфейс S/PDIF. Во всех руководствах в сети утверждалось, что для этого достаточно создать в штатной утилите «Настройка Audio-MIDI» составное (Агрегатное / Aggregate) устройство — и всё якобы должно заработать само собой.
На практике же выяснилось следующее:
а) Стандартное Агрегатное устройство категорически отказалось выводить звук на оба интерфейса сразу — звук шёл только на тот выход, который стоял первым в списке.
б) Поскольку в Mac OS X для цифрового выхода S/PDIF штатная программная регулировка громкости с клавиатуры блокируется, даже в случае работы агрегатного устройства я бы лишился возможности управлять общей громкостью из системы.
В итоге спасительным решением стала связка бесплатного виртуального аудиодрайвера Soundflower ↗ и фирменного микшера AU Lab, входящего в состав пакета инструментов разработчика Xcode (/Developer/Applications/Audio/AU Lab.app). После установки Soundflower добавляет в систему два виртуальных аудиоустройства — 2-канальное и 16-канальное, а маршрутизацией потока между ними и физическими выходами занимается AU Lab.
Установив Soundflower и перезагрузив компьютер, я открыл утилиту «Настройка Audio-MIDI» (Audio MIDI Setup) и создал агрегатное устройство с именем Surround Sound, объединив в нём цифровой выход (Digital Out), аналоговый линейный выход (Line Out) и виртуальное устройство Soundflower (16ch). Затем я запустил AU Lab и в стартовом окне создания конфигурации добавил две выходные стереошины (Outputs) — одну для линейного выхода, вторую для S/PDIF.
На вкладке входов (Inputs) достаточно оставить один стереовход.
Самое главное: в качестве источника входного сигнала (Input Channels) я выбрал виртуальное устройство Soundflower (16ch),
а в качестве устройства вывода (Output Channels) указал созданное ранее агрегатное устройство Surround Sound и нажал Done.
В результате открылось окно микшера (см. скриншот).
Добавленные шины Bus 1 и Bus 2 работают своего рода предусилителями, делая звук громче и чище, а пустой неиспользуемый выход оставлен намеренно — без него в тракте периодически возникала неприятная обратная связь (наводки).
Пусть это решение и не назовёшь верхом изящества (и на выходе мы получаем дублированное стерео, а не дискретный многоканальный звук), но со своей задачей оно справляется на ура: у меня играют все 7 колонок и сабвуфер, и при этом полноценно работает программная регулировка громкости в системе! А если добавить сохранённый документ конфигурации AU Lab в объекты входа учётной записи (Login Items) со скрытием окна, вся схема запускается автоматически при старте системы и совершенно не мешает работе.
Надеюсь, кому-нибудь этот рецепт окажется полезен!
Полевые заметки и отчёты сообщества
Отобрано 5 технических ответов из 6 исходных сообщений темы
Отличный способ, всё работает как часы, спасибо!
Кстати, я нашёл способ сделать так, чтобы окно AU Lab не приходилось сворачивать вручную при каждом запуске.
Откройте ваш сохранённый конфигурационный файл .trak в текстовом редакторе (например, TextMate), прокрутите в самый низ и замените строки:
<key>Window Frame</key>
<string>{{388, 40}, {355, 577}}</string>
<key>Window Max</key>
<string>{2560, 1622}</string>
<key>Window Min</key>
<string>{360, 540}</string>
на следующие значения (окно размером 1×1 пиксель):
<key>Window Frame</key>
<string>{{1, 1}, {1, 1}}</string>
<key>Window Max</key>
<string>{2560, 1622}</string>
<key>Window Min</key>
<string>{1, 1}</string>
Немного досадно, что при завершении работы системы без предварительного закрытия документа AU Lab выдаёт сообщение об аварийном завершении, но тут уж не всё коту масленица.
Более элегантным решением был бы плагин Upmix от той же компании Cycling '74, которая создала Soundflower, но, к сожалению, он платный и стоит почти 500 долларов США.
Примечание модератора: Извини, Ianxxx, при редактировании я случайно обрезал первую часть твоего сообщения — не мог бы ты добавить её снова? Приношу извинения.
Без проблем :-) Ian
Зарегистрировался на форуме специально для того, чтобы поблагодарить автора за этот пост! Я убил два дня, пытаясь заставить свой Mac выводить звук одновременно на две звуковые карты. Просто в голове не укладывается, насколько неочевидно это делается в OS X.
Отличное руководство, спасибо! Надеюсь, со временем появится более «чистое» решение на уровне драйвера... Проект VoodooHDA выглядит весьма многообещающе.
@Diesа) Стандартное Агрегатное устройство категорически отказалось выводить звук на оба интерфейса сразу — звук шёл только на тот выход, который стоял первым в списке.
Так происходит при воспроизведении обычного двухканального стерео: в Mac OS X нет встроенной функции клонирования стереосигнала на все колонки (Speaker Fill), поэтому звук направляется строго в те дискретные каналы, которые прописаны в исходной аудиодорожке. А ты не пробовал запустить видеофайл с многоканальной дорожкой AC3 5.1, выставив многоканальный режим в настройках кодека Perian? Кроме того, штатный «DVD-плеер» Apple умеет отдавать поток 5.1 только через цифровой выход S/PDIF, поэтому для многоканального аналогового вывода лучше использовать плеер VLC.
@Diesб) Поскольку в Mac OS X для цифрового выхода S/PDIF штатная программная регулировка громкости с клавиатуры блокируется, даже в случае работы агрегатного устройства я бы лишился возможности управлять общей громкостью из системы.
Разве отсутствие программной регулировки громкости для выхода S/PDIF — это не норма? Ведь цифровой поток не обрабатывается микшером ОС, а передаётся напрямую (pass-through) на внешний ресивер.
Кстати, я использую 3 аналоговых линейных выхода, объединённых в Агрегатное устройство для звука 5.1 (кодек ALC888), и у меня для агрегатного устройства тоже блокируется системный ползунок громкости — судя по всему, это штатное ограничение механизма Aggregate Device в CoreAudio.
Но я нашёл простой способ вернуть программную регулировку громкости для многоканальной конфигурации:
1) В системных настройках звука выставите ползунки громкости всех используемых физических выходов на максимум.
2) Создайте Агрегатное устройство и назначьте каналы колонок в утилите «Настройка Audio-MIDI» как обычно.
3) С помощью утилиты меню-бара Soundflowerbed привяжите 6 каналов вашего агрегатного устройства к первым 6 каналам виртуального устройства Soundflower (16ch).
4) Выберите Soundflower (16ch) в качестве основного устройства вывода звука по умолчанию и настройте для него многоканальную схему колонок в «Настройке Audio-MIDI».
5) Готово — теперь у вас полноценно работает системная регулировка громкости с клавиатуры для акустики 5.1!
Надеюсь, кому-нибудь пригодится...
@mr_murderРазве отсутствие программной регулировки громкости для выхода S/PDIF — это не норма? Ведь цифровой поток не обрабатывается микшером ОС, а передаётся напрямую (pass-through) на внешний ресивер.
С чисто технической точки зрения ты, конечно, совершенно прав: подразумевается, что регулировкой уровня сигнала занимается внешний ресивер или ЦАП, принимающий цифровой поток.
ОДНАКО в любой другой современной настольной ОС (Linux, Windows), по крайней мере по моему опыту, пользователю всё равно оставляют возможность программно регулировать громкость на каждом доступном аудиовыходе.
Задержка звука на одном из выходов при использовании нескольких устройств
В OS X Lion в утилите «Настройка Audio-MIDI» теперь появился штатный пункт «Многовыходное устройство» (Multi-Output Device), позволяющий легко дублировать звук сразу на несколько выходов.
У меня к хакинтошу подключён стереоусилитель через стандартный аналоговый линейный выход (Line Out), а также ЖК-телевизор LG со встроенными динамиками по кабелю HDMI.
Проблема в том, что при выводе через телевизор по HDMI присутствует заметная задержка звука (из-за внутренней буферизации ТВ), в результате чего возникает эффект эха.
Ищу способ искусственно задать небольшую задержку (delay) для аналогового линейного выхода, оставив цифровой выход HDMI без задержки, чтобы звук из обеих акустических систем шёл идеально синхронно.
У кого-нибудь есть идеи, чем это можно реализовать?
Источники и реестр соавторов (указано участников: 5 · Тема #1645)
| Участник | Роль в досье | Сообщений | Период активности |
|---|---|---|---|
| @Dies | Основной автор | 2 | 2008-11-28 → 2009-04-27 |
| @Ianxxx | Участник | 1 | 2008-12-17 |
| @fahrvergnuugen | Участник | 1 | 2009-04-03 |
| @mr_murder | Участник | 1 | 2009-04-25 |
| @zorro23 | Участник | 1 | 2011-11-13 |