Я пытаюсь направить звук из приложения MacOS, которое я написал в SWIFT, прямо на динамики с эфирным воспроизведением.
Я могу направить звук на встроенные звуковые выходы или сказать USB DA C без проблем. Я могу получить идентификаторы аудиоустройств, скажем, для подключенного USB DA C, и направить звук специально для этого штрафа в моем приложении, но у меня возникли проблемы с поиском хороших образцов / документов, чтобы сделать это для динамиков трансляции с помощью SWIFT / AVPLAYER.
Кто-нибудь видел какие-либо хорошие документы / образцы кода по направлению звука из быстрого приложения macOS (не ios) напрямую к динамикам трансляции? то есть, как получить список идентификаторов аудиоустройств трансляции и отправить на них вывод из avplayer?
Для направления вывода звука, скажем, USB DA C Я могу получить список идентификаторов воспроизводящих аудиоустройств с помощью этой функции -
fun c getOutputDevices () -> [AudioDevice] {
print_log ("")
print_log("+++ START AUDIO PLAYBACK DEVICES FOUND....")
print_log ("")
for device in AudioDevice.allOutputDevices() {
print("DEVICE NAME: " + device.name + " -> DEVICE ID: " + String(device.uid ?? "Empty Device"))
}
print_log ("")
print_log("+++ END AUDIO PLAYBACK DEVICES FOUND....")
print_log ("")
return AudioDevice.allOutputDevices()
}
, а затем воспроизвести звук на одном из возвращенных аудиоустройств, например, используя avplayer и установка аудио audioOutputDeviceUniqueID -
print_log("Setting audio output device to " + String(playback_device.uid ?? "Empty"))
gbl_queue_player.audioOutputDeviceUniqueID=playback_device.uid
gbl_queue_player.addObserver(stage, forKeyPath: "status", options: NSKeyValueObservingOptions.new, context: nil)
gbl_queue_player.addObserver(stage, forKeyPath: "rate", options: NSKeyValueObservingOptions.new, context: nil)
gbl_queue_player.addObserver(stage, forKeyPath:"currentItem", options:NSKeyValueObservingOptions.new, context:nil)
gbl_queue_player.play()
Надеюсь, что все имеет смысл. Я нашел некоторые документы, относящиеся к IOS, но не к MacOS.
Спасибо!
РЕДАКТИРОВАТЬ 01/07/2020
Попробуй с помощью приведенного ниже кода создать экземпляр AVRoutePicker при нажатии кнопки.
ХОРОШИЕ НОВОСТИ: появляется окно выбора, и встроенные динамики перечислены в качестве опции.
ПЛОХИЕ НОВОСТИ: нет подтвержденных устройств трансляции или USB-ЦАП в моей системе показывают это так, но они есть в ОС выбор звука.
@ IBAction fun c airplay_button_clicked (_ sender: Any)
{
let frame = CGRect (x: 50, y: 50, width: 100, height : 50)
gbl_routePickerView = AVRoutePickerView (frame: frame)
view.addSubview (gbl_routePickerView)}
}
В этом приложении нет песочницы.
*** РЕДАКТИРОВАТЬ РЕШЕНИЕ 01/06/2020
Как указано Джоном, игрок должен быть назначен свойству выбора маршрута
, поэтому функция для меня стала ....
@ IBAction fun c airplay_button_clicked (_ sender: Any) {
print_log("Airplay button clicked")
let frame = CGRect(x: 50, y: 50, width: 100, height: 50)
if #available(OSX 10.15, *) {
gbl_routePickerView = AVRoutePickerView(frame: frame)
gbl_routePickerView.player=gbl_queue_player
view.addSubview(gbl_routePickerView)
} else {
// Fallback on earlier versions
print_log("OS Does not support avroute picker.")
}
}