1) Какие соответствующие API-интерфейсы использовать для этого?
API Core Audio подойдет. См. AudioDeviceCreateIOProcID
и AudioDeviceStart
в CoreAudio/AudioHardware.h
. По какой-то причине на сайте документации Apple нет документов для них, поэтому вы должны найти его в заголовочном файле.
Или вы можете использовать AVAudioEngine
. (Но не AVAudioPlayer
.)
В зависимости от ваших других требований, может быть проще использовать существующую программу, такую как GStreamer или VL C.
Любые ссылки на аналогичные примеры приложений будут оценены.
CAPlayThrough
может быть хорошим местом для начала, но он использует AUGraph
, что устарело. Я не уверен, понадобится ли вам аудиоустройство с переменной скоростью, которое оно использует для настройки различий в частотах дискретизации, но вы, по крайней мере, можете начать без него. 1026 *: https://github.com/pje/WavTap/blob/master/App/AudioTee.cpp
Как открыть мой специфический c, настраиваемый драйвер для вывода?
Драйвер будет опубликован sh устройство вывода звука, и оно будет иметь свойство с именем kAudioDevicePropertyModelUID
(см. AudioHardwareBase.h
.) И должно иметь для него постоянное значение. Вы можете проверить это, дважды щелкнув по устройству в HALLab.
Ваша программа может использовать AudioObjectGetPropertyData
, чтобы получить свойство kAudioHardwarePropertyDevices
«объекта аудиосистемы» (kAudioObjectSystemObject
), а затем получить kAudioDevicePropertyModelUID
свойство каждого устройства.
Если вы используете C ++, вы можете использовать Publi c Utility классы , чтобы помочь с этим.
Имеет ли это какое-то отношение к UUID, который я вижу в коде драйвера, или драйвер идентифицирован как-то иначе?
Драйвер идентифицируется по его идентификатору пакета. Вы можете использовать свойство kAudioHardwarePropertyPlugInForBundleID
для AudioObjectID
аудиообъекта, который представляет драйвер (то есть подключаемый модуль). Вы также можете найти устройство с помощью подключаемого объекта.
Как записать мои «выдвинутые» данные в памяти из сети на устройство вывода? Нужно ли мне использовать какой-нибудь обратный вызов, который читает из кольцевого буфера, в который записан сетевой поток в реальном времени?
Функция, которую вы передаете AudioDeviceCreateIOProcID
, будет вызываться каждый цикл ввода-вывода и получать буфер для заполнения сэмплами для этого цикла.