2013-08-26 87 views
21

Desidero creare un dispositivo audio virtuale che recuperi i dati audio dall'output predefinito (che è un output IOAudioStream) e lo converta in un input IOAudioStream.Driver audio virtuale per Mac OS X

Ho analizzato la maggior parte degli esempi che sono riuscito a trovare, tuttavia implementano solo una funzionalità per copiare l'output IOAudioStream su quello di input al massimo. Ciò significa che converte l'audio in un flusso di input solo se il dispositivo audio è selezionato come output.

Ciò dovrebbe essere possibile, poiché ScreenFlow consente la registrazione di audio del computer installando un kext che crea un driver virtuale.

Come accedere ai dati audio dall'output predefinito e inviarlo al mio driver virtuale?

risposta

38

Dai un'occhiata all'open source WavTap, che è un fork semplificato del driver della scheda audio virtuale open source SoundFlower. È un .kext che credo faccia sostanzialmente quello che vuoi.

Per riferimento, ecco come alcune opzioni closed-source commerciali popolari funzionano: audio Audio Hijack Pro
-Captures sistema
Rogue Amoeba di via codice in base al largo della open-source Soundflower .kext
-Captures un'applicazione di audio sostituendo un quadro "patch" per la CoreAudio.framework normale quando si lancia l'applicazione
-Captures audio di un'applicazione già in esecuzione, con l'aiuto del haxie "Application Enhancer" (APE) da Unsanity

Queste funzionalità sono contrassegnate come la loro funzione "Instant On" (InstantOn.kext). WireTap Studio
-Captures sistema audio e l'applicazione audio

Ambrosia Software tramite un in-house sviluppato .kext ScreenFlow
-Captures audio sistema

Telestream 's tramite un in-house developed .kext. (versione 2.x utilizza varaudio .kext; Versione 3.x utilizza TelestreamAudio.kext)

Macsome Audio Recorder sistema
-Captures audio -Sconosciuto metodo

Araelium del Gruppo utilizzando il Soundflower .kext

UPDATE # 1
Dopo aver letto commenti dell'autore, sembra l'obiettivo di fondo è quello di essere in grado di acquisire il suono del sistema senza pubblicare il driver audio virtuale come dispositivo (che appare nell'elenco delle preferenze di sistema) e senza modifica del dispositivo di output predefinito corrente (o almeno l'aspetto del dispositivo è cambiato).

Soundflower: Aggiunge un dispositivo audio alla lista al momento dell'installazione
WavTap: Aggiunge un dispositivo audio alla lista al momento dell'installazione; seleziona automaticamente il dispositivo all'avvio dell'applicazione WavTap; deseleziona automaticamente il dispositivo quando l'applicazione viene arrestata e riseleziona il dispositivo precedente
Audio Hijack Pro: Aggiunge un dispositivo audio solo quando è selezionata l'acquisizione audio del suono di sistema predefinito; rimuove il dispositivo audio quando cattura audio non è più selezionata e riseleziona il dispositivo precedente
WireTap Studio: Unknown
ScreenFlow: cattura il suono sistema senza modificare il dispositivo di output predefinito corrente e senza pubblicare il driver audio virtuale come dispositivo

UPDATE # 2
una citazione da Jeff Moore, un ingegnere di Apple CoreAudio, in riferimento ad applicazioni come WireTap e Audio Hijack Pro:
"non ci sono le API sul sistema che ti darà l'output di qualsiasi app specifica o l'intero mix che va all'hardware ... [Capturing System Sound] non è supportato dal sistema e quelle persone dovevano essere intelligenti. Non c'è niente che ti impedisca di fare la stessa cosa, tranne quanto sei disposto a sporcarti le mani. Il fatto è che il sistema audio di Mac OS X è stato progettato prima di tutto per le prestazioni. Questo ci ha portato a un design in cui non è facile supportare la funzionalità desiderata senza imporre sanzioni in termini di prestazioni. Così, abbiamo optato per una migliore performance a costo di non essere in grado di fornire questa funzionalità "

Se volete saperne di più su questo argomento, dai un'occhiata a queste discussioni sulla CoreAudio API mailing list:.
"WireTap, CoreAudio's API, and system capture, and kexts..."
"Another question on capturing audio played back by a software"
"Capturing currently played audio using CoreAudio on Mac"
"'audio hijack'"
"monitoring system audio output like wire tap"
"Capturing audio output to a file"
"Mirroring Audio Output"
"Recording system audio"

rilevanti SO Domande:
Hide Audio device using codeless kext

Quindi per farla breve, non sono suscettibili di trovare esempi di Apple che raggiungere questo obiettivo, e non sono suscettibili di trovare il codice open source anche questo, a meno che qualcuno si senta lo molto generoso. Sembra essere troppo prezioso per le informazioni.

+0

Grazie per la risposta, domani darò un'occhiata a WavTap e ti faccio sapere se funziona. Apparentemente avevo già visitato il link repo di WavTap, quindi l'ho considerato una possibile soluzione, tuttavia non ricordo esattamente perché ho deciso che non era quello di cui avevo bisogno. – UpL1nK

+0

WavTap fa la stessa cosa di SoundFlower - come in hai bisogno di riprodurre l'audio attraverso il dispositivo WavTap per ottenere l'audio. Ho bisogno di un driver virtuale simile a quello utilizzato da ScreenFlow, che consente la registrazione dell'audio senza dover scegliere un dispositivo diverso. +1 per le informazioni su come funzionano le altre opzioni commerciali, tuttavia questa non è la soluzione di cui ho bisogno. – UpL1nK

+0

Ah, ora vedo cosa stai cercando di realizzare. Ho aggiornato la mia risposta per chiarire come funzionano le opzioni commerciali. Sembra che ScreenFlow sia in qualche modo unico in questa abilità, anche tra i suoi concorrenti. – BigMacAttack

5

Dopo ulteriori ricerche, qui ci sono alcune tecniche teoriche sono arrivato fino a che potrebbero consentire di realizzare il vostro obiettivo:

  1. Simile al prodotto di Prosoft Ingegneria Hear, è possibile creare un plugin HAL (in modalità utente driver virtuale) piuttosto che un .kext (driver virtuale in modalità kernel). Apple ha un plugin HAL di esempio chiamato "SampleHardwarePlugIn" e lo ha anche PulseAudio. Tuttavia, con il suo metodo non penso che tu abbia accesso ad un flusso sonoro di sistema pre-mixato.Dovresti raccogliere tutti i flussi dalle varie applicazioni (che devono utilizzare CoreAudio per riprodurre suoni) e mescolarli insieme per l'acquisizione del suono pseudo sistema.

  2. Creare un dispositivo audio virtuale nascosto [1][2] dall'interazione dell'utente. Quando l'utente desidera acquisire il suono predefinito, programmatically create an aggregate device include il dispositivo virtuale nascosto e il dispositivo audio predefinito corrente. Imposta temporaneamente questo dispositivo aggregato come output predefinito. In questo modo, sei in grado di catturare il suono predefinito e ascoltarlo.
    Nota a margine: se Mac OS X consente anche a un dispositivo nascosto di essere impostato come dispositivo di output predefinito, quali sarebbero le Preferenze di Sistema visualizzate come dispositivo selezionato? Se invece mostra il dispositivo di output secondario come selezionato, allora hai aggiunto l'allusione che nulla è cambiato.