Holen Sie sich MacOS-Ausgabegerät-Audiopuffer in Echtzeit

Dec 14 2020

Ich versuche, auf das aktuell ausgewählte Audioausgabegerät unter macOS zu tippen , sodass ich im Grunde einen Pass-Through-Listener habe, der den aktuell ausgegebenen Audiostream überwachen kann, ohne ihn zu beeinflussen.

Ich möchte diese Daten in Echtzeit in einen Ringpuffer kopieren, damit ich sie separat bearbeiten kann.

Die Kombination von Apple-Dokumenten und (veralteten?) SO-Antworten ist verwirrend, ob ich eine hackige Kernel-Erweiterung schreiben muss, CoreAudio dafür verwenden kann oder eine Schnittstelle mit der HAL herstellen muss.

Ich würde gerne in Swift arbeiten, wenn möglich.

Danke vielmals

(ps. Ich hatte dies und das angeschaut )

Antworten

3 RhythmicFistman Dec 14 2020 at 23:07

Ich weiß nichts über Kernel-Erweiterungen - die Verwendung spezieller "Call Us" -Signaturzertifikate oder die Notwendigkeit, SIP auszuschalten, rät von gelegentlichen Erkundungen ab.

Sie können jedoch eine Kombination aus CoreAudio- und HAL AudioServer-Plugins verwenden, um das zu tun, was Sie möchten, und Sie müssen das Plugin nicht einmal selbst schreiben. Es stehen mehrere Open Source-Versionen zur Auswahl.

CoreAudio bietet Ihnen keine Möglichkeit, von Ausgabegeräten aufzunehmen (oder zu "tippen"). Sie können nur von Eingabegeräten aufnehmen. Um dies zu umgehen, müssen Sie ein virtuelles "Pass-Through" -Gerät (AudioServerPlugin) erstellen, nicht Wird jeder Hardware zugeordnet, die die Ausgabe in die Eingabe kopiert und dieses Durchgangsgerät dann als Standardausgabe festlegt und von seiner Eingabe aufzeichnet. Ich habe dies mit Open Source AudioServer Plugins wie BackgroundMusic und BlackHole gemacht [TODO: mehr hinzufügen].

Um auf das resultierende Gerät zu tippen / es aufzunehmen, können Sie ihm einfach einen AudioDeviceIOProcRückruf hinzufügen oder das Gerät als kAudioOutputUnitProperty_CurrentDeviceeines festlegenkAudioUnitSubType_HALOutput AudioUnit

Es gibt zwei Probleme mit dem obigen Ansatz für virtuelle Pass-Through-Geräte:

  1. Sie können Ihre Hörausgabe nicht mehr hören, da sie vom Pass-Through-Gerät verbraucht wird
  2. Wenn Sie das Standardausgabegerät ändern, wird das Gerät von Ihrem Gerät entfernt und der Wasserhahn verstummt.

Wenn 1. ein Problem ist, können Sie ganz einfach ein Gerät mit mehreren Ausgängen erstellen, das das Durchgangsgerät und ein echtes Ausgabegerät enthält (siehe Screenshot), und dies als Standardausgabegerät festlegen. Die Lautstärkeregler funktionieren nicht mehr, aber Sie können die Lautstärke des realen Ausgabegeräts trotzdem ändern Audio MIDI Setup.app.

Für 2. können Sie dem Standardausgabegerät einen Listener hinzufügen und das oben genannte Multi-Ausgabegerät aktualisieren, wenn es sich ändert.

Sie können die meisten der oben genannten Schritte schnell ausführen. Für das Verstauen von Ringpuffern aus den Rückrufen zur Pufferübermittlung müssen Sie jedoch C oder eine andere Sprache verwenden, die die Echtzeit- Audioregeln einhält (keine Sperren, keine Speicherzuweisung usw.). Sie könnten vielleicht versuchen AVAudioEngine, das Tippen zu machen, aber das Ändern des Eingabegeräts durch IIRC ist ein Tal der Tränen .