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.
quelle
Antworten:
Es gibt mehrere mögliche Probleme, die mir in den Sinn kommen. Der leere Puffer zeigt möglicherweise an, dass Sie die falsche Quelle ausgewählt haben. Auch da laut https://developer.android.com/reference/android/media/AudioRecord.html#AudioRecord(int,%20int,%20int,%20int,%20int) Sie möglicherweise nicht immer eine Ausnahme erhalten, selbst wenn etwas passiert Wenn Sie mit der Konfiguration falsch sind, möchten Sie möglicherweise bestätigen, ob Ihr Objekt ordnungsgemäß initialisiert wurde. Wenn alles andere fehlschlägt, können Sie auch ein "mRecord.setPreferredDevice (AudioDeviceInfo.TYPE_BUILTIN_EARPIECE)" ausführen. um den eingebauten Ohrhörer des Telefons direkt an den Eingang Ihres Rekorders zu leiten. Ja, es ist ein bisschen schmutzig und hackig, aber vielleicht passt es zum Zweck.
Die andere Sache, die mich verwirrte, war, dass Sie anstelle der Builder-Klasse versucht haben, das Objekt direkt über seinen Konstruktor zu konfigurieren. 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 )?
quelle