Подтвердить что ты не робот

Драйвер виртуального аудио Mac OS X

Я хочу создать виртуальное аудиоустройство, которое получает аудиоданные из выходного сигнала по умолчанию (который является выходом IOAudioStream) и преобразует его в входной IOAudioStream.

Я просмотрел большинство примеров, которые я смог найти, однако они только реализуют функцию для копирования выходного IOAudioStream на входной максимум. Это означает, что он преобразует звук только в входной поток, если аудиоустройство выбрано как выход.

Это должно быть возможно, так как ScreenFlow позволяет записывать компьютерный звук, устанавливая kext, который создает виртуальный драйвер.

Как я могу получить доступ к аудиоданным из вывода по умолчанию и отправить его на мой виртуальный драйвер?

4b9b3361

Ответ 1

Взгляните на open-source WavTap, который является упрощенной вилкой open-source SoundFlower драйвер виртуальной звуковой карты. Это файл .kext, который, как я считаю, существенно влияет на то, что вы хотите.

Для справки, вот как работают некоторые популярные коммерческие опции с закрытым исходным кодом:
Rogue Amoeba Audio Hijack Pro
-Captures system audio через код, основанный на SoundFlower с открытым исходным кодом .kext
-Захватывает звук приложения, заменяя "патч-структуру" для нормального CoreAudio.framework при запуске приложения
-Захватывает уже запущенный звук приложения с помощью haxie "Application Enhancer" (APE) от Unsanity

Эти функции заклеймены как функция "Instant On" (InstantOn.kext).

Программное обеспечение Ambrosia WireTap Studio
-Captures аудио системы и звука приложения через встроенный .kext

Telestream ScreenFlow
-Captures system audio через встроенный .kxt. (версия 2.x использует varaudio.kext; в версии 3.x используется TelestreamAudio.kext )

Macsome Аудиозапись
-Неизвестный метод

Araelium Group Screenflick
-Captures system audio с помощью SoundFlower.kext

ОБНОВЛЕНИЕ # 1
После прочтения комментариев автора, основная цель состоит в том, чтобы улавливать звук системы без публикации виртуального аудио драйвера в качестве устройства (которое появляется в списке настроек системы) и без изменения текущего устройства вывода по умолчанию (или на по крайней мере, внешний вид устройства изменился).

SoundFlower: добавляет звуковое устройство в список при установке
WavTap: добавляет звуковое устройство в список при установке; автоматически выбирает устройство при запуске приложения WavTap; автоматически отменяет выбор устройства, когда приложение отключается и повторно выбирает предыдущее устройство
Audio Hijack Pro: добавляет звуковое устройство только при выборе аудиозахвата по умолчанию для системного звука; удаляет звуковое устройство, когда аудиозапись больше не выбрана и повторно выбирает предыдущее устройство
WireTap Studio: неизвестно
ScreenFlow: захватывает системный звук без изменения текущего устройства вывода по умолчанию и без публикации виртуального аудио драйвера в качестве устройства

ОБНОВЛЕНИЕ # 2
Цитата Джеффа Мура, инженера CoreAudio Apple, применительно к приложениям, таким как WireTap и Audio Hijack Pro:
"В системе нет API-интерфейсов, которые предоставят вам выход любого конкретного приложения или всего набора, идущего на аппаратное обеспечение... [Capture System Sound] не поддерживается системой, и эти люди должны быть умными. ничто не мешает вам делать то же самое, кроме того, как вы готовы замарать руки. Дело в том, что аудиосистема Mac OS X была разработана в первую очередь для производительности. Это приводит нас к дизайну, где нелегко поддерживать функциональность, которую вы хотите, не налагая штрафных санкций. Таким образом, мы выбрали лучшую производительность за счет того, что не смогли предоставить эту функцию ".

Если вы хотите больше узнать об этом, ознакомьтесь с этими потоками в списке рассылки CoreAudio API:
"WireTap, CoreAudio API, и системный захват, и kexts..."
"Еще один вопрос о захвате звука, воспроизводимого программным обеспечением"
"Захват текущего воспроизводимого звука с помощью CoreAudio на Mac"
"'audio hijack'"
"мониторинг аудиовыхода системы, например, переход провода"
"Захват аудиоданных в файл"
"Зеркальное аудиовыход"
"Звук системы записи"

Релевантные вопросы SO:
Скрыть аудиоустройство с использованием бездорожья kext

Короче говоря, вы вряд ли найдёте примеры из Apple, которые этого достигнут, и вряд ли вы найдете открытый исходный код, который это сделает, если кто-то не чувствует себя очень щедро. Это, по-видимому, слишком ценно для информации.

Ответ 2

После дополнительных исследований, вот некоторые теоретические методы, которые я придумал, могут позволить вам выполнить вашу цель:

  • Подобно продукту Prosoft Engineering Hear, вы можете создать плагин HAL (виртуальный драйвер пользовательского режима), а не .kext(виртуальный драйвер режима ядра). У Apple есть образец плагина HAL, называемый "SampleHardwarePlugIn" и PulseAudio имеет один. Однако, по его методу, я не думаю, что вы получаете доступ к предварительно смешанному звуковому потоку системы. Вам нужно будет собрать все потоки из различных приложений (которые должны использовать CoreAudio для воспроизведения звука) и объединить их для записи звука псевдосистемой.

  • Создайте виртуальное аудиоустройство, которое скрыто [1] [2] от взаимодействия пользователя. Когда пользователь хочет записать звук по умолчанию, программно создать агрегатное устройство, которое включает в себя ваше скрытое виртуальное устройство и текущее звуковое устройство по умолчанию. Временно установите это агрегатное устройство как выход по умолчанию. Таким образом, вы можете как захватить звук по умолчанию, так и услышать его.
    Сторона Примечание. Если Mac OS X позволяет скрытому устройству также быть установленным как устройство вывода по умолчанию, что бы отображались системные настройки в качестве выбранного устройства? Если вместо этого отображается выбранное вторичное устройство вывода, то у вас есть добавленная аллюзия, в которой ничего не изменилось.