Dapatkan Buffer Audio Perangkat Output macOS secara Realtime

Dec 14 2020

Saya mencoba untuk mengetuk perangkat audio keluaran yang saat ini dipilih di macOS, jadi pada dasarnya saya memiliki pendengar yang dapat memantau aliran audio yang saat ini menjadi keluaran tanpa memengaruhinya.

Saya ingin menyalin data ini ke buffer cincin secara real time sehingga saya dapat mengoperasikannya secara terpisah.

Kombinasi dari dokumen Apple dan jawaban SO (usang?) Membingungkan, apakah saya perlu menulis ekstensi kernel yang hacky, dapat menggunakan CoreAudio untuk ini, atau perlu berinteraksi dengan HAL?

Saya ingin bekerja di Swift jika memungkinkan.

Terimakasih banyak

(ps. Saya telah melihat ini dan ini )

Jawaban

3 RhythmicFistman Dec 14 2020 at 23:07

Saya tidak tahu tentang ekstensi kernel - penggunaan sertifikat penandatanganan khusus "hubungi kami" atau keharusan mematikan SIP membuat eksplorasi biasa-biasa saja.

Namun Anda dapat menggunakan kombinasi plugin CoreAudio dan HAL AudioServer untuk melakukan apa yang Anda inginkan, dan Anda bahkan tidak perlu menulis plugin sendiri, ada beberapa versi open source yang dapat dipilih.

CoreAudio tidak memberi Anda cara untuk merekam dari (atau "ketuk") perangkat keluaran - Anda hanya dapat merekam dari perangkat masukan, jadi cara untuk menyiasatinya adalah dengan membuat perangkat "lewati" virtual (AudioServerPlugin), bukan terkait dengan perangkat keras apa pun, yang menyalin output melalui input dan kemudian mengatur perangkat pass ini sebagai output default dan merekam dari inputnya. Saya telah melakukan ini menggunakan Plugin AudioServer open source seperti BackgroundMusic dan BlackHole [TODO: tambahkan lagi].

Untuk mengetuk / merekam dari perangkat yang dihasilkan, Anda cukup menambahkan AudioDeviceIOProcpanggilan balik ke sana atau mengatur perangkat sebagai kAudioOutputUnitProperty_CurrentDevicedarikAudioUnitSubType_HALOutput AudioUnit

Ada dua masalah dengan pendekatan perangkat melalui virtual di atas:

  1. Anda tidak dapat mendengar keluaran lagi, karena sedang dikonsumsi oleh perangkat yang melewati
  2. mengubah perangkat keluaran default akan beralih dari perangkat Anda dan keran akan menjadi sunyi.

Jika 1. merupakan masalah, maka sederhananya adalah membuat perangkat Multi-Output yang berisi perangkat pass through dan perangkat keluaran nyata (lihat tangkapan layar) & atur ini sebagai perangkat keluaran default. Kontrol volume berhenti berfungsi, tetapi Anda masih dapat mengubah volume perangkat keluaran sebenarnya Audio MIDI Setup.app.

Untuk 2. Anda dapat menambahkan listener ke perangkat keluaran default dan memperbarui perangkat multi-keluaran di atas jika ada perubahan.

Anda dapat melakukan sebagian besar hal di atas dengan cepat, meskipun untuk ringbuffer-stowing dari callback pengiriman buffer, Anda harus menggunakan C atau bahasa lain yang dapat mengikuti aturan audio realtime (tanpa kunci, tidak ada alokasi memori, dll). Anda mungkin dapat mencoba AVAudioEnginemelakukan keran, tetapi perangkat input IIRC yang berubah adalah lembah air mata .