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_DOWNLINK
was 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