Ändern der Sprachwiedergabe während des Anrufs im benutzerdefinierten Android-ROM

Lesezeit: 4 Minuten

Benutzer-Avatar
SirKnigget

Ich möchte das Android-Betriebssystem (offizielles Bild von AOSP) ändern, um eine Vorverarbeitung zu einem normalen Wiedergabeton für Telefonanrufe hinzuzufügen.

Ich habe diese Filterung bereits für die App-Audiowiedergabe erreicht (durch Modifizieren HAL und Audioflinger).

Ich kann nur auf ein bestimmtes Gerät (Nexus 5X) abzielen. Außerdem muss ich nur die Wiedergabe filtern – die Aufnahme (Uplink) ist mir egal.

UPDATE Nr. 1:

Um es klar zu sagen: Ich bin damit einverstanden, Qualcomm-spezifische Treiber oder den Teil, der auf Nexus 5X läuft, zu modifizieren und mir dabei zu helfen, die Wiedergabe während des Anrufs zu modifizieren.

UPDATE Nr. 2:

Ich versuche, eine Java-Layer-App zu erstellen, die die Telefonwiedergabe in Echtzeit an den Musikstream weiterleitet.

Es ist mir bereits gelungen, es als System-App zu installieren und Berechtigungen zum Initialisieren zu erhalten AudioRecord mit AudioSource.VOICE_DOWNLINK. Die Aufnahme liefert jedoch Leerproben; es zeichnet den Sprachanruf nicht auf.

Dies ist der Code in meinem Worker-Thread:

// Start recording
int recBufferSize = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT);
mRecord = new AudioRecord(MediaRecorder.AudioSource.VOICE_DOWNLINK, 44100, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT, recBufferSize);

// Start playback
int playBufferSize = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT);
mTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT, playBufferSize, AudioTrack.MODE_STREAM);

mRecord.startRecording();;
mTrack.play();

int bufSize = 1024;
short[] buffer = new short[bufSize];
int res;
while (!interrupted())
{
    // Pull recording buffers and play back
    res = mRecord.read(buffer, 0, bufSize, AudioRecord.READ_NON_BLOCKING);
    mTrack.write(buffer, 0, res, AudioTrack.WRITE_BLOCKING);
}

// Stop recording
mRecord.stop();
mRecord.release();
mRecord = null;

// Stop playback
mTrack.stop();
mTrack.release();;
mTrack = null;

Ich verwende ein Nexus 5X, mein eigenes benutzerdefiniertes AOSP-ROM, Android 7.1.1. Ich muss den Ort finden, an dem die Anrufaufzeichnung funktioniert – wahrscheinlich irgendwo in hardware/qcom/audio/hal im Plattformcode.

Außerdem habe ich mir die Funktion angeschaut voice_check_and_set_incall_rec_usecase bei hardware/qcom/audio/hal/voice.c Ich war jedoch nicht in der Lage, einen Sinn daraus zu machen (wie ich es so arbeiten lassen kann, wie ich es möchte).

UPDATE Nr. 3:

Ich habe eine spezifischere Frage zur Verwendung geöffnet AudioSource.VOICE_DOWNLINKwas die richtige Aufmerksamkeit erregen könnte und mir schließlich helfen wird, auch das Problem dieser Frage zu lösen.

  • Das wollte ich machen. Nur damit es den Anruf auf Schlüsselwörter überwacht und dann Ton in den Anruf einspeist. Wie ich “Golf” sage und dann wird ein Golf-Clap-Sound in den Anruf eingefügt.

    – danny117

    22. Februar 2017 um 17:38 Uhr

  • Ich bezweifle, dass das Modifizieren von Standard-I/O möglich ist, ohne mit ndk-jni zu spielen

    – Parath

    5. Mai 2017 um 14:41 Uhr

  • Ich spreche davon, ein benutzerdefiniertes ROM zu erstellen, keine normale App.

    – SirKnigget

    5. Mai 2017 um 20:25 Uhr

  • IIRC, ein Telefonanruf wird als vertrauliche Information betrachtet und offene Software hat keinen Zugriff darauf. Sie müssten die als „Radio“ bekannte Closed-Source-Firmware hacken. Wahrscheinlich nicht machbar.

    – Zdenek

    15. August 2017 um 19:14 Uhr

  • Das ist nicht wahr. Es gibt eine Anrufaufzeichnungs-API und unzählige Apps, die ihren Weg gefunden haben, sie mit verschiedenen Hacks auf vielen Geräten zu verwenden.

    – SirKnigget

    16. August 2017 um 3:28 Uhr

Es gibt mehrere mögliche Probleme, die mir in den Sinn kommen. Der leere Puffer kann darauf hindeuten, dass Sie die falsche Quelle ausgewählt haben. Auch da gem https://developer.android.com/reference/android/media/AudioRecord.html#AudioRecord(int,%20int,%20int,%20int,%20int) Möglicherweise erhalten Sie nicht immer eine Ausnahme, selbst wenn etwas mit der Konfiguration nicht stimmt. Möglicherweise möchten Sie bestätigen, ob Ihr Objekt ordnungsgemäß initialisiert wurde. Wenn alles andere fehlschlägt, können Sie auch ein “mRecord.setPreferredDevice(AudioDeviceInfo.TYPE_BUILTIN_EARPIECE);” um den eingebauten Hörer des Telefons direkt an den Eingang Ihres Rekorders zu leiten. Ja, es ist ein bisschen schmutzig und abgedroschen, aber vielleicht passt es zum Zweck.

Die andere Sache, die mich verwirrte, war, dass Sie versucht haben, das Objekt direkt über seinen Konstruktor zu konfigurieren, anstatt die Builder-Klasse zu verwenden. Gibt es einen bestimmten Grund, warum Sie AudioRecord.Builder nicht verwenden möchten (es gibt sogar ein schönes Beispiel unter https://developer.android.com/reference/android/media/AudioRecord.Builder.html ) stattdessen?

  • Alle von Ihnen angesprochenen Punkte wurden geprüft, dies steht in keinem Zusammenhang. Die Builder-Klasse ist zwar aktueller, geht aber intern genau an die gleiche Stelle (siehe Android-Quellcode).

    – SirKnigget

    31. Januar 2018 um 19:31 Uhr


  • Das Anschließen an die Funktion der Quelle des eingebauten Ohrhörers hat also auch nicht als Problemumgehung funktioniert?

    – CoolKoon

    1. Februar 2018 um 21:28 Uhr

  • Nein. Es hat nichts mit dem zugrunde liegenden Problem zu tun.

    – SirKnigget

    1. Februar 2018 um 22:14 Uhr

1270870cookie-checkÄndern der Sprachwiedergabe während des Anrufs im benutzerdefinierten Android-ROM

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy