Was ist erforderlich, damit Android eine neue Audio-HAL verwendet?

9

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

ausgegeben

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.

    
GPS 28.09.2016, 11:32
quelle

1 Antwort

4
___ qstntxt ___

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

ausgegeben

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.

    
___ tag123audio ___ Sound und Programmierung von Audio-Hardware und den verschiedenen Audio-Formaten oder Containern. Bei speziellen Fragen zur Tonwiedergabe verwenden Sie [Tonwiedergabe]. Für spezielle Fragen zur Tonaufnahme verwenden Sie [Tonaufnahme] oder [Tonaufnahme]. ___ tag123android ___ Android ist das mobile Betriebssystem von Google, das zum Programmieren oder Entwickeln von digitalen Geräten (Smartphones, Tablets, Automobile, Fernseher, Wear, Glass, IoT) verwendet wird. Verwenden Sie für Themen rund um Android Android-spezifische Tags wie android-intent, nicht intent, android-activity, nicht activity, android-adapter, nicht adapter usw. Bei anderen Fragen als der Entwicklung oder Programmierung, aber im Zusammenhang mit Android Framework, verwenden Sie Der Link: https://android.stackexchange.com. ___ tag123hal ___ Hardware-Abstraktionsschicht ___ answer39940341 ​​___

Gefundene Antworten.

Für den Stream:

  1. Ausgaben, die AudioManager.getDevices() nicht unterstützen, werden nicht von Android geöffnet
  2. 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

    ersichtlich %Vor%

    hier

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.

    
___ qstnhdr ___ Was ist erforderlich, damit Android eine neue Audio-HAL verwendet? ___
GPS 09.10.2016, 05:28
quelle

Tags und Links