Ich schreibe eine neue Android Audio HAL, damit meine App Audio an andere Apps senden kann, damit mein Handheld-Mikrofoneingang die Google App erreichen kann. Im Wesentlichen ein virtuelles Audiokabel.
Es ist ein work in progress. Ich werde wahrscheinlich AUDIO_DEVICE_IN_BACK_MIC außer Kraft setzen, aber dies ist offen für Vorschläge.
Ich habe Zweifel, wie ich sicherstellen kann, dass Android diese HAL für die Eingabe verwendet.
Muss ich audio.primary.default.so ersetzen oder sollte ich es als audio.vcable.default.so belassen?
Genauer gesagt: Wenn ich die primäre nicht ersetze, wie wird Android wissen, dass ich meine HAL anstelle der primären verwenden soll?
Aktualisierung:
Ich könnte wirklich jede Hilfe bei dieser Arbeit gebrauchen. Alle Zeiger sind hilfreich.
Ich habe ein Audio-HAL-Modul geschrieben. Ich habe der audio_policy.conf folgende (fett formatierte Elemente) hinzugefügt:
global:
%Vor%und unter audio_hw_modules
%Vor%Ich habe auch folgende (fett) zu AudioFlinger.cpp
hinzugefügt %Vor%Ich kann sehen, dass während des Bootens meine HAL geladen wird, und ich bekomme diese Logs:
%Vor%Meins ist audio_vloop. Ich kann sehen, dass Android mein Gerät öffnet, öffnet dann den Eingabestream und schließt dann den Eingabestream. Es versucht nie, den Ausgabestream zu öffnen. audio_vloop implementiert sowohl Eingabe- als auch Ausgabeströme. Danach wird nichts in audio_vloop jemals von Android aufgerufen.
Ich habe eine kleine App gemacht, die Audio abspielt (aus einer PCM-Datei für den Moment). Ich möchte diese Ausgabe an meine HAL umleiten. Um dies zu erreichen, muss ein AudioTrack.setPreferredDevice () auf meiner Audiospur ausgeführt werden. Ich habe festgestellt, dass Audio Manager eine Liste aller Audiogeräte haben sollte.
Ich rufe also an:
%Vor%Es findet nur 1 Gerät, weitere Informationen zu diesem Gerät:
%Vor%Dies ist scheinbar von AudioPort, die ich nicht implementiert habe. Also nicht von meiner HAL.
Ich habe offensichtlich einen oder mehrere Schritte verpasst, bevor Android meine App mit meinem Gerät sprechen lässt.
Ich muss in der Lage sein, Audio von meiner App in meine HAL zu senden. Später muss ich auch Audio von meiner HAL (über AudioRecord usw.) empfangen können.
Was habe ich bei der Integration meiner HAL in Android verpasst? Muss ich Audio-Ports implementieren? Ist etwas anderes erforderlich?
Update 2
Ich habe festgestellt, dass es in AOSP einen Tippfehler gibt, in AudioPolicyManager .cpp @ 2922
Anstelle von Output
wird Input
Ich hatte dieses Protokoll AudioPolicyManager: Input device 00020000 unreachable
, das ich ignoriert habe, vorausgesetzt, es handelt sich um ein BT / A2DP-Eingabegerät.
Ich habe das Protokoll für mein Gerät korrigiert, und es stellt sich heraus, dass es sich um ein Line-Out-Gerät handelt, das wir verwenden möchten. Ich debugge jetzt diese Richtung.
Ich schreibe eine neue Android Audio HAL, damit meine App Audio an andere Apps senden kann, damit mein Handheld-Mikrofoneingang die Google App erreichen kann. Im Wesentlichen ein virtuelles Audiokabel.
Es ist ein work in progress. Ich werde wahrscheinlich AUDIO_DEVICE_IN_BACK_MIC außer Kraft setzen, aber dies ist offen für Vorschläge.
Ich habe Zweifel, wie ich sicherstellen kann, dass Android diese HAL für die Eingabe verwendet.
Muss ich audio.primary.default.so ersetzen oder sollte ich es als audio.vcable.default.so belassen?
Genauer gesagt: Wenn ich die primäre nicht ersetze, wie wird Android wissen, dass ich meine HAL anstelle der primären verwenden soll?
Aktualisierung:
Ich könnte wirklich jede Hilfe bei dieser Arbeit gebrauchen. Alle Zeiger sind hilfreich.
Ich habe ein Audio-HAL-Modul geschrieben. Ich habe der audio_policy.conf folgende (fett formatierte Elemente) hinzugefügt:
global:
%Vor%und unter audio_hw_modules
%Vor%Ich habe auch folgende (fett) zu AudioFlinger.cpp
hinzugefügt %Vor%Ich kann sehen, dass während des Bootens meine HAL geladen wird, und ich bekomme diese Logs:
%Vor%Meins ist audio_vloop. Ich kann sehen, dass Android mein Gerät öffnet, öffnet dann den Eingabestream und schließt dann den Eingabestream. Es versucht nie, den Ausgabestream zu öffnen. audio_vloop implementiert sowohl Eingabe- als auch Ausgabeströme. Danach wird nichts in audio_vloop jemals von Android aufgerufen.
Ich habe eine kleine App gemacht, die Audio abspielt (aus einer PCM-Datei für den Moment). Ich möchte diese Ausgabe an meine HAL umleiten. Um dies zu erreichen, muss ein AudioTrack.setPreferredDevice () auf meiner Audiospur ausgeführt werden. Ich habe festgestellt, dass Audio Manager eine Liste aller Audiogeräte haben sollte.
Ich rufe also an:
%Vor%Es findet nur 1 Gerät, weitere Informationen zu diesem Gerät:
%Vor%Dies ist scheinbar von AudioPort, die ich nicht implementiert habe. Also nicht von meiner HAL.
Ich habe offensichtlich einen oder mehrere Schritte verpasst, bevor Android meine App mit meinem Gerät sprechen lässt.
Ich muss in der Lage sein, Audio von meiner App in meine HAL zu senden. Später muss ich auch Audio von meiner HAL (über AudioRecord usw.) empfangen können.
Was habe ich bei der Integration meiner HAL in Android verpasst? Muss ich Audio-Ports implementieren? Ist etwas anderes erforderlich?
Update 2
Ich habe festgestellt, dass es in AOSP einen Tippfehler gibt, in AudioPolicyManager .cpp @ 2922
Anstelle von AUDIO_CHANNEL_OUT_STEREO
wird AUDIO_OUTPUT_FLAG_DIRECT
Ich hatte dieses Protokoll AudioPolicyManager.cpp
, das ich ignoriert habe, vorausgesetzt, es handelt sich um ein BT / A2DP-Eingabegerät.
Ich habe das Protokoll für mein Gerät korrigiert, und es stellt sich heraus, dass es sich um ein Line-Out-Gerät handelt, das wir verwenden möchten. Ich debugge jetzt diese Richtung.
Gefundene Antworten.
Für den Stream:
AudioManager.getDevices()
nicht unterstützen, werden nicht von Android geöffnet Ausgaben, die das Flag AudioTrack.setPreferredDevice()
erwähnen, werden von Android nicht automatisch geöffnet. Dies ist im folgenden Code in AUDIO_DEVICE_IN_BUILTIN_MIC
Es kann einen Weg geben, sie programmatisch zu öffnen, aber ich habe keine Antwort darauf gefunden.
Diese zwei, einmal behoben, waren ausreichend für Android, um meinen outstream zu benutzen.
Für den Stream:
Im Stream war bereits ein Teil der Ergebnisse von AUDIO_DEVICE_IN_BUILTIN_MIC
Es war also möglich, im Stream nach audio_policy.conf
von vloop zu lesen.
Um sicherzustellen, dass andere Anwendungen die Mikrofoneingabe von vloop lesen, musste ich sie zur Implementierung von %code% deklarieren. Damit dies funktioniert, habe ich auch %code% von der primären HAL in %code% entfernt.
Außerdem habe ich Stream in Stereo gemacht, um Kompatibilität mit dem Out-Stream-Pufferformat zu gewährleisten.
Nach diesen Änderungen sehe ich, dass fortlaufende Lese- und Schreibaufrufe zu vloop kommen.
UPDATE:
Ich habe später festgestellt, dass das oben erwähnte Verhalten von der Implementierung von Audio Policy Manager abhängig ist. Die meisten von ihnen verhalten sich gleich (z. B. am häufigsten öffnen INBUILT_MIC für VOICE_RECOGNITION Eingabe), aber einige nicht (Nexus Player) Für diese Ausreißer entweder implementieren, was ihre APMs öffnen, oder ändern APMs zu öffnen, was Ihre HAL implementiert.