Ich möchte das Android-Betriebssystem (offizielles Bild von AOSP) ändern, um einem normalen Wiedergabeton für Telefonanrufe eine Vorverarbeitung hinzuzufügen.
Ich habe diese Filterung für die App-Audiowiedergabe bereits erreicht (durch Ändern von HAL und Audioflinger ).
Ich kann nur ein bestimmtes Gerät (Nexus 5X) als Ziel festlegen. Außerdem muss ich nur die Wiedergabe filtern - die Aufnahme (Uplink) ist mir egal.
UPDATE # 1:
Um es klar zu machen: Ich bin damit einverstanden, Qualcomm-spezifische Treiber oder den Teil zu ändern, der auf dem Nexus 5X ausgeführt wird und mir bei der Änderung der Anrufwiedergabe helfen kann.
UPDATE 2:
Ich versuche, eine Java-Layer-App zu erstellen, die die Telefonwiedergabe in Echtzeit an den Musikstrom weiterleitet.
Es ist mir bereits gelungen, es als System-App zu installieren und Berechtigungen zum Initialisieren AudioRecord
mit zu erhalten AudioSource.VOICE_DOWNLINK
. Die Aufzeichnung liefert jedoch leere Proben; Der Sprachanruf wird nicht aufgezeichnet.
Dies ist der Code in meinem Arbeitsthread:
// 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 AOSP-ROM, Android 7.1.1. Ich muss den Ort finden, an dem die Anrufaufzeichnung funktioniert - wahrscheinlich irgendwo hardware/qcom/audio/hal
im Plattformcode.
Ich habe mir auch die Funktion voice_check_and_set_incall_rec_usecase
unter angesehen hardware/qcom/audio/hal/voice.c
. Ich konnte sie jedoch nicht verstehen (wie man sie so funktioniert, wie ich es möchte).
UPDATE 3:
Ich habe eine spezifischere Frage zur Verwendung geöffnet AudioSource.VOICE_DOWNLINK
, die möglicherweise die richtige Aufmerksamkeit auf sich zieht und mir schließlich auch bei der Lösung des Problems dieser Frage helfen wird.