web-dev-qa-db-fra.com

Pilote audio virtuel Mac OS X

Je veux créer un périphérique audio virtuel qui obtient les données audio de la sortie par défaut (qui est une sortie IOAudioStream) et les convertit en une entrée IOAudioStream.

J'ai parcouru la plupart des exemples que j'ai pu trouver, mais ils n'implémentent qu'une fonctionnalité pour copier l'IOAudioStream de sortie vers l'entrée au maximum. Cela signifie qu'il ne convertit l'audio en un flux d'entrée que si le périphérique audio est sélectionné en sortie.

Cela devrait être possible, car ScreenFlow permet l'enregistrement audio de l'ordinateur en installant un kext qui crée un pilote virtuel.

Comment puis-je accéder aux données audio à partir de la sortie par défaut et les envoyer à mon pilote virtuel?

26
UpL1nK

Jetez un oeil à l'open source WavTap , qui est un fork simplifié du pilote de carte son virtuelle open-source SoundFlower . C'est un .kext qui, je crois, fait sensiblement ce que vous voulez.

Pour référence, voici comment fonctionnent certaines options commerciales de source fermée:
Rogue Amoeba's Audio Hijack Pro
- Capture l'audio du système via un code basé sur le SoundFlower open source .kext
- Capture l'audio d'une application en remplaçant un framework "patch" par le CoreAudio.framework normal lors du lancement de l'application
- Capture l'audio d'une application déjà en cours d'exécution à l'aide du haxie "Application Enhancer" (APE) de Unsanity

Ces fonctionnalités sont marquées comme leur fonction "Instant On" (InstantOn.kext).

Ambrosia Software's WireTap Studio
- Capture l'audio du système et l'audio de l'application via un .kext développé en interne

Telestream ScreenFlow
- Capture l'audio du système via un développé en interne .kext. (la version 2.x utilise varaudio.kext; la version 3.x utilise TelestreamAudio.kext)

Macsome's Enregistreur audio
- Méthode inconnue

Araelium Group Screenflick
- Capture le son du système à l'aide du SoundFlower .kext

MISE À JOUR # 1
Après avoir lu les commentaires de l'auteur, il semble que l'objectif sous-jacent est de pouvoir capturer le son du système sans publier le pilote audio virtuel en tant que périphérique (qui apparaîtrait dans le système Liste des préférences) et sans changer le périphérique de sortie par défaut actuel (ou au moins l'apparence que le périphérique a changé).

SoundFlower: Ajoute un périphérique audio à la liste lors de l'installation
WavTap: Ajoute un périphérique audio à la liste lors de l'installation; sélectionne automatiquement l'appareil au démarrage de l'application WavTap; désélectionne automatiquement l'appareil lorsque l'application est arrêtée et resélectionne l'appareil précédent
Audio Hijack Pro: Ajoute un périphérique audio uniquement lorsque la capture audio du son système par défaut est sélectionnée; supprime le périphérique audio lorsque la capture audio n'est plus sélectionnée et resélectionne le périphérique précédent
WireTap Studio: Inconnu
ScreenFlow: Capture le son du système sans changer le périphérique de sortie par défaut actuel et sans publier le pilote audio virtuel en tant que périphérique

MISE À JOUR # 2
Une citation de Jeff Moore, ingénieur CoreAudio Apple, en référence à des applications telles que WireTap et Audio Hijack Pro:
"Il n'y a pas d'API sur le système qui vous donnera la sortie d'une application spécifique ou tout le mixage allant vers le matériel ... [Capturing System Sound] n'est pas pris en charge par le système et ces gens devaient être intelligents. Rien ne vous empêche de faire la même chose, sauf à quel point vous êtes prêt à vous salir les mains. Le fait est que le système audio de Mac OS X a été conçu avant tout pour la performance. Cela nous amène à une conception où il n'est pas facile de prendre en charge les fonctionnalités que vous souhaitez sans imposer de pénalités de performances. Nous avons donc opté pour de meilleures performances au prix de ne pas pouvoir fournir cette fonctionnalité. "

Si vous souhaitez en savoir plus sur le sujet, consultez ces discussions sur la liste de diffusion de l'API CoreAudio:
"WireTap, API de CoreAudio et capture système, et kexts ..."
"Une autre question sur la capture audio lue par un logiciel"
"Capture de l'audio en cours de lecture à l'aide de CoreAudio sur Mac"
"'Détournement audio'"
"sortie audio du système de surveillance comme une prise de fil"
"Capture de la sortie audio dans un fichier"
"Mise en miroir de la sortie audio"
"Enregistrement du système audio"

Pertinentes SO Questions:
Masquer le périphérique audio à l'aide de kext sans code

Donc, pour faire court, vous ne trouverez probablement pas d'exemples de Apple qui accomplissent cela, et vous ne trouverez probablement pas non plus de code open source qui accomplit cela, à moins que quelqu'un ne se sente très généreux. Il semble que l'information soit trop précieuse.

48
BigMacAttack

Après des recherches supplémentaires, voici quelques techniques théoriques que j'ai trouvées qui pourraient vous permettre d'atteindre votre objectif:

  1. Semblable au produit Hear de Prosoft Engineering, vous pouvez créer un plug-in HAL (pilote virtuel en mode utilisateur) plutôt qu'un .kext (pilote virtuel en mode noyau). Apple a un exemple de plugin HAL appelé "" SampleHardwarePlugIn " et PulseAudio en a un aussi. Cependant, avec sa méthode, je ne pense pas vous avez accès à un flux sonore système pré-mixé. Vous devez rassembler tous les flux des différentes applications (qui doivent utiliser CoreAudio pour lire le son) et les mélanger pour une capture sonore du pseudo-système.

  2. Créez un périphérique audio virtuel caché [1][2] à partir de l'interaction de l'utilisateur. Lorsque l'utilisateur souhaite capturer le son par défaut, créer par programme un périphérique agrégé qui inclut votre périphérique virtuel caché et le périphérique audio par défaut actuel. Définissez temporairement ce périphérique agrégé comme sortie par défaut. De cette manière, vous pouvez à la fois capturer le son par défaut et l'entendre.
    Note latérale: Si Mac OS X permet qu'un périphérique caché soit également défini comme périphérique de sortie par défaut, que montreraient les Préférences Système comme périphérique sélectionné? S'il montre à la place le périphérique de sortie secondaire comme sélectionné, vous avez alors l'allusion supplémentaire que rien n'a changé.

8
BigMacAttack